Проблема с 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);