文章目录

  • 亚像素级别角点检测
  • 演示像素坐标检测

亚像素级别角点检测

亚像素:在生成数字图像处理时(拍照等)我们是将物理世界中连续的图像进行了离散化处理。现实世界中颜色为连续的且有无数种类,成像到像素面上每一个像素点只代表其附近的颜色,我们常使用的3通道图像颜色种类(255*255*255)代表,至于“附近”到什么程度?就很困难解释。两个像素之间有5.2微米的距离,在宏观上可以看作是连在一起的。但是在微观上,它们之间还有无限的更小的东西存在。这个更小的东西我们称它为“亚像素”。实际上“亚像素”应该是存在的,只是硬件上没有个细微的传感器把它检测出来。于是软件上把它近似地计算出来。

亚像素级别角点检测,提高检测精准度;由于理论与现实总是不一致的,实际情况下几乎所有的角点不会是一个真正的准确像素点。例如(100, 5) 实际上(100.234, 5.789)。

特别是在:跟踪,三维重建,相机校正方面,为了获取更加精准的角点,这样一来就需要亚像素级别角点检测。

亚像素定位方法

  • 插值方法
  • 基于图像矩计算
  • 曲线拟合方法 -(高斯曲面、多项式、椭圆曲面)

除了利用 HarrisShi-Tomasi方法进行角点检测 外, 还可以使用cornerEigenValsAndVecs() 函数和 cornerMinEigenVal() 函数自定义角点检测函数。 详情查看点击

如果对角点的精度有更高的要求,可以用 cornerSubPix() 函数将角点定位到子像素,从而取得亚像素级别的角点检测效果。

函数简介
函数goodFeaturesToTrack()函数只能提供简单的像素的整数坐标值,若需要实数坐标值则需要使用cornerSubPix()函数,用于寻找亚像素角点的位置:

void cornerSubPix(

InputArray image,          输入图像;
InputOutputArray corners,    初始化输入角点与精确的输出坐标
Size winSize,         搜索窗口半径。若Size(5,5),表示(5*2+1)*(5*2+1)=11*11大小的搜索窗口。
Size zeroZone,        表示死区的一半尺寸。为不对搜索区的中央位置做求和运算,用来避免自相关矩阵出现的某些可能的奇异性。值为(-1,-1)表示没有死区。
TermCriteria criteria      求角点的迭代过程的终止条件。
);

  • 其中:
    cv::TerCriteria::MAX_ITER :迭代终止条件为达到最大迭代次数终止
    cv::TerCriteria::EPS :   迭代到阈值终止
    cv::TerCriteria::MAX_ITER+cv::TerCriteria::EPS :两者都作为迭代终止条件

头文件 image_feature_all.h:声明类与公共函数

#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;class ImageFeature {public:void subpixel_corner_demo(Mat& image);};

主函数main.cpp调用该类的公共成员函数

#include "image_feature_all.h"int main(int argc, char** argv) {const char* img_path = "D:\\Desktop\\jianzhu.jpg";Mat image = imread(img_path);if (image.empty()) {cout << "图像数据为空,读取文件失败!" << endl;}ImageFeature imgfeature;imgfeature.subpixel_corner_demo(image);imshow("image", image);waitKey(0);destroyAllWindows();return 0;
}

演示像素坐标检测

检测出角点,再拟合亚像素级别角点位置

源文件 feature_extract.cpp:实现类与公共函数

