OpenCV-特征提取与检测(04、亚像素级别角点检测)
亚像素
- 面阵摄像机的成像面以像素为最小单位。例如某CMOS摄像芯片,其像素间距为5.2微米。摄像机拍摄时,将物理世界中连续的图像进行了离散化处理。到成像面上每一个像素点只代表其附近的颜色。至于“附近”到什么程度?就很困难解释。两个像素之间有5.2微米的距离,在宏观上可以看作是连在一起的。但是在微观上,它们之间还有无限的更小的东西存在。这个更小的东西我们称它为“亚像素”。实际上“亚像素”应该是存在的,只是硬件上没有个细微的传感器把它检测出来。于是软件上把它近似地计算出来。
- 亚像素的精度:
亚像素精度是指相邻两像素之间细分情况。输入值通常为二分之一,三分之一或四分之一。这意味着每个像素将被分为更小的单元从而对这些更小的单元实施插值算法。例如,如果选择四分之一,就相当于每个像素在横向和纵向上都被当作四个像素来计算。因此,如果一张5x5像素的图像选择了四分之一的亚像素精度之后,就等于创建了一张20x20的离散点阵,进而对该点阵进行插值。
亚像素级别角点检测
- 提高检测精准度
理论与现实总是不一致的,实际情况下几乎所有的角点不会是一个真正的
准确像素点。(100, 5) 实际上(100.234, 5.789)
- 亚像素定位
- 插值方法
- 基于图像矩计算
- 曲线拟合方法 -(高斯曲面、多项式、椭圆曲面)
- 除了利用 Harris进行角点检测 和利用 Shi-Tomasi方法进行角点检测 外, 还可以使用cornerEigenValsAndVecs()函数和cornerMinEigenVal()函数自定义角点检测函数。 如果对角点的精度有更高的要求,可以用cornerSubPix()函数将角点定位到子像素,从而取得亚像素级别的角点检测效果。
相关API介绍- cornerSubPix()函数
函数goodFeaturesToTrack()函数只能提供简单的像素的坐标值,也就是说,有时候会需要实数坐标值而不是整数坐标值。在OpenCV中,就提供了一个cornerSubPix()函数,用于寻找亚像素角点的位置,其函数声明如下:
void cornerSubPix(
InputArray image, --输入图像,即源图像;
InputOutputArray corners, --提供输入角点的初始坐标和精确的输出坐标
Size winSize, --Size类型,表示搜索窗口的半径。若winSize=Size(5,5),那么就表示使用(5*2+1)x(5*2+1)=11*11大小的搜索窗口。
Size zeroZone, -- Size类型,表示死区的一半尺寸。而死区为不对搜索区的中央位置做求和运算的区域,用来避免自相关矩阵出现的某些可能的奇异性。值为(-1,-1)表示没有死区。
TermCriteria criteria --TermCriteria类型,求角点的迭代过程的终止条件。
);
- 还有一个API,可以了解一下
void cvFindCornerSubPix(
const CvArr* image,
CvPoint2D32f* corners,
int count,
CvSize win,
CvSize zero_zone,
CvTermCriteria criteria
);
程序代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// 全局变量
int max_corners = 20;
int max_count = 50;// 亚像素定位,浮点数运算,比较耗时
Mat src, gray_src;
const char* output_title = "SubPixel Result";void SubPixel_Demo(int, void*);int main(int argc, char** argv) {src = imread("E:/Experiment/OpenCV/Pictures/cornerHarrisTest.jpg");if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input image", CV_WINDOW_AUTOSIZE);imshow("input image", src);// 载入图像并灰度化 cvtColor(src, gray_src, COLOR_BGR2GRAY);// 创建显示窗口以及滑动条namedWindow(output_title, CV_WINDOW_AUTOSIZE);createTrackbar("Corners:", output_title, &max_corners, max_count, SubPixel_Demo);SubPixel_Demo(0, 0);waitKey(0);return 0;
}
// 使用Shi-Tomasi方法检测角点,再对角点位置进行精准化
void SubPixel_Demo(int, void*) {if (max_corners < 5) {max_corners = 5;}// Shi-Tomasi的参数设置vector<Point2f> corners;double qualityLevel = 0.01;double minDistance = 10;int blockSize = 3;double k = 0.04;// 应用Shi-Tomasi角点检测算法goodFeaturesToTrack(gray_src, corners, max_corners, qualityLevel, minDistance, Mat(), blockSize, false, k);cout << "number of corners: " << corners.size() << endl;// 深度拷贝原图像用于绘制角点Mat resultImg = src.clone();for (size_t t = 0; t < corners.size(); t++) {cout << t << ".point[x,y]=" << corners[t].x << "," << corners[t].y << endl; // 整数值circle(resultImg, corners[t], 2, Scalar(0, 0, 255), 2, 8, 0);}imshow(output_title, resultImg);// 角点位置精准化参数Size winSize = Size(5, 5); // 窗口不要太大,不然亚像素可能会被干扰Size zerozone = Size(-1, -1); // 拟合时使用 零区域//TermCriteria类是用来作为迭代算法的终止条件的,参数:类型(EPS表示迭代到阈值终止),第二个参数为迭代的最大次数,最后一个是特定的阈值TermCriteria tc = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);// 计算精准化后的角点位置cornerSubPix(gray_src, corners, winSize, zerozone, tc);// 亚像素定位,为后续计算提供更高精确度的值cout << "subpixel corners.size=" << corners.size() << endl;for (size_t t = 0; t < corners.size(); t++) {cout << (t + 1) << " .point[x, y] = " << corners[t].x << " , " << corners[t].y << endl; // 亚像素定位出来的,精确度较高,浮点值}return;
}
运行截图
参考博客
- https://blog.csdn.net/pengjc2001/article/details/55095023 (亚像素与halcon)
- https://blog.csdn.net/CHNguoshiwushuang/article/details/81155361 (亚像素)
- https://blog.csdn.net/weixin_41695564/article/details/79991733 (亚像素角点检测)
- https://blog.csdn.net/holybin/article/details/41122493 (亚像素级角点检测(cornerSubPix))
- https://blog.csdn.net/huanghuangjin/article/details/81268227 (亚像素级别角点检测)
OpenCV-特征提取与检测(04、亚像素级别角点检测)相关推荐
- OpenCV + CPP 系列(卅四)图像特征提取(亚像素级别角点检测)
文章目录 亚像素级别角点检测 演示像素坐标检测 亚像素级别角点检测 亚像素:在生成数字图像处理时(拍照等)我们是将物理世界中连续的图像进行了离散化处理.现实世界中颜色为连续的且有无数种类,成像到像素面 ...
- OpenCv-C++-亚像素级别角点检测(检测子像素中的corner的位置)
使用亚像素级别角点检测,返回角点的浮点数值,它的精度比整数像素更准确.可以用cornerSubPix()函数将角点定位到子像素,从而取得亚像素级别的角点检测效果. 使用函数: void cv::cor ...
- 萌新学习手册:亚像素级别角点检测
在现实应用中我们的角点往往并不是整数,所以为了提高我们寻找角点的精确程度,我们需要进行处理,一般有三种方法 1.插值方法 2.基于图像矩计算 3.图线拟合(高斯曲面,多项式,椭圆曲面)其中高斯曲面最为 ...
- OpenCV——角点检测原理分析(Harris,Shi-Tomasi、亚像素级角点检测)
一.角点(corner) 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法 ...
- OpenCV中角点检测:Harris、Shi-Tomasi、亚像素级角点检测
1.角点的定义 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.比如,三角形有三个角,矩形有四个角,这些就是角点,也是他们叫做矩形.三角形的特征. 角点是个很 ...
- 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测
10.3 亚像素级角点检测 10.3.1 亚像素级角点检测原理 1.原理: 假设起始角点在实际亚像素角点附近,检测所有q-p向量,下面两种情况点p梯度与q-p向量的点积均为0:(1)点p附近图像均 ...
- 亚像素级角点检测Opencv-cornerSubPix
Opencv-cornerSubPix原理介绍 若我们进行图像处理的目的不是提取用于识别的特征点而是进行几何测量,这通常需要更高的精度,而函数 goodFeaturesToTrack() 只能提供简单 ...
- 图像处理之角点检测与亚像素角点定位
图像处理之角点检测与亚像素角点定位 角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度.所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与分 ...
- opencv亚像素边缘精度_亚像素级角点定位原理及opencv实现
为何需要进行亚像素定位? 数字图像通常是离散化成像素:每个像素对应一个整数坐标位置:整数坐标位置对于很多应用并不精确,比如跟踪.相机标定.图像配准.图像拼接以及三维重构:为达到有些应用的精确性,需要精 ...
- OpenCV精进之路(十三):角点检测
角点检测是计算机视觉系统中用来获取图像特征的一种方法.我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了.其实说图像的特征,你 ...
最新文章
- 为了故意刁难AI,科学家们制造了这1200个问题,超强AI被“打回原形”
- ORA-12516 TNS: 监听程序找不到符合协议堆栈要求的可用处理程序
- JSR94(Java Rule Engine)
- 高级Bash脚本编程指南《Advanced Bash-Scripting Guide》 in Chinese
- python遍历数组冒泡排序法_十种排序七种搜索算法的Python实现——气泡排序,十大,七大,查找,python,冒泡排序,bubblesort...
- 使用 Spring Cloud 实现微服务系统
- 小程序影藏溢出的gif_ScreenToGif:一款小巧实用动图gif制作神器
- docker-compose参数介绍
- 一、appium的下载安装
- 这个母亲节,带妈妈一起学习网络防骗术
- 设置水平线高度html代码是size,html水平线样式 Width:设置水平线的宽度
- java中的switch case语句
- manifestdependency,manifest文件
- 4.5.2.3_黑白滤镜
- 【vue打包】线上部署报错net::ERR_ABORTED 404 (Not Found)
- 【FinE】在险价值(VaR)计算
- 机器学习之条件随机场(CRF)
- 景区如何设计打造文旅夜游项目
- 用 Flex Builder 3 + Pydev 打造全能 webgame 集成开发环境
- 如何配置Java和tomcat环境变量