绪:
最常用的角点检测方式是Harris角点检测,
OpenCV供给了Harris角点检测的接口cornerHarris(),但Harris检测的角点是像素级的,且检测速度较慢;
这里介绍OpenCV另一个功能更为壮大角点检测函数goodFeaturesToTrack(),
不仅撑持Harris角点检测,也撑持Shi Tomasi算法的角点检测。
但该函数检测的角点依然是像素级此外。
若想获取更为邃密的角点坐标,
则需要与cornerSubPix()函数共同利用,获得亚像素角点。

东西/原料
- opencv 2410
方式/步调
- 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
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
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
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
像素角点与亚像素角点对比:
如图所示:
注重事项
- goodFeaturesToTrack角点检测是像素级此外
来源:百闻(微信/QQ号:9397569),转载请保留出处和链接!
本文链接:https://www.ibaiwen.com/web/240007.html
- 上一篇: 【技巧】虚拟信息申请教程(外国)
- 下一篇: 如何用PS调整图片亮度
- 热门文章
-
WB蒙特利尔(WB Montreal)——欧美十大最差视频游戏开发商
迅猛龙(Velociraptor)——欧美史前十大死亡动物
什么是果酱猫(What Marmalade Cats)?
神奇蜘蛛侠2(The Amazing Spider-Man 2)——欧美最佳蜘蛛侠电影
希瑟(Heather)——欧美十大最佳柯南灰歌
二人梭哈
faceu激萌怎么把瘦脸开到最大
奥兹奥斯本(Ozzy Osbourne)——欧美十大高估歌手
什么是小脑前下动脉(Anterior Inferior Cerebellar Artery)?
我应该知道康涅狄格州的什么(What Should I Know About Connecticut)?
- 热评文章
- 最新评论
-
- 最近访客
-
- 站点信息
-
- 文章总数:200248
- 页面总数:9
- 分类总数:1
- 标签总数:0
- 评论总数:0
- 浏览总数:497