基于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变换,因为它们很好,简单,易于使用和理解。这有用吗?