前言
我在做围棋盘的的四个角点检测时,试了几种角点检测,用来得到棋盘四个角的初始点,试了几种角点检测的方法,但在我所使用的环境下,亚像素的角点检测得到的结果比较理想。
代码
//亚像素角点检测
void cornerDetectorPixel(Mat &src, Mat &dst)
{
Mat src_img, gray;
//读取图像
src_img = src.clone();
//把原图像转换成灰度图
cvtColor(src_img, gray, COLOR_BGR2GRAY);
vector<Point2f> corners;
dst = src_img.clone();
//进行角点检测
goodFeaturesToTrack(gray, corners, 4, 0.01, 10, Mat(), 3, false, 0.04);
//输出检测到的角点的数量
cout << "输出检测到的角点的数量: " << corners.size() << endl;
//参数设置
Size winSize = Size(5, 5);
Size zeroZone = Size(-1, -1);
TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);
//计算亚像素级角点位置
cornerSubPix(gray, corners, winSize, zeroZone, criteria);
//输出精准角点坐标信息
for (int i = 0; i < corners.size(); i++)
{
cout << "[" << i << "]" << "号角点坐标:" << "(" << corners[i].x << ", " << corners[i].y << ")" << endl;
}
//绘制出被检测的角点
for (size_t i = 0; i < corners.size(); i++)
{
circle(dst, corners[i], 6, Scalar(0, 0, 255), -2, 8, 0);
}
imshow("dst", dst);
}
运行结果:
还是有角点没有检测到,要使用可以自己试着优化下参数。