static void on_subpixel(int num_corner, void* userdata) {Mat image = *((Mat*)userdata);Mat gray_src;cvtColor(image, gray_src, COLOR_BGR2GRAY);if (num_corner < 5) { num_corner = 5; }//角点检测Shi-Tomasivector<Point2f> corners;double qualityLevel = 0.03;double minDistance = 10;int blockSize = 3;bool userHarris = false;double k = 0.04;goodFeaturesToTrack(gray_src, corners, num_corner, qualityLevel, minDistance, Mat(), blockSize, userHarris, k);cout << "corners.size() = " << corners.size() << endl;//可视化RNG rng(12345);Mat resultImg = gray_src.clone();cvtColor(resultImg, resultImg, COLOR_GRAY2BGR);for (size_t i = 0; i < corners.size(); i++){Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));circle(resultImg, corners[i], 2, color, 1, 8, 0);}imshow("subpixel", resultImg);//拟合亚像素角点位置并计算亚像素角点位置Size winSize = Size(5, 5);Size zerozone = Size(-1, -1);TermCriteria tc = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);cornerSubPix(gray_src, corners, winSize, zerozone, tc);//打印精细坐标for (size_t i = 0; i < corners.size(); i++){cout << (i + 1) << ".point[x,y]\t" << corners[i].x << "," << corners[i].y << endl;}return;
}void ImageFeature::subpixel_corner_demo(Mat& image) {cv::namedWindow("subpixel", WINDOW_NORMAL);int num_corner = 100;int max_corner = 500;createTrackbar("CorNum", "subpixel", &num_corner, max_corner, on_subpixel, (void*)&image);on_subpixel(0, &image);
}

OpenCV + CPP 系列(卅四)图像特征提取(亚像素级别角点检测)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 亚像素级角点检测Opencv-cornerSubPix

    Opencv-cornerSubPix原理介绍 若我们进行图像处理的目的不是提取用于识别的特征点而是进行几何测量,这通常需要更高的精度,而函数 goodFeaturesToTrack() 只能提供简单 ...

  7. OpenCV + CPP 系列(卅三)图像特征提取(Harris角点检测、Shi-Tomasi角点检测、自定义角点检测)

    文章目录 一.常用图像特征描述 二.Harris角点检测 演示Harris角点检测 三.Shi-Tomasi角点检测 四.自定义角点检测器 一.常用图像特征描述 SIFT.SURF.HOG.Haar. ...

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

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

  9. 用OpenCV计算图像的亚像素值

    原理如图: float subPixelValue(cv::Mat &img, float x, float y) {// boundary checkif (x < 0)x = 0;i ...

最新文章

  1. π型滤波频率计算_滤波电路的总结
  2. 根据网络状态获取Ip地址
  3. (转,改)UML中的几种关系
  4. 三维点集拟合:平面拟合、RANSAC、ICP算法
  5. 选择排序 冒泡排序 二分查找
  6. sql 树状结构中知道 父节点与孙节点_数据结构之(树)
  7. Java虚拟机优化在哪里,锁在Java虚拟机中的实现和优化
  8. JavaWeb开发Listener学习
  9. 【预测模型】基于麻雀算法优化最小二乘支持向量机实现数据分类matlab代码
  10. 软件构造(三) 软件构造过程与配置管理
  11. 用之前使用正常的keil工程调试程序时,一直卡在 0x00000000 的解决方案
  12. 农场花园种花偷花前后端完整项目
  13. 毕业论文(设计)开题报告
  14. 请知悉/已知悉!英语怎么说?
  15. 只用js代码实现电子时钟,精确到毫秒
  16. vue3 倒计时功能
  17. Oracle中查询用户表/索引/视图的创建语句
  18. *皮亚诺关于公理4的一段语录解析 皮亚诺读后之六
  19. 数学建模常用模型04:灰色关联分析法
  20. 【问链财经-区块链基础知识系列】 第四十四课 邮储银行:U链福费廷业务系统

热门文章

  1. aix vnc oracle,AIX VNC setup - mistletoe82的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  2. 腾讯手游《王者荣耀》创下每日1亿用户记录
  3. 暴玩推箱子c++代码
  4. English trip M1 - AC1 My Dream Car Teacher:Corrine
  5. 基于FPGA的矩阵逆inv计算
  6. 计算机原理复杂模型机改动,计算机组成原理之复杂模型机设计实验
  7. java二目运算单目运算_(2-6)Java语言中,单目运算符有(
  8. 面对ChatGPT的冲击我们该怎么办?
  9. pairwise损失_triplet损失_提升精排模型的trick
  10. ubuntu苹果主题