Репликация bwconvhull Matlab в OpenCV

В настоящее время я переписываю программу Matlab в OpenCV и не могу найти эквивалент функции bwconvhull.

Код Matlab делает следующее:

H = bwconvhull(W>0.5);

Где W — матрица со значениями с плавающей запятой (которая была рассчитана по нескольким картам расстояний в предыдущей части алгоритма).

Я успешно нашел способ вычислить W в OpenCV, в результате чего cv::Mat с типом 32FC1.

Моя первая попытка использовала прямой перевод:

cv::convexHull(w>0.5, h);

Это приводит к сбою со следующим исключением:

OpenCV(3.4.1) \opencv\modules\imgproc\src\convhull.cpp:137: 
error: (-215) total >= 0 && (depth == 5 || depth == 4) 
in function cv::convexHull

Я проверил исходный код и обнаружил, что проблема связана с типом Mat (оператор > производит 8U мат, в то время как алгоритм, похоже, поддерживает только 32F и 32S). Итак, я попробовал преобразование:

cv::Mat w2;
w = (w > 0.5);
w.convertTo(w2, CV_32F);
cv::convexHull(w2, h);

Но теперь проблема переходит к состоянию total >= 0, где total равно w.checkVector(2). Я не могу понять, как добиться того, чтобы это условие было верным.

Я также пробовал следующий подход с тем же результатом:

cv::Mat w2 = w * ( w > 0.5 );
cv::convexHull(w2, h);

В других моих попытках участвовали cv::threshold и cv::findContours, но они потерпели неудачу аналогичным образом.

Я действительно неопытен в OpenCV и буду благодарен за любой указатель в правильном направлении.


person Martin Zikmund    schedule 26.05.2018    source источник
comment
Если вы прочитали документацию по cv::convexHull, вы узнаете, что в качестве входных данных используется точка, а не изображение. Существует множество примеров использования этой функции, в том числе, как извлечь границу бинарных объектов на изображении.   -  person Cris Luengo    schedule 27.05.2018
comment
Комментарий выше правильный. Вы можете сначала найти контуры объекта, а затем запустить convexHull() в точках контура. В качестве альтернативы вы можете просто получить ненулевые индексы для двоичного изображения и протолкнуть их.   -  person alkasm    schedule 27.05.2018
comment
CrisLuengo и AlexanderReynolds, спасибо, что указали мне правильное направление, я следовал приведенному здесь образцу и все заработало - docs.opencv.org/2.4/doc/tutorials/imgproc/ shapedescriptors/hull/   -  person Martin Zikmund    schedule 28.05.2018


Ответы (1)


@CrisLuengo и @AlexanderReynolds указали мне правильное направление, большое спасибо вам обоим.

Чего мне не хватало, так это шага findContours, чтобы сначала получить контуры изображения и только потом запустить его через функцию convexHull. Я попробовал вызов findContours перед тем, как задать вопрос, но, должно быть, неправильно выбрал аргументы. Чтобы заставить его работать, я в основном воспроизвел пример кода здесь. .

person Martin Zikmund    schedule 28.05.2018