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,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现