这是我输入的二进制图像:
现在,我想使用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中获得相同的结果?我在这里应该做错什么?谢谢。
最佳答案
也许这个答案来晚了,但是对于那些仍在搜索中的人来说,它确实是。
您无需绘制轮廓。只需使用findNonZero()方法从二进制图像中获取所有非零点,然后将凸包应用于该点集。它将完美运行。
关于c++ - OpenCV凸包未提供正确的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30660989/