opencv_c++学习(二十五)

这篇具有很好参考价值的文章主要介绍了opencv_c++学习(二十五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Harris角点介绍

opencv_c++学习(二十五)
1、海瑞斯角点不可能出现在图像平滑的区域(上图1);
2、图像边缘的支线出不可能出现海瑞斯角点(上图2);
3、海瑞斯角点会出现在顶点处。(上图3);
上图中的下半部分红色圆圈内就是海瑞斯角点常出现的地方。
opencv_c++学习(二十五)
如上图第一个式子,海瑞斯角点就是将窗口移动后的数值与移动前的数值之差乘一个权重而获得。
Harris角点检测函数:

cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType = BORDER_DEFAULT)

src:待检测Harris角点的输入图像,图像必须是CV_8U或者CV_32F的单通道灰度图像。
dst:存放Harris评价系数的R矩阵,数据类型为CV_32F的单通道图像,与输入图像具有相同的尺寸。
blockSize:邻域大小。
ksize: Sobel算子的半径,用于得到梯度信息。
k:计算Harris评价系数R的权重系数,通常取值为0.02-0.04。
borderType:像素外推算法标志。
绘制角点函数:

drawKeypoints(InputArray image, const std:vector< KeyPoint > & keypoints, lnputOutputArray outlmage, const Scalar & collor = Scalar::all( -1), DrawMatchesFlags flags = DranwatchesFlags: :DEFAULT)

image:输入图像。
keypoints:存放关键点的坐标、方向、强度等。
outlmage:输入(图像)/输出(图像)参数。
collor:角点颜色参数。
flags:角点类型的标志参数。
应用案例如下:

int main() {

	//读取图片
	Mat src = imread("2.jpg", IMREAD_COLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//转成灰度图像
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	

	//计算Harris的相关系数
	Mat harris;
	//邻域半径
	int blockSize = 2;
	int apertureSize = 3;
	cornerHarris(gray, harris, blockSize, apertureSize, 0.04);

	//归一化便于进行数值比较和结果展示
	Mat harrisn;
	normalize(harris, harrisn, 0, 255, NORM_MINMAX);

	//将图像的数据类型变成CV_8U数据类型
	convertScaleAbs(harrisn, harrisn);
	

	//寻找harris角点
	vector<KeyPoint>keyPoints;
	for (int row = 0; row < harrisn.rows; row++)
	{
		for (int col = 0; col < harrisn.cols; col++)
		{
			int R = harrisn.at<uchar>(row, col);
			//如果大于阈值
			if (R>249)
			{
				//向角点中存入KeyPoint中
				KeyPoint keyPoint;
				keyPoint.pt.y = row;
				keyPoint.pt.x = col;
				
				keyPoints.push_back(keyPoint);
			}
		}
	}
	
	drawKeypoints(src, keyPoints, src);
	imshow("q", src);

	waitKey(0);
	return 0;

}

二、Shi-Tomas角点检测

opencv_c++学习(二十五)
上图左侧为Harris角点检测,而右侧为Shi-Tomas角点检测。

goodFeaturesToTrack(InputArrayimage, OutputArray corners, int maxConers, double qualityLevell, double minDistance, InputArray mask = noArray(), int blockSize = 3, useHarrisDetector =, bool false, double k = 0.04)

corners:检测到角点的输出量。
maxCorners:要寻找的角点数目。
qualityLevel:角点阈值与最佳角点的关系,又称质量等级,当参数为0.01,表示角点阈值是最佳角点的0.01倍。
minDistance:两个角点之间的最小欧式距离。
mask:掩码矩阵,表示检测角点的区域。
blockSize:计算梯度协方差矩阵的尺寸。
useHarrisDetector:是否使用Harris角点。
k: Harris检测角点过程中的常值权重系数。
本节应用案例如下:

int main() {

	//读取图片
	Mat src = imread("2.jpg");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//转成灰度图像
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	//提取角点参数设置
	//要检测角点的数目
	int maxCorners = 100;
	//阈值与最佳角点的比例关系
	double quality_level = 0.01;
	//两角点之间最小欧氏距离
	double minDistance = 0.04;

	//开始检测角点
	vector<Point2f> corners;
	goodFeaturesToTrack(gray, corners, maxCorners, quality_level, minDistance, Mat(), 3, false);

	//绘制角点
	//存放角点信息的类
	vector<KeyPoint> keypoints;

	for (int i = 0; i < corners.size(); i++)
	{
		KeyPoint keyPoint;
		keyPoint.pt = corners[i];
		keypoints.push_back(keyPoint);
	}

	//绘制角点
	drawKeypoints(src, keypoints, src);
	imshow("q", src);
	waitKey(0);
	return 0;
}

检测结果如下:
opencv_c++学习(二十五)

三、角点位置亚像素优化

opencv_c++学习(二十五)

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

image:输入图像,必须是CV_8U或者CV_32F的单通道灰度图像。corners:角点坐标,既是输入的角点坐标又是精确后的角点坐标。
winSize:搜索窗口尺寸的一半,必须是整数。实际的搜索窗口尺寸比该参数的2倍大1。
zeroZone:搜索区域中间死区大小的一半,即不提取像素点的区域,(-1,-1)表示没有死区。
criteria:终止角点优化迭代的条件。
本节应用案例如下:

int main() {

	//读取图片
	Mat src = imread("2.jpg", IMREAD_COLOR);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//转成灰度图像
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	//提取角点的参数设置
	//检测角点的数目
	int maxCorners = 100;
	//质量等级(阈值与最佳角点的比例关系)
	double quality_level = 0.01;
	//两个角点之间的最小欧式距离
	double minDistance = 0.04;

	//开始检测角点
	vector<Point2f> corners;
	goodFeaturesToTrack(gray, corners, maxCorners, quality_level, minDistance, Mat(), 3, false);

	//计算亚像素级别角点坐标
	//对角点进行备份
	vector<Point2f> cornersSub = corners;

	Size winSize = Size(5, 5);
	Size zeroZone = Size(-1, -1);

	//设置迭代终止条件(精度、优化次数两种)
	TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 40, 0.001);

	//对角点位置进行优化
	cornerSubPix(gray, cornersSub, winSize, zeroZone, criteria);

	//输出初始坐标和精细化坐标
	for (size_t i = 0; i < corners.size(); i++)
	{
		string str = to_string(i);
		str = "第" + str + "个角点初始坐标";
		cout << str << corners[i] << "精细化后坐标:" << cornersSub[i] << endl;
	}
	return 0;
}

