【blog算法原理】Opencv中直线的表示方法
一、问题的提出:
在实际项目编写过程中,需要对直线(Line)进行特定的处理。在以前的项目设计实现中,直线(Line)多是用来绘图使用的,而不是用来进行分析的。
经过较为仔细地研究Opencv提供的相关内容,感觉这个问题很有搞头,所以分离出来研究。先看refman
可以看到,opencv自己提供的3种直线寻找的函数,最后得到的表示line的数据结构和表示内容的表示都是不一样的。出现这个原因,可能是因为编写这几个函数的不是一个开发者;也可能是认为地选择了最适合特定函数使用的数据结构。那么这3个函数效果到底怎么样?如何灵活使用到自己的项目中?最后我将提出结合自己实际编写的函数。
二、函数测试
由于后2个函数都能够直接以图像(MAT)作为参数,所以用一副标准图像进行测试;而后针对Linefit能够以点集作为输入的情况单独测试(如果要使用同样的图像需要先细化再找边缘,比较麻烦),并且提出自己编写的方法。
测试图像为
编写代码
#);
board , CV_PI, , , );
, CV_PI, , , );
; i ], l[]), Point(l[], l[]), Scalar(), , CV_AA);
}
; i ], theta ];
Point pt1, pt2;
),, CV_AA);
}
imshow("src",src);
waitKey();
}
board , CV_PI, , , );
, CV_PI, , , );
; i ], l[]), Point(l[], l[]), Scalar(), , CV_AA);
}
; i ], theta ];
Point pt1, pt2;
),, CV_AA);
}
imshow("src",src);
waitKey();
}
结果
(HoughLineP)
(HoughLine)
从结果上来看,HoughlineP识别的要更准确。这两个函数一个是识别出来图形上的点,一个是识别出来角度和图像上的点。两个函数的结果都是自己编写代码打印出来的。
三、结合实际
实际上我需要的是识别出直线,并且对图像进行旋转。这部分的代码是这样的
Point pt1;
Point pt2;
] ]]]]]]]),, CV_AA);
, src.rows );]]);
angle );
/// 旋转已扭曲图像
warpAffine( src, dst, rot_mat, src.size() );
] ]]]]]]]),, CV_AA);
, src.rows );]]);
angle );
/// 旋转已扭曲图像
warpAffine( src, dst, rot_mat, src.size() );