利用opencv进行圆形标志提取和质心计算
最近跟着老师做项目,需要对图片中拍摄的圆形标志点进行检测和提取,查了一些资料和博客,记录一下过程。实际拍摄的图片如图所示:
图片处理过程的大概思路是:
1、进行双边滤波处理(可以较好的保留圆形标志的边缘信息)
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
2、利用Mean shift区域分割算法分割圆形标志(分割次数可以根据图片具体情况而定)
CV_EXPORTS_W void pyrMeanShiftFiltering( InputArray src, OutputArray dst,
double sp, double sr, int maxLevel = 1,
TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );
double sp—滑动空间的窗口半径
double sr—颜色窗口半径
termcrit:迭代算法终止条件(可以选择迭代次数或者迭代精度作为终止条件)
3、将分割出圆形标志进行Canny算子边缘检测
4、利用findContours函数获取轮廓信息并填充区域轮廓内部
findContours函数的定义:
CV_EXPORTS_W void findContours( InputArray image, OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset = Point());
Mat draw00 = Mat(resultCanny.size(), CV_8UC3, Scalar(255, 255, 255));
findContours(resultCanny, Contours, Hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//轮廓