【问题标题】:Get rectangular contours from image从图像中获取矩形轮廓
【发布时间】:2019-08-15 16:36:03
【问题描述】:

如何从黑色背景的图像中提取所有矩形轮廓?

我想得到底部的黑色矩形(里面有一些白色文字)

在代码中,我尝试通过cv::RETR_EXTERNAL 获取具有4 个角的所有轮廓,但它仅将整个图像获取为一个大轮廓?我做错了什么?

std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(img, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);

for(int i = 0; i < contours.size(); i++){
    std::cout << "contour found" << std::endl;

    std::vector<cv::Point> approx;
    cv::approxPolyDP(contours[i], approx, cv::arcLength(contours[i], true) * 0.02, true);

    if(!cv::isContourConvex(approx)){
        continue;
    }

    if(approx.size() == 4){
        cv::rectangle(img, cv::boundingRect(contours[i]), cv::Scalar(0, 255, 0), 2);
    }
}

cv::imwrite("img.png", img);

【问题讨论】:

  • 如果你的图像总是这样,那么你可以通过计算黑色和非黑色像素的比率来过滤掉轮廓。还将 findcontours 函数限制为图像的下半部分或下 1/3,以获得更快的结果。
  • 图片总是不同的,所以你不能这样做:)
  • 您过去曾问过其中几个问题,而 IMO 您并不真正关心如何通过讨论一些似是而非的结果或帮助回答/评论您的问题的人来获得结果,但是只是最终的结果。如果不重新评估您以前得到的答案,我真的不认为一次又一次地提出相同的问题有什么意义
  • @RickM。我没有足够的 opencv(或 C++)经验,无法将一些代码从简单的描述和理论中组合起来
  • 如果我需要一些帮助来将一些代码放在一起,我只会得到我必须自己做的回应......我不能......

标签: c++ opencv


【解决方案1】:

发现我需要先反转图像才能使用cv::RETR_EXTERNAL

img_inv = 255 - img;

【讨论】:

    【解决方案2】:

    你使用了错误的标志:

    cv::RETR_EXTERNAL :如果你使用这个标志,它只返回极端的外部标志。所有子轮廓都被留下

    https://docs.opencv.org/3.4.3/d9/d8b/tutorial_py_contours_hierarchy.html

    你应该使用 cv::RETR_LIST,因为你需要所有的轮廓而不需要层次结构。

    【讨论】:

    • 我发现我需要先反转图像才能工作。但你提到要获得轮廓的黑白比例。你将如何计算比例? :)
    猜你喜欢
    • 2012-05-10
    • 2019-01-26
    • 1970-01-01
    • 2021-05-05
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多