Opencv-cornerSubPix原理介绍

若我们进行图像处理的目的不是提取用于识别的特征点而是进行几何测量,这通常需要更高的精度,而函数 goodFeaturesToTrack() 只能提供简单的像素的坐标值,也就是说有时会需要实数坐标值而不是整数坐标值。

角点位置特征:角点与边缘点的连线和边缘点的梯度方向垂直。

如上图所示,假设一个起始角点 q 在实际亚像素角点附近。

p 点在 q 点附近的邻域中,若 p 点在均匀区域内部,则 p 点的梯度为0;若 p 点在边缘上,则 p 点的梯度方向垂直边缘方向。如果向量 q-p 方向与边缘方向一致,那么 q-p 向量与 p 点的梯度向量点积运算结果为 0 。

在初始角点(初始角点可能不在边缘上)附近我们可以收集很多组点的梯度以及相关向量 q-p ,此时的 q 就是我们所要求的更精确角点位置,那么每一组的向量点积设置为 0 ,正是基于这个思想,将点积为 0 的等式组合起来形成一个系统方程,该系统方程的解就是更精确的亚像素角点位置。 将新的 q 点作为区域的中心,可以继续使用这个方法进行迭代,获得很高的精度。

寻找亚像素角点:cornerSubPix 函数

void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria);

image,输入图像,即源图像。
corners,提供输入角点的初始坐标和精确的输出坐标。
winSize,搜索窗口的一半尺寸。若 winSize = Size(5,5),那就表示用(52+1)×(52+1)= 11×11 大小的搜索窗口。
zeroZone,死区的一半尺寸。真正搜索区域为 [zeroZone2+1 , winSize2+1]。值为(-1,-1)表示没有死区。
criteria,求角点的迭代过程的终止条件。要么是迭代数大于某个设定值,要么是精度达到某个设定值,甚至可以是它们的组合。

#include<opencv.hpp>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
using namespace cv;
Mat src, cornerImg, grayImg;
int mxCorners = 10;
RNG rngs = { 12345 };
void Change(int, void*) {//计算整数角点vector<Point>corners1;vector<Point2f>corners2;    //https://www.cnblogs.com/bjxqmy/p/12459005.htmlgoodFeaturesToTrack(grayImg, corners1, mxCorners, 0.01, 10, Mat(), 3, false, 0.04);goodFeaturesToTrack(grayImg, corners2, mxCorners, 0.01, 10, Mat(), 3, false, 0.04);//计算精确角点TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);cornerSubPix(grayImg, corners2, Size(5, 5), Size(-1, -1), criteria);Mat dst = src.clone();for (int i = 0; i < corners1.size(); i++) {cout << "[" << corners1[i].x << "," << corners1[i].y << "]" << endl;cout << "[" << corners2[i].x << "," << corners2[i].y << "]" << endl << endl;Scalar colors = Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255));circle(dst, corners2[i], 5, colors, -1);}imshow("dst", dst);
}
int main() {src = imread("C:/Users/齐明洋/Desktop/示例图片/1.jpg");imshow("src", src);//转换为灰度图像cvtColor(src, grayImg, COLOR_BGR2GRAY);namedWindow("dst");createTrackbar("maxCorners", "dst", &mxCorners, 100, Change);Change(0, 0);waitKey(0);
}








参考来源:https://blog.csdn.net/weixin_41695564/article/details/79991733