运行后的结果为:文章来源地址https://www.toymoban.com/news/detail-465697.html

0个角点初始坐标[658, 22]精细化后坐标:[653.352, 23.3173]1个角点初始坐标[651, 11]精细化后坐标:[650.709, 12.4754]2个角点初始坐标[679, 22]精细化后坐标:[677.97, 19.1283]3个角点初始坐标[642, 14]精细化后坐标:[642, 14]4个角点初始坐标[703, 14]精细化后坐标:[707.443, 13.5734]5个角点初始坐标[707, 22]精细化后坐标:[707, 22]6个角点初始坐标[701, 22]精细化后坐标:[701, 22]7个角点初始坐标[676, 20]精细化后坐标:[676.378, 19.5311]8个角点初始坐标[737, 10]精细化后坐标:[737.425, 10.4305]9个角点初始坐标[456, 455]精细化后坐标:[455.578, 455.946]10个角点初始坐标[714, 21]精细化后坐标:[714, 21]11个角点初始坐标[671, 15]精细化后坐标:[671, 15]12个角点初始坐标[645, 22]精细化后坐标:[648.17, 21.9485]13个角点初始坐标[329, 337]精细化后坐标:[328.559, 335.181]14个角点初始坐标[200, 70]精细化后坐标:[198.728, 69.3837]15个角点初始坐标[717, 11]精细化后坐标:[718.391, 9.59862]16个角点初始坐标[658, 15]精细化后坐标:[658, 15]17个角点初始坐标[675, 16]精细化后坐标:[676.382, 19.5321]18个角点初始坐标[694, 15]精细化后坐标:[694, 15]19个角点初始坐标[205, 77]精细化后坐标:[200.108, 78.0214]20个角点初始坐标[712, 21]精细化后坐标:[712, 21]21个角点初始坐标[732, 21]精细化后坐标:[732.617, 21.8419]22个角点初始坐标[650, 22]精细化后坐标:[648.169, 21.9459]23个角点初始坐标[724, 629]精细化后坐标:[725.753, 630.577]24个角点初始坐标[708, 14]精细化后坐标:[707.444, 13.5744]25个角点初始坐标[665, 11]精细化后坐标:[665, 11]26个角点初始坐标[726, 21]精细化后坐标:[726, 21]27个角点初始坐标[665, 22]精细化后坐标:[661.722, 20.5759]28个角点初始坐标[684, 15]精细化后坐标:[684, 15]29个角点初始坐标[655, 25]精细化后坐标:[653.352, 23.3171]30个角点初始坐标[686, 17]精细化后坐标:[683.677, 21.9529]31个角点初始坐标[689, 20]精细化后坐标:[690.806, 19.2633]32个角点初始坐标[689, 16]精细化后坐标:[690.808, 19.2695]33个角点初始坐标[697, 21]精细化后坐标:[697, 21]34个角点初始坐标[96, 192]精细化后坐标:[95.4687, 192.106]35个角点初始坐标[106, 197]精细化后坐标:[105.057, 197.03]36个角点初始坐标[720, 20]精细化后坐标:[720, 20]37个角点初始坐标[661, 20]精细化后坐标:[661, 20]38个角点初始坐标[640, 22]精细化后坐标:[640, 22]39个角点初始坐标[720, 18]精细化后坐标:[720, 18]40个角点初始坐标[415, 408]精细化后坐标:[415.696, 409.389]41个角点初始坐标[657, 18]精细化后坐标:[657, 18]42个角点初始坐标[669, 22]精细化后坐标:[669, 22]43个角点初始坐标[693, 18]精细化后坐标:[690.808, 19.2698]44个角点初始坐标[368, 405]精细化后坐标:[367.959, 405.776]45个角点初始坐标[712, 14]精细化后坐标:[712, 14]46个角点初始坐标[665, 14]精细化后坐标:[665, 14]47个角点初始坐标[661, 15]精细化后坐标:[663.909, 19.4959]48个角点初始坐标[699, 18]精细化后坐标:[699, 18]49个角点初始坐标[720, 10]精细化后坐标:[718.391, 9.59848]50个角点初始坐标[322, 294]精细化后坐标:[319.152, 293.47]51个角点初始坐标[693, 20]精细化后坐标:[690.808, 19.2693]52个角点初始坐标[702, 18]精细化后坐标:[702, 18]53个角点初始坐标[718, 22]精细化后坐标:[718, 22]54个角点初始坐标[733, 618]精细化后坐标:[733, 618]55个角点初始坐标[103, 156]精细化后坐标:[102.664, 156.514]56个角点初始坐标[731, 17]精细化后坐标:[732.617, 21.8415]57个角点初始坐标[349, 393]精细化后坐标:[348.878, 392.607]58个角点初始坐标[323, 280]精细化后坐标:[322.064, 277.923]59个角点初始坐标[322, 228]精细化后坐标:[322, 228]60个角点初始坐标[323, 46]精细化后坐标:[318.326, 44.3267]61个角点初始坐标[314, 43]精细化后坐标:[318.326, 44.329]62个角点初始坐标[295, 263]精细化后坐标:[291.54, 266.728]63个角点初始坐标[365, 331]精细化后坐标:[364.131, 328.912]64个角点初始坐标[156, 99]精细化后坐标:[155.564, 95.6742]65个角点初始坐标[699, 635]精细化后坐标:[699, 635]66个角点初始坐标[156, 135]精细化后坐标:[156.318, 136.249]67个角点初始坐标[729, 10]精细化后坐标:[729, 10]68个角点初始坐标[715, 16]精细化后坐标:[715, 16]69个角点初始坐标[698, 637]精细化后坐标:[698, 637]70个角点初始坐标[293, 36]精细化后坐标:[293, 36]71个角点初始坐标[445, 287]精细化后坐标:[444.51, 286.728]72个角点初始坐标[82, 99]精细化后坐标:[81.8857, 97.2768]73个角点初始坐标[139, 155]精细化后坐标:[139.134, 154.738]74个角点初始坐标[155, 95]精细化后坐标:[155.002, 94.6353]75个角点初始坐标[235, 49]精细化后坐标:[234.488, 47.0019]76个角点初始坐标[353, 391]精细化后坐标:[348.878, 392.607]77个角点初始坐标[149, 83]精细化后坐标:[147.25, 84.5725]78个角点初始坐标[135, 156]精细化后坐标:[137.54, 155.613]79个角点初始坐标[155, 92]精细化后坐标:[154.337, 93.5162]80个角点初始坐标[346, 394]精细化后坐标:[348.876, 392.607]81个角点初始坐标[82, 135]精细化后坐标:[81.7435, 135.518]82个角点初始坐标[366, 369]精细化后坐标:[365.88, 366.191]83个角点初始坐标[337, 56]精细化后坐标:[337, 56]84个角点初始坐标[150, 81]精细化后坐标:[147.252, 84.5742]85个角点初始坐标[146, 150]精细化后坐标:[145.671, 150.114]86个角点初始坐标[149, 146]精细化后坐标:[149.521, 146.281]87个角点初始坐标[713, 19]精细化后坐标:[713, 19]88个角点初始坐标[252, 307]精细化后坐标:[252.645, 307.682]89个角点初始坐标[737, 14]精细化后坐标:[737.425, 10.4304]90个角点初始坐标[304, 369]精细化后坐标:[302.66, 369.575]91个角点初始坐标[350, 326]精细化后坐标:[348.492, 327.303]92个角点初始坐标[99, 154]精细化后坐标:[101.828, 156.138]93个角点初始坐标[713, 638]精细化后坐标:[713, 638]94个角点初始坐标[86, 144]精细化后坐标:[85.6566, 142.36]95个角点初始坐标[293, 267]精细化后坐标:[291.54, 266.728]96个角点初始坐标[492, 493]精细化后坐标:[489.718, 492.288]97个角点初始坐标[355, 395]精细化后坐标:[355, 395]98个角点初始坐标[314, 357]精细化后坐标:[314, 357]99个角点初始坐标[718, 14]精细化后坐标:[718.391, 9.59858]

