Проблема с drawContours OpenCV C++

У меня есть код на Python, и я портирую его на C++. У меня странная проблема с drawContours функция в OpenCV C++.

self.contours[i] = cv2.convexHull(self.contours[i])
cv2.drawContours(self.segments[object], [self.contours[i]], 0, 255, -1)

это вызов функции в python, а значение -1 для параметра толщины используется для заполнения контура, а результат выглядит следующим образом

похоже

Я делаю то же самое в C++,

cv::convexHull(cv::Mat(contour), hull);
cv::drawContours(this->objectSegments[currentObject], cv::Mat(hull), -1, 255, -1);

но это результирующее изображение:

образ

(пожалуйста, посмотрите внимательно, чтобы увидеть convexhull точки, это не так легко увидеть). Я получаю только очки, а не заполненный многоугольник. Я также пытался использовать fillPoly лайк,

cv::fillPoly(this->objectSegments[currentObject],cv::Mat(hull),255);

но не помогает Пожалуйста, помогите мне в решении проблемы. Я уверен, что мне не хватает чего-то очень тривиального, но я не могу этого заметить.

1 ответ

Решение

Функция drawContours() ожидает получения последовательности контуров, каждый из которых является "вектором точек".

Выражение cv::Mat(hull) Вы используете в качестве параметра возвращает матрицу в неверном формате, каждая точка обрабатывается как отдельный контур - поэтому вы видите только несколько пикселей.

Согласно документации cv::Mat::Mat(const std::vector<_Tp>& vec) вектор, переданный в конструктор, используется следующим образом:

Вектор STL, элементы которого образуют матрицу. Матрица имеет один столбец, а количество строк равно количеству векторных элементов.

Учитывая это, у вас есть два варианта:

  • Транспонировать созданную вами матрицу (используя cv::Mat::t()
  • Просто используйте вектор векторов Points напрямую

В следующем примере показано, как использовать вектор напрямую:

cv::Mat output_image; // Work image

typedef std::vector<cv::Point> point_vector;
typedef std::vector<point_vector> contour_vector;

// Create with 1 "contour" for our convex hull
contour_vector hulls(1);

// Initialize the contour with the convex hull points
cv::convexHull(cv::Mat(contour), hulls[0]);

// And draw that single contour, filled
cv::drawContours(output_image, hulls, 0, 255, -1);
Другие вопросы по тегам