从图像获取矩形轮廓

时间:2019-03-25 12:26:12

标签: c++ opencv

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

我想在底部获得黑色矩形(内部带有一些白色文本)

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

enter image description here

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);

enter image description here

2 个答案:

答案 0 :(得分:1)

发现我需要反转图像才能使用SELECT UNIX_TIMESTAMP(NOW() - INTERVAL 6 MINUTE) > UNIX_TIMESTAMP(NOW() - INTERVAL 5 MINUTE) AS "is 6 minutes ago \"newer\" ?"; | is 6 minutes ago "newer" ? | | -------------------------- | | 0 |

cv::RETR_EXTERNAL

答案 1 :(得分:0)

您使用了错误的标志:

cv :: RETR_EXTERNAL:如果使用此标志,则仅返回极端的外部标志。所有子轮廓都被留下

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

您应该使用cv :: RETR_LIST,因为您需要所有轮廓并且不需要层次结构。