到了这里,关于opencv_c++学习(二十五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv_c++学习(二十二)

    图中左侧为边缘检测的效果,中间为图像经过二值化的效果,右图为凸包检测效果。 points:输入的2D点集。 hull:输出凸包的顶点。 clockwise:方向标志,当参数为true时,凸包顺序为顺时针方向,否则为逆时针方向。 returnPoints:输出数据的类型标志,当参数为true时第二个参数输出的

    2024年02月06日
    浏览(68)
  • OpenCV(四十二):Harris角点检测

    1.Harris角点介绍 什么是角点? 角点指的是两条边的交点,图中红色圈起来的点就是角点。 Harris角点检测原理:首先定义一个矩形区域,然后将这个矩形区域放置在我的图像中,求取这个区域内所有的像素值之和,之后沿着多个方向移动我这个区域,再次计算新区域的像素值

    2024年02月07日
    浏览(50)
  • OpenCV 入门教程: Harris角点检测

    Harris 角点检测是图像处理中常用的角点检测算法,用于寻找图像中的角点特征。角点是图像中具有明显边缘变化的位置,具有独特性和不变性,常用于图像匹配、目标跟踪和特征提取等应用。本文将以 Harris 角点检测为中心,为你介绍使用 OpenCV 进行角点检测的基本原理、步

    2024年02月16日
    浏览(41)
  • Python Opencv实践 - Harris角点检测

    参考资料:https://blog.csdn.net/wsp_1138886114/article/details/90415190  

    2024年02月09日
    浏览(40)
  • OpenCV基本图像处理操作(十)——图像特征harris角点

    角点 角点是图像中的一个特征点,指的是两条边缘交叉的点,这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中,角点是重要的特征,因为它们通常是图像中信息丰富的区域,可以用于图像分析、对象识别、3D建模等多种应用。 角点的识别可以帮助在进

    2024年04月23日
    浏览(57)
  • opencv进阶14-Harris角点检测-cv2.cornerHarris

    类似于人的眼睛和大脑,OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后,可以将这些特征作为数据 库,支持基于图像的搜索。此外,我们可以使用关键点将图像拼接起 来,组成更大的图像。(想象一下把很多图片放到一起组成一幅360°的全景

    2024年02月11日
    浏览(77)
  • Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。

    搜索到某个效果很好的视频去燥的算法,感觉效果比较牛逼,就是速度比较慢,如果能做到实时,那还是很有实用价值的。于是盲目的选择了这个课题,遇到的第一个函数就是角点检测,大概六七年用过C#实现过Harris角点以及SUSAN角点。因此相关的理论还是有所了解的,不过那

    2024年02月06日
    浏览(49)
  • Harris角点检测

    图像特征的分类:边缘、角点、纹理。 角点检测(准确来说角点不是特征,但检测出来的角点可以用来提取和表示总结为特征)也被称为特征点检测,Harris是基于角点的特征描述子,主要用于图像特征点的匹配,属于图像的局部特征。 在局部小范围里,如果在各个方向上移

    2024年02月08日
    浏览(50)
  • 基于Python手动实现Harris角点检测

    最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲。 同时作为自己的第一篇博客,在这里记录一下。 原理(略) 可以参考博主 拾牙慧者 的博客 角点检测(Harris角点检测法)_拾牙慧者的博客-CSDN博客_harri

    2023年04月14日
    浏览(42)
  • 基于MATLAB的Harris角点检测完成图片全景拼接

    目录 作业概要 1 原理及实现 1 2.1. 模块1 Harris角点检测 1 根据角点响应函数计算每个像素点的角点响应值; 2 2.2. 模块2 关键点的描述及其匹配 3 2.2.1. 生成描述向量 3 2.2.2. 匹配描述子 4 输出matched_points和匹配点对数count; 5 2.3. 模块3 转换矩阵的估计 5 输出仿射变换矩阵H。 6 2

    2024年01月17日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包