OpenCV -- Shi-Tomas角点检测与亚像素级角点检测
Shi-Tomas角点检测:
函数:
1 2 3 4 5 6 7 8 9 | goodFeaturesToTrack( g_grayImage, //输入图像 corners, //检测到的角点的输出向量 g_maxCornerNumber, //角点的最大数量 qualityLevel, //角点检测可接受的最小特征值 minDistance, //角点之间的最小距离 Mat(), //感兴趣区域 blockSize, //计算导数自相关矩阵时指定的邻域范围 false , //不使用Harris角点检测 k ); //权重系数 |
亚像素级角点检测:
函数:
1 2 3 4 5 6 7 8 9 10 11 12 | //亚像素角点检测的参数设置 Size winSize = Size( 5, 5 ); //搜索窗口的一半尺寸 Size zeroZone = Size( -1, -1 ); //死区的一半尺寸,(-1,-1)表示没有死区 TermCriteria criteria = TermCriteria( TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001 ); //角点迭代过程的终止条件 /* int type; /* CV_TERMCRIT_ITER 和CV_TERMCRIT_EPS二值之一,或者二者的组合 int max_iter; // 最大迭代次数 double epsilon; // 结果的精确性 */ //计算出亚像素角点位置 cornerSubPix( g_grayImage, corners, winSize, zeroZone, criteria ); //cornerSubPix函数用于寻找亚像素角点位置 |
区别:
Shi-Tomas角点检测输出为简单的整数类型坐标值;
亚像素级角点检测则是更精确的浮点类型。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | //Shi-Tomasi算子 cv::Mat BasicAlgorithm::on_Shi_Tomasi(cv::Mat mat, int value) { Mat g_srcImage, g_grayImage; g_srcImage = mat; int g_maxCornerNumber = value; int g_maxTrackbarNumber = 500; RNG g_rng(12345); //初始化随机数生成器 cvtColor( g_srcImage, g_grayImage, COLOR_BGR2GRAY ); //【1】对变量小于等于1时的处理 if ( g_maxCornerNumber <= 1 ) { g_maxCornerNumber = 1; } //【2】Shi-Tomasi算法(goodFeaturesToTrack函数)的参数准备 vector<Point2f> corners; double qualityLevel = 0.01; //角点检测可接受的最小特征值 double minDistance = 10; //角点之间的最小距离 int blockSize = 3; //计算导数自相关矩阵时指定的邻域范围 double k = 0.04; //权重系数 Mat copy = g_srcImage.clone(); //复制源图像到一个临时变量中,作为感兴趣区域 //【3】进行Shi-Tomasi角点检测 goodFeaturesToTrack( g_grayImage, //输入图像 corners, //检测到的角点的输出向量 g_maxCornerNumber, //角点的最大数量 qualityLevel, //角点检测可接受的最小特征值 minDistance, //角点之间的最小距离 Mat(), //感兴趣区域 blockSize, //计算导数自相关矩阵时指定的邻域范围 false , //不使用Harris角点检测 k ); //权重系数 //【4】绘制检测到的角点 int r = 4; for ( int i = 0; i < corners.size(); i++ ) { //以随机的颜色绘制出角点 circle( copy, corners[i], r, Scalar(g_rng.uniform(0,255), g_rng.uniform(0,255), g_rng.uniform(0,255)), -1, 8, 0 ); // circle( copy, corners[i], r, Scalar(255, 0, 0), -1, 8, 0 ); //opencv中图像通道为BGR,(255,0,0)为蓝色,绘制出为蓝色点 } //*****************************************上:Shi-Tomasi算子***************************************<br>//*****************************************如需亚像素级角点检测,则加上下边一段代码********************** |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //【7】亚像素角点检测的参数设置 Size winSize = Size( 5, 5 ); //搜索窗口的一半尺寸 Size zeroZone = Size( -1, -1 ); //死区的一半尺寸,(-1,-1)表示没有死区 TermCriteria criteria = TermCriteria( TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001 ); //角点迭代过程的终止条件 /* int type; /* CV_TERMCRIT_ITER 和CV_TERMCRIT_EPS二值之一,或者二者的组合 int max_iter; // 最大迭代次数 double epsilon; // 结果的精确性 */ //【8】计算出亚像素角点位置 cornerSubPix( g_grayImage, corners, winSize, zeroZone, criteria ); //cornerSubPix函数用于寻找亚像素角点位置(不是整数类型,是更精确的浮点类型) //【9】输出角点坐标信息 for ( int i = 0; i < corners.size(); i++ ) { // qDebug()<<"精确角点"<<i<<"位置"; cout<< " \t>>Point[" <<i<< "] (" <<corners[i].x<< "," <<corners[i].y<< ")" <<endl; } return copy;<br>} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!