亚像素级角点检测Opencv-cornerSubPix相关推荐

  1. OpenCV——角点检测原理分析(Harris,Shi-Tomasi、亚像素级角点检测)

    一.角点(corner) 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法 ...

  2. OpenCV中角点检测:Harris、Shi-Tomasi、亚像素级角点检测

    1.角点的定义 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.比如,三角形有三个角,矩形有四个角,这些就是角点,也是他们叫做矩形.三角形的特征. 角点是个很 ...

  3. 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测

    10.3 亚像素级角点检测 10.3.1 亚像素级角点检测原理 1.原理:   假设起始角点在实际亚像素角点附近,检测所有q-p向量,下面两种情况点p梯度与q-p向量的点积均为0:(1)点p附近图像均 ...

  4. opencv亚像素边缘精度_亚像素级角点定位原理及opencv实现

    为何需要进行亚像素定位? 数字图像通常是离散化成像素:每个像素对应一个整数坐标位置:整数坐标位置对于很多应用并不精确,比如跟踪.相机标定.图像配准.图像拼接以及三维重构:为达到有些应用的精确性,需要精 ...

  5. OpenCV + CPP 系列(卅四)图像特征提取(亚像素级别角点检测)

    文章目录 亚像素级别角点检测 演示像素坐标检测 亚像素级别角点检测 亚像素:在生成数字图像处理时(拍照等)我们是将物理世界中连续的图像进行了离散化处理.现实世界中颜色为连续的且有无数种类,成像到像素面 ...

  6. OpenCv-C++-亚像素级别角点检测(检测子像素中的corner的位置)

    使用亚像素级别角点检测,返回角点的浮点数值,它的精度比整数像素更准确.可以用cornerSubPix()函数将角点定位到子像素,从而取得亚像素级别的角点检测效果. 使用函数: void cv::cor ...

  7. 萌新学习手册:亚像素级别角点检测

    在现实应用中我们的角点往往并不是整数,所以为了提高我们寻找角点的精确程度,我们需要进行处理,一般有三种方法 1.插值方法 2.基于图像矩计算 3.图线拟合(高斯曲面,多项式,椭圆曲面)其中高斯曲面最为 ...

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

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

  9. 亚像素级精确度的角点

    有时我们需要最大精度的角点检测.OpenCV为我们提供了函cv2.cornerSubPix(), 它可以提供亚像素级别的角点检测.下面是一个例子.首先我们要找到 Harris 角点,然后将角点的重心传 ...

最新文章

  1. CSS面试复习(三):预处理器、工程化方案、三大框架中的CSS
  2. 使用 Spring 2.5 基于注解驱动的 Spring MVC(二)
  3. 用python模拟三体运动_怎么用Python写一个三体的气候模拟程序
  4. php 日历 代码,PHP 简单日历实现代码
  5. 如何使用SAT trace一个正在运行的程序
  6. 深拷贝与浅拷贝Object.assign()
  7. 编译原理——实验叁预习报告——基于YACC的TINY语法分析器的构建
  8. 回归分析什么时候取对数_技术派|SPSS数据分析心得小结及心得分享!必备收藏...
  9. vue中组件的父子关系
  10. VS2019 Xamarin.Android开发蓝牙通讯
  11. EverEdit逆向 PE结构
  12. 我的世界服务器怎么显示腐竹来了,我的世界服务器主人可用指令一览 我的世界腐竹常用指令介绍_游侠手游...
  13. Ubuntu和windows之间复制粘贴,遇到无法安装Vmware-tools
  14. kestrel轻量级消息队列的安装
  15. 【uni-app】Flex布局
  16. Jenkins高级篇之Pipeline语法篇-2-第一个Pipeline脚本练习
  17. 作业12——分支限界解决最大团和图m着色问题
  18. 服务器电阻的作用,DP口的终端电阻是什么作用?
  19. pyqt怎么让窗口置顶和取消置顶
  20. 腾讯员工入侵酒店wifi被罚,浅谈企业wifi的重要性

热门文章

  1. python 获取B站播放量计算的条件及……
  2. unity3d 牧师与恶魔
  3. c语言sizeof strlen,C语言中sizeof与strlen区别
  4. 遍历 HashMap 的 5 种方式总结
  5. 盘点中国比较热门的十大品牌进口涂料品牌
  6. 面试题 17.07. 婴儿名字 ( 字符标志 并查集 )
  7. c++基础技能(二)
  8. 如果有一天你没有了动力,可以看看
  9. 不要拿过去的记忆 折磨现在的自己
  10. 利用GridView显示SD卡的图片和两段文字