尝试使用查找轮廓检测矩形

时间:2016-06-22 11:33:59

标签: c++ opencv computer-vision

我正在尝试使用查找轮廓检测矩形,但我没有从下图中获得任何轮廓。

我无法检测到图像中的任何轮廓。下面的图像是否发现轮廓不好,或者我应该使用霍夫变换。

更新:我已更新源代码以使用近似多边形。

但是我仍然得到了outlier的矩形,我无法找到屏幕截图中最小的矩形。

enter image description here

我还有另一个案例,即使加入侵蚀或扩张,它目前的解决方案也不起作用。

image 2

这是代码

using namespace cm;
    using namespace cv;
    using namespace std;


    cv::Mat input = cv::imread("heightmap.png");
    RNG rng(12345);
    // convert to grayscale (you could load as grayscale instead)
    cv::Mat gray;
    cv::cvtColor(input,gray, CV_BGR2GRAY);


    // compute mask (you could use a simple threshold if the image is always as good as the one you provided)
    cv::Mat mask;
    cv::threshold(gray, mask, 0, 255,CV_THRESH_OTSU);

    cv::namedWindow("threshold");
    cv::imshow("threshold",mask);

    // find contours (if always so easy to segment as your image, you could just add the black/rect pixels to a vector)
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(mask,contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    cv::Mat drawing = cv::Mat::zeros( mask.size(), CV_8UC3 );

    vector<vector<cv::Point> > contours_poly( contours.size() );
    vector<vector<cv::Point> > ( contours.size() );
    vector<cv::Rect> boundRect( contours.size() );
    for( int i = 0; i < contours.size(); i++ )
    {
        approxPolyDP( cv::Mat(contours[i]), contours_poly[i], 3, true );
        boundRect[i] = boundingRect( cv::Mat(contours_poly[i]) );
    }

     for( int i = 0; i< contours.size(); i++ )
    {
        cv::Scalar color = cv::Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
        rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );

    }

    // display
    cv::imshow("input", input);
    cv::imshow("drawing", drawing);
    cv::waitKey(0);

1 个答案:

答案 0 :(得分:0)

您使用的代码类似于this question

它使用BinaryInv阈值,因为它在白色背景上检测到黑色形状。

您的示例恰恰相反,因此您应该调整代码以使用Binary阈值类型(或取消图像)。

如果没有此修复,FindContours将检测图像的周边,这将是最大的轮廓。

所以我认为代码不能检测轮廓,而不是你期望的“最大轮廓”。

即使已修复,您发布的代码也不适合示例图像中矩形的矩形,因为最明显的矩形特征没有干净的边框。链接问题中的approxPolyDP建议可能有所帮助,但您必须改进源图像。

请参阅this question以查找此方法和Hough方法以查找矩形。

修改

您应该能够通过调用Erode(3x3)两次将示例图像中的矩形与其他blob分开。

您必须选择最平方来替换选择最大轮廓。