OpenCV выпуклый корпус не дает правильный вывод

Это мое входное двоичное изображение:

введите описание изображения здесь

Теперь я хочу получить его выпуклую оболочку с помощью OpenCV. Для этого я написал следующий код:

cv::Mat input = cv::imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::vector<cv::vector<cv::Point>> contours;
cv::vector<cv::Vec4i> hierarchy;

// Find contours
cv::findContours(input, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

// Find the convex hull
cv::vector<cv::vector<cv::Point>> hull(contours.size());
for(int i = 0; i < contours.size(); i++)
{
cv::convexHull(cv::Mat(contours[i]), hull[i], false);
}

cv::Mat drawing = cv::Mat::zeros(input.size(), CV_8UC3);
cv::Scalar color = cv::Scalar(0, 0, 255);
for (int j  = 0; j < hull.size(); j++)
{
cv::drawContours(drawing, hull, j, color, 1, 8, cv::vector<cv::Vec4i>(), 0, cv::Point());
}

cv::imshow("Convex hull", drawing);
cv::waitKey();

И это вывод:

введите описание изображения здесь

В Matlab, однако, когда я пишу следующий код:

input = imread('input.jpg');
[x, y] = find(input);
k = convhull(x, y);
plot(y(k), x(k), 'r-', y, x, 'b.');

Это дает мне именно то, что я хочу (красная линия представляет желаемую выпуклую оболочку):

введите описание изображения здесь

Итак, как я могу получить тот же результат в OpenCV? Что я должен был сделать неправильно здесь? Спасибо.

0

Решение

Может быть, этот ответ уже поздно, но для тех, кто все еще находится в поиске, вот он.

Вам не нужно принимать контуры. Просто возьмите все ненулевые точки из двоичного изображения, используя метод findNonZero (), а затем примените выпуклыйHull к этому набору точек. Это будет работать отлично.

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector