当我使用opencv检测带圆角的矩形时,我需要解决问题。基本上我使用的是相同的代码示例squares.c:
cvFindContours( gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE );
while( contours )
{
double area=fabs(cvContourArea(contours, CV_WHOLE_SEQ));
if(area < minimum_area || area > maximum_area) {
contours = contours->h_next;
continue;
}
result = cvApproxPoly( contours, sizeof(CvContour), storage,
CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.05, 0 );
if( result->total == 4 &&
fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 &&
cvCheckContourConvexity(result) )
{
使用此代码我通常可以检测图像,但我需要调整图像的透视图,为此我需要检测图像的角落,如何做到这一点,图像有圆角?出现问题的原因是我不需要在点之间检测到点,例如,我创建了下面的图像,其中黑线表示现有代码检测到的点,蓝点是我需要的点?
感谢您的帮助。
答案 0 :(得分:2)
在OpenCV术语中,首先使用带有FindContours
和RETR_EXTERNAL
的{{1}}找到黑色矩形。现在,您可以在CHAIN_APPROX_SIMPLE
找到的点上使用minAreaRect
找到此圆角矩形的最小边界框。要获取此边界框的角,请在FindContours
的返回(中心,(宽度,高度),旋转角度)上使用函数BoxPoints
。现在你有了你所追求的红线的四个角落。
答案 1 :(得分:0)
尝试通过cvResize命令将图像缩放到较小的尺寸,并将该代码应用于它。理论上减小图像尺寸应该锐化图像角落并减少您的问题,但代价是会失去精度。
答案 2 :(得分:0)
我有这个问题,其他答案都没有帮助。在我的情况下,我不得不透视正确的数据矩阵,右上方有一个缺角,看起来是哈里斯检测的四舍五入。
为了解决这个问题,请以您喜欢的方式检测形状,然后获得轮廓的凸包。一旦你拥有它,你将不得不提取4个最长的行(没有opencv函数存在,你必须自己提取功能) 然后你只需得到4条线的交点(你自己的函数)并将其转换回矩阵进行透视校正。
如果您的介质可以弯曲或者您的检测可能存在缺陷,您可能还需要从轮廓中删除相对于相邻点具有高角度的点,这可能会在最终点产生偏差。