观看记录
  • 我的观影记录
登录
测试首页OpenCV:goodFeaturesToTrack角点检测的应用

OpenCV:goodFeaturesToTrack角点检测的应用

绪:

最常用的角点检测方式是Harris角点检测,

OpenCV供给了Harris角点检测的接口cornerHarris(),但Harris检测的角点是像素级的,且检测速度较慢;

这里介绍OpenCV另一个功能更为壮大角点检测函数goodFeaturesToTrack(),

不仅撑持Harris角点检测,也撑持Shi Tomasi算法的角点检测。

但该函数检测的角点依然是像素级此外。

若想获取更为邃密的角点坐标,

则需要与cornerSubPix()函数共同利用,获得亚像素角点。

工具/原料

  • opencv 2410

方式/步骤

  1. 1

    goodFeaturesToTrack格局:

    void goodFeaturesToTrack(

                          InputArray image,  //输入图像 

                           OutputArray corners, //输出角点vector 

                           int maxCorners,  //最年夜角点数量 

                           double qualityLevel, // 质量程度系数                       

                           double minDistance, // 最小距离,小于此距离的点忽略 

                           InputArray mask = noArray(), // mask=0的点忽略 

                           int blockSize = 3, //邻域数 

                          bool useHarrisDetector = false, // false =Shi Tomasi metric 

                           double k = 0.04 //Harris角点检测时利用 

    ); 

    参数:

    第一个参数是输入图像(8位或32位单通道图);

    第二个参数是检测的所有角点,类型为vector或数组,由给定的参数类型而定。若是是vector,那么它应该是一个包含cv::Point2f的vector对象;若是类型是cv::Mat,那么它的每一行对应一个角点,点的x、y位置别离是两列;

    第三个参数用于限制检测到的点数的最年夜值;

    第四个参数暗示检测到的角点的质量程度(凡是是0.10到0.01之间的数值,不克不及年夜于1.0);

    第五个参数用于区分相邻两个角点的最小距离(小于这个距离得点将进行归并);

    第六个参数是mask,若是指定,它的维度必需和输入图像一致,且在mask值为0处不进行角点检测。

    第七个参数是blockSize,暗示在计较角点时介入运算的区域大小,常用值为3,可是若是图像的分辩率较高则可以考虑利用较年夜一点的值;

    第八个参数用于指定角点检测的方式,若是是true则利用Harris角点检测,false则利用Shi Tomasi算法;

    第九个参数是在利用Harris算法时利用,最好利用默认值0.04;

  2. 2

    goodFeaturesToTrack应用

    法式:

    #include <opencv2\opencv.hpp>

    #include <opencv2\highgui\highgui.hpp>

    #include <opencv2\features2d\features2d.hpp>

    #include <opencv2\core\core.hpp>

    using namespace std; 

    using namespace cv; 

    int main()

    {

           Mat image_color = imread("Lighthouse.jpg", 1);  

           Mat image_gray; 

           cvtColor(image_color, image_gray, COLOR_BGR2GRAY); 

          

           //设置角点检测参数 

           vector<Point2f> corners; 

           int max_corners = 500; 

           double quality_level = 0.01; 

           double min_distance = 3.0; 

           int block_size = 3; 

           bool use_harris = false; 

           double k = 0.04; 

           goodFeaturesToTrack(image_gray,  

                                 corners,  

                                 max_corners,  

                                 quality_level,  

                                 min_distance,  

                                          Mat(),  

                                          block_size,  

                                          use_harris,  

                                          k); 

           //将检测到的角点绘制到原图上 

           for (int i = 0; i < corners.size(); i++) 

           { 

                  circle(image_color, corners[i], 1, Scalar(0, 0, 255), 2, 8, 0); 

           }

           namedWindow("house corner",CV_WINDOW_NORMAL);

           imshow("house corner", image_color); 

           waitKey(0); 

           return 0; 

    }

  3. 3

    cornerSubPix()格局

    goodFeaturesToTrack()提取的角点只能达到像素级别,在良多环境下并不克不及知足现实的需求,这时就需要cornerSubPix()对检测的角点作进一步的优化计较,

    使角点的精度达到亚像素级别。

    void cornerSubPix( 

                    InputArray image, // 输入图像 

                    InputOutputArray corners, // 角点

                    Size winSize, // 区域大小为 N*N; N=(winSize*2+1) 

                    Size zeroZone, // 近似于winSize,Size(-1,-1)暗示忽略 

                    TermCriteria criteria // 遏制优化的尺度 

    ); 

    第一个参数是输入图像和goodFeaturesToTrack()中的输入图像是统一个图像。

    第二个参数是检测到的角点,便是输入也是输出。

    第三个参数是计较亚像素角点时考虑的区域大小,大小为N*N; N=(winSize*2+1)。

    第四个参数感化近似于winSize,可是老是具有较小的规模,凡是忽略(即Size(-1, -1))。

    第五个参数暗示计较亚像素时遏制迭代的尺度,可选的值有TermCriteria::MAX_ITER 、TermCriteria::EPS,前者暗示迭代次数达到了最年夜次数时遏制,后者暗示角点位置转变的最小值已经达到最小时遏制迭代。二者均利用cv::TermCriteria()机关函数进行指定。

  4. 4

    goodFeaturesToTrack连系cornerSubPix的应用

    法式:

    #include <opencv2\opencv.hpp>

    #include <opencv2\highgui\highgui.hpp>

    #include <opencv2\features2d\features2d.hpp>

    #include <opencv2\core\core.hpp>

    using namespace std; 

    using namespace cv; 

    int main()

    {

           Mat image_color = imread("Lighthouse.jpg", 1);  

           Mat image_gray; 

           cvtColor(image_color, image_gray, COLOR_BGR2GRAY); 

          

           //设置角点检测参数 

           vector<Point2f> corners; 

           int max_corners = 500; 

           double quality_level = 0.01; 

           double min_distance = 3.0; 

           int block_size = 3; 

           bool use_harris = false; 

           double k = 0.04; 

           goodFeaturesToTrack(image_gray,  

                                  corners,  

                                  max_corners,  

                                  quality_level,  

                                  min_distance,  

                                              Mat(),  

                                              block_size,  

                                              use_harris,  

                                              k); 

           //将检测到的角点绘制到原图上 

           for (int i = 0; i < corners.size(); i++) 

           { 

                  circle(image_color, corners[i], 1, Scalar(0, 0, 255), 2, 8, 0); 

           }

           namedWindow("goodTrack corner",CV_WINDOW_NORMAL);

           imshow("goodTrack corner", image_color); 

           //指定亚像素计较迭代标注 

           TermCriteria criteria = TermCriteria(

                                          TermCriteria::MAX_ITER + TermCriteria::EPS, 

                                          40, 

                                          0.01); 

           //亚像素检测 

           cornerSubPix(image_gray, corners, Size(5, 5), Size(-1, -1), criteria); 

           //将检测到的亚像素角点绘制到原图上 

           for (int i = 0; i < corners.size(); i++) 

           { 

                  circle(image_color, corners[i], 5, cv::Scalar(0, 255, 0), 2, 8, 0); 

           }

           namedWindow("sub pixel corner",CV_WINDOW_NORMAL);

           imshow("sub pixel corner", image_color); 

           waitKey(0); 

           return 0; 

  5. 5

    像素角点与亚像素角点对比:

    如图所示:

注重事项

  • goodFeaturesToTrack角点检测是像素级此外

“OpenCV:goodFeaturesToTrack角点检测的应用”关联的文章

  • 电脑网络异常

    进入电脑界面后,需要打开设置图标,进入后点击网格和Internet选项中心进行操作,以下是详细步骤操作:

    1小时前0阅读

    电脑网络异常
  • 美团电动车怎么还车

    美团电动车怎么还车?下面给大家详细介绍一下具体步骤及说明。

    1小时前0阅读

    美团电动车怎么还车
  • 腾讯新闻怎么关闭视频自动播放
  • 快速除痱子

    夏天到了,人们身上容易长痱子,有什么办法可以轻松除掉痱子吗,今天小编找到了几种方法,希望能帮到你。

    1小时前0阅读

  • 华为手机畅享7,怎样设置指纹锁
  • 做深蹲运动有什么好处

    做深蹲运动有什么好处呢?很多人都不知道,下面小编来告诉大家。

    1小时前0阅读

  • 果酱烤棉花糖的制作方法

    棉花糖的香甜美味与果酱的清新可口会撞出怎样的味道呢?今天小编就来介绍一下果酱烤棉花糖的制作方法。

    1小时前0阅读

  • 原神机关烹饪之法之二怎么过关

    原神机关烹饪之法之二怎么过关?韶光抚月第二阶段活动有些玩家已经顺利完成了,这里给大家带来了原神机关烹饪之法之二玩法技巧,一起来看下文中介绍吧。

    2小时前0阅读

    原神机关烹饪之法之二怎么过关
  • 如何让idm不要自动下载视频

    用浏览器打开带有视频的网页,便会自动下载此页面的所有视频。如何禁止IDM自动下载视频呢?请看下面的经验。

    2小时前0阅读

    如何让idm不要自动下载视频
  • 手机用什么浏览器好?

    网络时代的到来,丰富了我们的生活,出现了越来越多的浏览器,你用的哪一款浏览器?你知道哪一款浏览器最好用吗?下面我们就一起来看看吧。

    2小时前0阅读

切换深色外观
留言
视频编辑修改
回到顶部
首页
手机数码
医疗健康
金融管理
社交情感
无名