【问题标题】:OpenCV convexhull doesn't give correct outputOpenCV 凸包没有给出正确的输出
【发布时间】:2015-08-20 01:50:52
【问题描述】:

这是我输入的二进制图像:

现在我想使用 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 中获得相同的结果?我应该在这里做错了什么?谢谢你。

【问题讨论】:

  • j,而不是 drawContours() 中的 i。 (那曾经是怎么编译的?)
  • 对不起,这是我的错字。
  • 那你还有wrong image吗?为我工作。
  • 是的,输出当然是一样的。我在这里写我的问题时犯了那个错字。
  • 这对你有什么帮助?你使用的是相同的图片和代码吗?

标签: c++ image matlab opencv convex-hull


【解决方案1】:

这个答案可能是迟到了,但对于那些仍在寻找的人来说。

你不需要画轮廓。只需使用 findNonZero() 方法从二进制图像中获取所有非零点,然后将 convexHull 应用于该点集。它会完美运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2020-05-06
    相关资源
    最近更新 更多