В настоящее время я переписываю программу 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 и буду благодарен за любой указатель в правильном направлении.
cv::convexHull
, вы узнаете, что в качестве входных данных используется точка, а не изображение. Существует множество примеров использования этой функции, в том числе, как извлечь границу бинарных объектов на изображении. - person Cris Luengo   schedule 27.05.2018convexHull()
в точках контура. В качестве альтернативы вы можете просто получить ненулевые индексы для двоичного изображения и протолкнуть их. - person alkasm   schedule 27.05.2018