Репликация Matlab's bwconvhull в OpenCV - PullRequest
0 голосов
/ 27 мая 2018

В настоящее время я переписываю программу 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

Iпроверили исходный код и выяснили, что проблема в типе Mat - (оператор > производит 8U mat, в то время как алгоритм поддерживает только 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 и буду благодарен за любой указатель в правильном направлении.

1 Ответ

0 голосов
/ 28 мая 2018

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

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

...