用openCV检测轮廓中的直线

时间:2017-05-24 14:31:03

标签: c++ opencv edge-detection opencv-contour

我刚开始使用openCV和c ++,我需要做一些矩形边缘检测。

这是我用于测试的图片: enter image description here

这是我通过阈值处理(THRESH_BINARY)获得的结果:enter image description here

使用此代码我说它约90%正确:

void find_contour(Mat src)
{
    int largest_area=0;
    int largest_contour_index=0;
    Rect bounding_rect;

    Mat thr;
    cvtColor( src, thr, COLOR_BGR2GRAY ); //Convert to gray
    threshold( thr, thr, 175 , 255, THRESH_BINARY ); //Threshold the gray

    imshow("Binary", thr);

    vector<vector<Point> > contours; // Vector for storing contours

    findContours( thr, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE ); // Find the contours in the image

    for( size_t i = 0; i< contours.size(); i++ ) // iterate through each contour.
    {
        double area = contourArea( contours[i] );  //  Find the area of contour

        if( area > largest_area )
        {
            largest_area = area;
            largest_contour_index = i;               //Store the index of largest contour
            bounding_rect = boundingRect( contours[i] ); // Find the bounding rectangle for biggest contour
        }
    }

    drawContours( src, contours, largest_contour_index, Scalar( 0, 255, 0 ), 2 ); // Draw the largest contour using previously stored index.

    imshow( "result", src );
}

我想摆脱错误&#39;在右侧,然后沿每条边绘制折线,找到它们的交点(卡角),这样我就可以进行透视变换。

实现这一目标的最佳方法是什么?

我愿意接受任何建议。

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

我会尝试如下:

  • 大致找到角落;这可以通过查找八个主要基本方向中最远的轮廓像素,给出一个八边形(加上一些逻辑来选择正确的四个点)来完成;

  • 从角落,你得到了近似的边;

  • 在每个边缘(倾斜的矩形)周围放置适当的ROI并将其拉直以使边缘接近水平;

  • 在ROI中使用Hough变换,最好仅在垂直梯度上使用。一点水平模糊也可以提供帮助。

使用这些ROI的目的是减少错误检测的可能性并使检测方向敏感。