基于openCV的等高线直线检测 我刚刚开始使用C++的OpenCV,需要做一些矩形的边缘检测。

基于openCV的等高线直线检测 我刚刚开始使用C++的OpenCV,需要做一些矩形的边缘检测。,c++,opencv,edge-detection,opencv-contour,C++,Opencv,Edge Detection,Opencv Contour,这是我用于测试的图像: 这是我通过使用阈值(THRESH\u BINARY)得到的结果: 使用此代码,我会说它大约正确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

这是我用于测试的图像:

这是我通过使用阈值(
THRESH\u BINARY
)得到的结果:

使用此代码,我会说它大约正确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 );
}
void find_等高线(Mat src)
{
int最大面积=0;
int最大轮廓指数=0;
矩形边界;
Mat-thr;
cvtColor(src、thr、COLOR_bgr2灰色);//转换为灰色
阈值(thr,thr,175,255,THRESH_BINARY);//灰度阈值
imshow(“二进制”,thr);
矢量轮廓;//用于存储轮廓的矢量
findContours(thr、等高线、RETR\u CCOMP、CHAIN\u Abrox\u SIMPLE);//在图像中查找等高线
对于(size_t i=0;i最大面积)
{
最大面积=面积;
最大轮廓指数=i;//存储最大轮廓指数
bounding_rect=boundingRect(轮廓[i]);//查找最大轮廓的边界矩形
}
}
drawContours(src,等高线,最大等高线索引,标量(0,255,0),2);//使用以前存储的索引绘制最大等高线。
imshow(“结果”,src);
}
我想去掉右边的“错误”,然后沿着每条边绘制多段线,找到它们的交点(卡片角),这样我就可以进行透视变换

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

我愿意接受任何建议


谢谢你抽出时间

我将尝试以下方法:

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

  • 从拐角处,可以得到边的近似值

  • 在每条边(倾斜矩形)周围放置一个合适的ROI,并将其拉直,使边接近水平

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


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

是否需要扩展您的技术以支持其他图像?因为很明显,在某些背景下,阈值设置不太合适。通常情况下,卡片是白色的,背景是桌子(浅棕色)。我尝试过各种代码片段,阈值化得到了最好的结果。这很公平。最近我一直在使用彩色模型,这里有一些简单的模型可能很有用,但如果阈值设置足以满足您的需要,我就不想再讨论它们了。如果您能为我提供一些参考资料,我愿意学习;)一次解决一个问题。无论如何,我的第一个想法是使用Hough变换,因为它们很好,简单,易于使用和理解。这有用吗?