图像处理之角点检测与亚像素角点定位

角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度。所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与分析结果就越接近真实。同时角点检测对真实环境下的对象识别、对象匹配都起到决定性作用。Harris角点检测是图像处理中角点提取的经典算法之一,应用范围广发,在经典的SIFT特征提取算法中Harris角点检测起到关键作用。通常对角点检测算法都有如下要求:

1. 基于灰度图像、能够自动调整运行稳定,检测出角点的数目。

2. 对噪声不敏感、有一定的噪声抑制,有较强的角点角点检测能力。

3. 准确性够高,能够正确发现角点位置

4. 算法尽可能的快与运行时间短

Harris角点检测基本上满足了上述四点要求,所以被广发应用,除了Harris角点检测,另外一种常见的角点检测算法-Shi-Tomasi角点检测也得到了广发应用,OpenCV中对这两种算法均有实现API可以调用。关于Harris角点检测原理可以看我之前写的博文:

http://blog.csdn.net/jia20003/article/details/16908661

关于Shi-Tomasi角点检测,与Harris角点检测唯一不同就是在计算角点响应值R上面。

然后根据输入的阈值T大于该阈值的R对应像素点即为图像中角点位置坐标。此刻坐标往往都是整数出现,而在真实的世界中坐标多数时候都不是整数,假设我们计算出来的角点位置P(34, 189)而实际上准确角点位置是P(34.278, 189.706)这样带小数的位置,而这样的准确位置寻找过程就叫做子像素定位或者亚像素定位。这一步在SURF与SIFT算法中都有应用而且非常重要。常见的亚像素级别精准定位方法有三类:

1. 基于插值方法

2. 基于几何矩寻找方法

3. 拟合方法 - 比较常用

拟合方法中根据使用的公式不同可以分为高斯曲面拟合与多项式拟合等等。以高斯拟合为例

这样就求出了亚像素的位置。使用亚像素位置进行计算得到结果将更加准确,对图像特征提取、匹配结果效果显著。OpenCV中已经对角点检测实现了亚像素级别的API可以调用。

代码演示

OpenCV亚像素角点检测例子:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;Mat src, gray_src;
int max_corners = 10;
int max_trackbar = 30;
const char* output_title = "subpxiel-result";
void GoodFeature2Track_Demo(int, void*);
int main(int argc, char** argv) {src = imread("D:/vcprojects/images/home.jpg");if (src.empty()) {printf("could not load image...\n");return -1;}cvtColor(src, gray_src, COLOR_BGR2GRAY);namedWindow("input", CV_WINDOW_AUTOSIZE);namedWindow(output_title, CV_WINDOW_AUTOSIZE);imshow("input", src);createTrackbar("Corners:", output_title, &max_corners, max_trackbar, GoodFeature2Track_Demo);GoodFeature2Track_Demo(0, 0);waitKey(0);return 0;
}void GoodFeature2Track_Demo(int, void*) {if (max_corners < 1) {max_corners = 1;}vector<Point2f> corners;double qualityLevel = 0.01;double minDistance = 10;int blockSize = 3;double k = 0.04;goodFeaturesToTrack(gray_src, corners, max_corners, qualityLevel, minDistance, Mat(), blockSize, false, k);cout << "number of corners : " << corners.size() << endl;Mat copy = src.clone();for (size_t t = 0; t < corners.size(); t++) {circle(copy, corners[t], 4, Scalar(255, 0, 0), 2, 8, 0);}imshow(output_title, copy);// locate corner point on sub pixel levelSize winSize = Size(5, 5);Size zerozone = Size(-1, -1);TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);cornerSubPix(gray_src, corners, winSize, zerozone, criteria);for (size_t t = 0; t < corners.size(); t++) {cout << (t+1) << ".point[x, y]=" << corners[t].x << "," << corners[t].y << endl;}return;
}

原图如下:


运行结果:

转载请注明来自【jia20003】的博客!

