gpt4 book ai didi

c++ - 通过内部颜色过滤OpenCV轮廓

转载 作者:行者123 更新时间:2023-12-02 10:15:21 26 4
gpt4 key购买 nike

我在用颜色过滤某些轮廓时遇到问题。我要删除所有内部具有黑色像素的轮廓,并仅保留具有白色像素的轮廓(请参见下图)。

创建轮廓列表的代码。我将RETR_TREE轮廓检索模式与CHAIN_APPROX_SIMPLE点选择一起使用,以避免轮廓内有很多点。

cv::cvtColor(src_img, gray_img, cv::COLOR_BGR2GRAY);
cv::threshold(gray_img, bin_img, minRGB, maxRGB, cv::THRESH_BINARY_INV);

std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;

cv::findContours(bin_img, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);

然后,使用这些轮廓,我建立了封闭的路径并将其显示在屏幕上。

输入图像:

Input image

当前我的结果:

current result

我需要的。仅填充具有白色内容的轮廓。

enter image description here

我尝试将所有轮廓缩放到内部1个像素,并检查所有像素是否都等于暗,但是它没有按我预期的那样工作。请参见下面的代码。
double scaleX = (double(src_img.cols) - 2) / double(src_img.cols);
double scaleY = (double(src_img.rows) - 2) / double(src_img.rows);

for (int i = 0; i < contours.size(); i++) {
std::vector<cv::Point> contour = contours[i];

cv::Moments M = cv::moments(contour);

int cx = int(M.m10 / M.m00);
int cy = int(M.m01 / M.m00);

std::vector<cv::Point> scaledContour(contour.size());

for (int j = 0; j < contour.size(); j++) {
cv::Point point = contour[j];
point = cv::Point(point.x - cx, point.y - cy);
point = cv::Point(point.x * scaleX, point.y * scaleY);
point = cv::Point(point.x + cx, point.y + cy);
scaledContour[j] = point;
}

contours[i] = scaledContour;
}

如果您能提供任何想法或解决方案,我将非常感谢,非常感谢!

最佳答案

希望有一件事很清楚,当使用THRESH_BINARY_INV查找轮廓时,图像中的对象应为白色,背景为黑色。

因此,我们实质上是在寻找白线而不是黑线。当我在python中工作时,我没有提供代码,但我将列出它的完成方式。

  • 创建一个输入图像大小的黑色数组。我们称它为mask
  • 找到轮廓后,在提供mask的同时,将其绘制在带有白色(即255)的thickness=-1上。这意味着我们实际上是在填充轮廓。
  • 现在,我们需要删除轮廓的边界,以便剩下的唯一部分是轮廓内部的部分。这可以通过再次在mask上绘制轮廓来实现,这次使用厚度为1的黑色绘制。
  • 在图像和蒙版之间执行bitwise_and。轮廓内只剩下白色的区域。

  • 现在,您只需要查看输出是否为全黑即可。如果不是,则意味着您不需要填充该轮廓,因为它内部包含某些内容。

    编辑

    哦,我没有意识到您的图像将具有600个轮廓,是的,这将花费很多时间,而且我不知道为什么以前没有考虑过使用 hierarchy

    您可以使用 RETR_TREE本身,层次结构值为 [next, previous, first_child, parent]。因此,我们只需要检查 first_child=-1的值是否意味着里面没有轮廓即可填充它。

    关于c++ - 通过内部颜色过滤OpenCV轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62179977/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com