2015-04-24 2 views
2

В соответствии с документацией Shapes ввод может быть либо в виде изображений, либо в виде серого масштаба. Но когда я попробовал два изображения с серой шкалой, я получил ошибку с ошибкой утверждения. При дальнейшем исследовании, я нашел из here, что объект Мат должен быть вектором 1D и типа CV_32FC2 или CV_32SC2.matchShapes, используя полутоновые изображения opencv

Используя this ответ, я преобразовал изображения в векторный массив поплавка после их преобразований в CV_32FC2. Я все еще получаю ошибку утверждения.

Может ли кто-нибудь сказать мне, как я могу сравнить 2 изображения в оттенках серого с помощью matchShapes function?

UPDATE

сообщение об ошибке

OpenCV Error: Assertion failed (contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0 && (contour1.depth() == CV_32F || contour1.depth() == CV_32S) && contour1.depth() == contour2.depth()) in matchShapes, file /home/tonystark/Opencv/modules/imgproc/src/contours.cpp, line 1936 
    terminate called after throwing an instance of 'cv::Exception' 
    what(): /home/tonystark/Opencv/modules/imgproc/src/contours.cpp:1936: error: (-215) contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0 && (contour1.depth() == CV_32F || contour1.depth() == CV_32S) && contour1.depth() == contour2.depth() in function matchShapes 

, когда я использовал

pkg-config --modversion opencv 

это говорит о версии, 2.4.9

+0

какая версия OpenCV вы используете? Каково сообщение об ошибке утверждения? – alrikai

+0

см правки. @alrikai –

ответ

1

Если мы нарушаем сообщение утверждение вниз , он проверяет несколько вещей -

  1. contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0
  2. contour1.depth() == CV_32F || contour1.depth() == CV_32S
  3. contour1.depth() == contour2.depth()

Это звучит, как вы знаете из частей 2 и 3 выше, поэтому я рискну предположить, что это неисправного на части 1.

Согласно документации OpenCV, checkVector это функция, которая

возвращает N, если матрица представляет собой 1-канал (N х ptdim) или ptdim-канала (1 х N), или (N × 1); отрицательное число иначе

Это, к сожалению, довольно загадочное сообщение. Насколько я понимаю, он проверяет размерность входного измерения - в этом случае провальное утверждение проходит в 2 и проверяет, что его размер больше 0. Это исключает возможность наличия пустого массива и проверяет, существует другое измерение. TLDR; он проверяет, является ли входным массивом 1D достаточного размера.

Я предполагаю, что ваша ошибка является результатом прохождения в векторе вектора точек - вместо этого, вы должны пройти в одной «формы» в то время, чтобы matchShapes, т.е. вектор точек

вот небольшой тест-случай, который, хотя и не особенно интересно, должны работать без проблем -

#include <cstdlib> 
#include <ctime>  
#include <iostream> 
#include <vector> 
#include <opencv2/opencv.hpp> 

int main(int argc, char* argv[]) { 

    std::srand(std::time(0)); 

    std::vector<cv::Point> random_pointsA; 
    for (int i = 0; i < 1000; ++i) { 
     auto rand_x = std::rand() % 255; 
     auto rand_y = std::rand() % 255; 
     random_pointsA.emplace_back(rand_x, rand_y); 
    } 

    std::vector<cv::Point> random_pointsB; 
    for (int i = 0; i < 1000; ++i) { 
     auto rand_x = std::rand() % 255; 
     auto rand_y = std::rand() % 255; 
     random_pointsB.emplace_back(rand_x, rand_y); 
    } 

    auto match_val = cv::matchShapes(random_pointsA, random_pointsB, CV_CONTOURS_MATCH_I1, 0); 
    std::cout << "match val: " << match_val << std::endl; 
} 
+0

ли matchShapes() на самом деле - как заявлено в документации - взять изображение в качестве входных данных? – jtlz2