Mat mat1 = new Mat(@"棋盘格.jpg",ImreadModes.Grayscale);
#region shi_tomasi角点检测
//shi_tomasi角点检测
Point2f[] cornersPoint = Cv2.GoodFeaturesToTrack(mat1, 100, 0.01, 30, new Mat(), 3, false, 0.04);
foreach (var item in cornersPoint)
{
Cv2.Circle(mat1, Convert.ToInt16(item.X), Convert.ToInt16(item.Y), 10, Scalar.Black, 2);
Console.WriteLine(item);
}
#endregion
#region 亚像素级角点检测
//这里准备亚像素级角点检测的参数
//Size winSize = new Size(21, 21); // 搜索矩形大小的一半,类似于渲染的小方格
//Size zeroZone = new Size(-1, -1); //这里是死区的一半尺寸,(-1,-1表示没有死区)
//List<Point2f> inputCorners = new List<Point2f>(); //这里是输入角的初始坐标和提供的细化坐标(类似扫描)
//for (int i = 50; i < mat1.Rows - 60; i += 40) //给inputCorners 矩阵赋值
//{
// for (int j = 50; j < mat1.Cols - 50; j += 40)
// {
// inputCorners.Add(new Point(j, i));
// }
//}
//TermCriteria criteria = new TermCriteria(CriteriaType.Eps, 100, 0.01); //这个是检测数据
////这里开始检测角点
//Point2f[] y_cornersPoint = Cv2.CornerSubPix(mat1, inputCorners, winSize, zeroZone, criteria);
////遍历画出角点
//foreach (var item in y_cornersPoint)
//{
// Cv2.Circle(mat1, Convert.ToInt16(item.X), Convert.ToInt16(item.Y), 10, Scalar.Black, 2);
// Console.WriteLine(item);
//}
#endregion
#region FAST角点算子
//// FAST角点算子具有平移和旋转不变性、可靠性高、对噪声鲁棒性好、计算量小 这里不一定能拿到全部角点。
//KeyPoint[] keyPoint = Cv2.FAST(mat1, 150);
//foreach (var item in keyPoint)
//{
// Cv2.Circle(mat1, Convert.ToInt16(item.Pt.X), Convert.ToInt16(item.Pt.Y), 10, Scalar.Black, 2);
// Console.WriteLine(item);
//}
//// 遍历画出角点
//foreach (var item in cornersPoint)
//{
// Cv2.Circle(mat1, Convert.ToInt16(item.X), Convert.ToInt16(item.Y), 10, Scalar.Black, 2);
// Console.WriteLine(item);
//}
#endregion
Cv2.ImShow("mat1", mat1);
Cv2.WaitKey();
shi_tomasi角点检测结果
这里是亚像素级角点检测
FAST角点算子