vendredi 24 juin 2016

trying to detect a rectangle using find contours


I am trying to detect a rectangle using find contours, but I don't get any contours from the following image.

I cant detect any contours in the image. Is find contours is bad with the following image, or should I use hough transform.

UPDATE: I have updated the source code to use approximated polygon.

but I still I get the outlier bounding rect, I cant find the smallest rectangle that is in the screenshot.

enter image description here

and here is the code

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

Aucun commentaire:

Enregistrer un commentaire