图像处理之角点检测与亚像素角点定位相关推荐

  1. OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测

    Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...

  2. cv::cornerSubPix()亚像素角点检测

    转自https://blog.csdn.net/guduruyu/article/details/69537083 cv::goodFeaturesToTrack()提取到的角点只能达到像素级别,在很 ...

  3. OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测

    在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪 ...

  4. OpenCV亚像素角点检测

    前言 我在做围棋盘的的四个角点检测时,试了几种角点检测,用来得到棋盘四个角的初始点,试了几种角点检测的方法,但在我所使用的环境下,亚像素的角点检测得到的结果比较理想. 代码 //亚像素角点检测 voi ...

  5. 《opencv学习笔记》-- 亚像素角点检测

    亚像素级角点检测的位置在摄像机标定.跟踪并重建摄像机的轨迹,或者重建被跟踪目标的三维结构时,是一个基本的测测量值. 将所求得的角点位置精确到亚像素级精度 .一个向量和与其正交的向量的点积为0,角点则满 ...

  6. opencv3/C++ Harris角点、Shi-Tomasi角点亚像素角点

    角点检测在图像匹配.目标识别.目标跟踪.运动估计与三维重建等CV领域起着非常重要的作用. 角点定义 关于角点的定义有以下几种: 1.角点是两条及两条以上的边缘的交点: 2.角点处的一阶导数最大,二阶导 ...

  7. opencv亚像素边缘精度_OpenCV亚像素角点cornerSubPixel()源代码分析

    上一篇博客中讲到了goodFeatureToTrack()这个API函数能够获取图像中的强角点.但是获取的角点坐标是整数,但是通常情况下,角点的真实位置并不一定在整数像素位置,因此为了获取更为精确的角 ...

  8. 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测

    第10章 角点检测 10.1 Harris角点检测 10.1.1 角点 1.图像特征类型: (1)边缘 (2)角点(感兴趣点) (3)斑点(感兴趣区域) 2.角点定义: (1) 一阶导数(灰度的梯度) ...

  9. 计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测

    计算机视觉(角点检测)- 2 - Shi-Tomasi 角点检测 学习前言 一.Shi-Tomasi 角点检测 二.OpenCV中API介绍    ```corners = cv2.goodFeatu ...

最新文章

  1. K - FatMouse and Cheese
  2. C#中串口通信编程 收藏
  3. 员外带你读论文:LINE: Large-scale Information Network Embedding
  4. 站立会议-2014-04-14
  5. kafka使用_Kafka介绍与使用
  6. jsp 或 php 等view之中使用javascript简单处理的使用技巧
  7. 信息学奥赛一本通C++语言——1050:骑车与走路
  8. 《天天数学》连载03:一月三日
  9. 面试题,谈谈一款APP的优缺点,并提出改进建议
  10. MSN网盘SkyDrive
  11. GPRS tunnelling protocol GTP协议
  12. 金山毒霸推新产品金山卫士 正面狙击奇虎360
  13. CSS3 制作 3D 水晶糖果按钮
  14. html的size属性,HTML size属性用法及代码示例
  15. Linux命令如何将竖行改成横行,用DECODE和CASE WHEN将多行单列数据改为单行多列数据(即竖向排列改为横向排列)...
  16. 关于大数据相关的问答汇总,每天持续更新中哦~
  17. android平板打电话,四款可接打电话平板电脑推荐
  18. matlab激光操纵控制系统设计,某激光操作控制系统的滞后校正
  19. Synopsys VCS仿真编译选项
  20. vw 前端_Vw / Vh 更好的做前端适配

热门文章

  1. 猜小拳,溯清源。Python的生态源码创新应该得到尊重!
  2. 130.Impala基准测试
  3. No.2 大众点评评论爬取
  4. AI 建模师 素养手冊(2)
  5. 拼多多企业入驻条件是什么?和个人入驻有啥区别?
  6. 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析
  7. ae怎么设置gpu渲染_有玩AE的吗?求教GPU渲染问题!!
  8. poj1330,JDOJ3055O(nlogn)做法
  9. 迈向图形化:dialog工具
  10. Git 本地与远程仓库同步操作