我刚开始使用openCV和c ++,我需要做一些矩形边缘检测。
这是我通过阈值处理(THRESH_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 );
}
我想摆脱错误&#39;在右侧,然后沿每条边绘制折线,找到它们的交点(卡角),这样我就可以进行透视变换。
实现这一目标的最佳方法是什么?
我愿意接受任何建议。
感谢您的时间!
答案 0 :(得分:0)
我会尝试如下:
大致找到角落;这可以通过查找八个主要基本方向中最远的轮廓像素,给出一个八边形(加上一些逻辑来选择正确的四个点)来完成;
从角落,你得到了近似的边;
在每个边缘(倾斜的矩形)周围放置适当的ROI并将其拉直以使边缘接近水平;
在ROI中使用Hough变换,最好仅在垂直梯度上使用。一点水平模糊也可以提供帮助。
使用这些ROI的目的是减少错误检测的可能性并使检测方向敏感。