Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影

这篇具有很好参考价值的文章主要介绍了Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、Shi-Tomas角点检测

2、亚像素级别角点位置优化

3、ORB特征点

4、特征点匹配

5、RANSAC优化特征点匹配

6、相机模型与投影


1、Shi-Tomas角点检测

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

//Shi-Tomas角点检测
int test1()
{
	Mat img = imread("F:/testMap/lena.png");
	if (!img.data)
	{
		cout << "读取图像错误, 请确认图像文件是否正确" << endl; 
		return -1;
	}
		
	Mat gray;
	cvtColor(img, gray,COLOR_BGR2GRAY);
	//Detector parametersl
	
	//提取角点
	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;//存放角点的KeyPoint类,用于后期绘制角点时用

	for (int i = 0; i < corners.size(); i++)
	{
		//将角点存放在KeyPoint类中
		KeyPoint keyPoint;
		keyPoint.pt = corners[i];
		keyPoints.push_back(keyPoint);
	}

	//用drawKeypoints()函数绘制角点坐标
	drawKeypoints(img, keyPoints, img);
	imshow("角点结果", img); 
	waitKey(0);
	return 0;
}

 2、亚像素级别角点位置优化

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

//亚像素级别角点位置优化
int test2()
{
	system("color 02");//改变DOS界面颜色
	Mat img = imread("F:/testMap/lena.png", IMREAD_COLOR);
	if (!img.data)
	{
		cout << "读取图像错误,请确认图像文件是否正确" << endl;
		return -1;
	}
	//彩色图像转成灰度图像
	Mat gray;
	cvtColor(img, 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;
	}

	waitKey(0);
	return 0;
}

3、ORB特征点

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 

//ORB特征点
int test3()
{
	Mat img = imread("F:/testMap/lena.png");
	if (!img.data)
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	//创建ORB特征点类变量
	Ptr<ORB> orb = ORB::create(500,//特征点数目
		1.2f,//金字塔层级之间的缩放比例
		8,//金字塔图像层数系数
		31,//边缘阈值
		0,//原图在金字塔中的层数
		2,//生成描述子时需要用的像素点数目
		ORB::HARRIS_SCORE,//使用 Harris方法评价特征点
		31,//生成描述子时关键点周围邻域的尺寸
		20//计算 FAST角点时像素值差值的阈值
		);

	//计算ORB关键点
	vector<KeyPoint> Keypoints;
	orb->detect(img, Keypoints);//确定关键点

	//计算ORB描述子
	Mat descriptions;
	orb->compute(img, Keypoints, descriptions);//计算描述子

	//绘制特征点
	Mat imgAngel;
	img.copyTo(imgAngel);
	//绘制不含角度和大小的结果
	drawKeypoints(img, Keypoints, img, Scalar(255, 255, 255));//绘制含有角度和大小的结果
	drawKeypoints(img, Keypoints, imgAngel, Scalar(255, 255, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

	//显示结果
	imshow("不含角度和大小的结果", img);
	imshow("含有角度和大小的结果", imgAngel);

	waitKey(0);
	return 0;
}

4、特征点匹配

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

//特征点匹配
void orb_features(Mat &gray,vector<KeyPoint> &keypionts,Mat &descriptions)
{
	Ptr<ORB> orb = ORB::create(1000,1.2f); 
	orb->detect(gray,keypionts);
	orb->compute(gray,keypionts,descriptions);
}

int test1()
{
	Mat img1, img2;
	img1 = imread("F:/testMap/box.png");
	img2 = imread("F:/testMap/box_in_scen.png");
	if (!(img1.data && img2.dataend))
	{
		cout << "读取图像错误,请确认图像文件是否正确" << endl;
		return -1;
	}
	//提取ORB特征点
	vector<KeyPoint> Keypoints1, Keypoints2;
	Mat descriptions1, descriptions2;
	//计算特征点
	orb_features(img1, Keypoints1, descriptions1);
	orb_features(img2, Keypoints2, descriptions2);

	//特征点匹配
	vector<DMatch> matches;//定义存放匹配结果的变最
	BFMatcher matcher(NORM_HAMMING);//定义特征点匹配的类,使用汉明距离
	matcher.match(descriptions1, descriptions2, matches);//进行特征点匹配
	cout << "matches=" << matches.size() << endl;//匹配成功特征点数目

	//通过汉明距离删选匹配结果
	double min_dist = 0, max_dist = 10000;
	for (int i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist < min_dist) min_dist = dist;
		if (dist > max_dist) max_dist = dist;
	}
	//输出所有匹配结果中最大韩明距离和最小汉明距离
	cout << "min_dist=" << min_dist << endl;
	cout << "max_dist=" << max_dist << endl;

	//将汉明距离较大的匹配点对删除
	vector<DMatch>good_matches;
	for (int i = 0; i < matches.size(); i++)
	{
		if (matches[i].distance <= max(2 * min_dist, 20.0))
		{
			good_matches.push_back(matches[i]);
		}
	}
	cout << "good_min=" << good_matches.size() << endl;//剩余特征点数目

	//绘制匹配结果
	Mat outimg, outimg1;
	drawMatches(img1, Keypoints1, img2, Keypoints2, matches, outimg);
	drawMatches(img1, Keypoints1, img2, Keypoints2, good_matches, outimg1);

	imshow("未筛选结果", outimg);
	imshow("最小汉明距离筛选", outimg1);

	waitKey(0);
	return 0;
}

5、RANSAC优化特征点匹配

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 

void match_min(vector<DMatch> matches, vector<DMatch> & good_matches)//最小汉明距离
{
	double min_dist = 10000, max_dist = 0;
	for (int i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist < min_dist)  min_dist = dist;
		if (dist > max_dist)  max_dist = dist;
	}
	cout << "min_dist=" << min_dist << endl;
	cout << "max_dist=" << max_dist << endl;
	for (int i = 0; i < matches.size(); i++)
	{
		if (matches[i].distance <= max(2 * min_dist, 20.0))
		{
			good_matches.push_back(matches[i]);
		}
	}
}
//RANSAC算法实现
void ransac(vector<DMatch>matches, vector <KeyPoint> queryifeyPoint, vector<KeyPoint> trainieyPoint, vector<DMatch> &kmatches_ransac)
{
	//定义保存匹配点对坐标
	vector<Point2f> srcPoints(matches.size()), dstPoints(matches.size());
	//保存从关键点中提取到的匹配点对的坐标
	for (int i = 0; i < matches.size(); i++)
	{
		srcPoints[i] = queryifeyPoint[matches[i].queryIdx].pt;
		dstPoints[i] = trainieyPoint[matches[i].trainIdx].pt;
	}

	//匹配点对进行RANSAC过滤
	vector<int> inliersMask(srcPoints.size());
	// Mat homography;
	//homography = findHomography(srcPoints, dstPoints, RANSAC, 5, inliersMask); 
	findHomography(srcPoints, dstPoints, RANSAC, 5, inliersMask);
	//手动的保留RANSAC过滤后的匹配点对
	for (int i = 0; i < inliersMask.size(); i++)
	{
		if (inliersMask[i])
		{
			kmatches_ransac.push_back(matches[i]);
		}
	}
}
int test5()
{
	Mat img1, img2;
	img1 = imread("F:/testMap/box.png");
	img2 = imread("F:/testMap/box_in_scen.png");
	if (!(img1.data && img2.dataend))
	{
		cout << "读取图像错误,请确认图像文件是否正确" << endl;
		return -1;
	}
	//提取ORB特征点
	vector<KeyPoint> Keypoints1, Keypoints2;
	Mat descriptions1, descriptions2;
	//计算特征点
	orb_features(img1, Keypoints1, descriptions1);
	orb_features(img2, Keypoints2, descriptions2);

	//特征点匹配
	vector<DMatch> matches, good_min, good_ransac;
	BFMatcher matcher(NORM_HAMMING);
	matcher.match(descriptions1, descriptions2, matches);
	cout << "matches=" << matches.size() << endl;

	//最小汉明距离
	match_min(matches, good_min);
	cout << "good_min=" << good_min.size() << endl;

	//用ransac算法筛选匹配结果
	ransac(good_min, Keypoints1, Keypoints2, good_ransac);
	cout << "good_matches.size=" << good_ransac.size() << endl;

	//绘制匹配结果
	Mat outimg, outimg1, outimg2;
	drawMatches(img1,Keypoints1,img2,Keypoints2, matches,outimg); 
	drawMatches(img1, Keypoints1, img2, Keypoints2, good_min, outimg1);
	drawMatches(img1,Keypoints1,img2,Keypoints2, good_ransac,outimg2); 
	imshow("未筛选结果", outimg);
	imshow("最小汉明距离筛选", outimg1) ;
	imshow("ransac筛选",outimg2);

	waitKey(0);
	return 0;
}

6、相机模型与投影

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法

 Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影,OpenCV学习笔记,opencv,图像处理,算法文章来源地址https://www.toymoban.com/news/detail-569143.html

//相机模型与投影
int test4()
{
	//输入计算得到的内参矩阵和畸变矩阵
	Mat cameraMatrix = (Mat_<float>(3,3) << 532.016297,0,332.172519,0,531.565159,233.388075,0, 0,1);
	Mat distCoeffs = (Mat_<float>(1,5) << -0.285188,0.080097,0.001274,-0.002415,0.106579);
	
	//代码清单10-10中计算的第一张图像相机坐标系与世界坐标系之间的关系
	Mat rvec = (Mat_<float>(1,3)<<-1.977853,-2.002220,0.130029);
	Mat tvec = (Mat_<float>(1,3) <<-26.88155,-42.79936,159.19703);
	
	//生成第一张图像中内角点的三维世界坐标
	Size boardSize = Size(9, 6);
	Size squareSize = Size(10,10);//棋盘格每个方格的真实尺寸
	vector<Point3f> PointSets;
	
	for (int j = 0; j < boardSize.height; j++)
	{
		for (int k = 0; k < boardSize.width; k++)
		{
			Point3f realPoint;
			//假设标定板为世界坐标系的z平面,即z=0
			realPoint.x = j*squareSize.width;
			realPoint.y = k*squareSize.height; 
			realPoint.z = 0;
			PointSets.push_back(realPoint);
		}
	}

	//根据三维坐标和相机与世界坐标系时间的关系估计内角点像素坐标
	vector<Point2f>imagePoints;
	projectPoints(PointSets,rvec,tvec,cameraMatrix, distCoeffs, imagePoints);
	for(int i = 0; i < imagePoints.size(); i++)
	{
		cout << "第" << to_string(i) << "个点的坐标" << imagePoints[i] << endl;
	}
		


	waitKey(0);
	return 0;
}

到了这里,关于Shi-Tomas角点检测、亚像素级别角点位置优化、ORB特征点、特征点匹配、RANSAC优化特征点匹配、相机模型与投影的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • MATLAB 相机标定中标定板角点像素坐标系到世界坐标系的转换

    matlab 做相机标定后,想将第一张(任意一张都行)标定板角点所对应的像素坐标转换到世界坐标系下,标定板角点的像素坐标真值与世界坐标真值都非常容易获得,但是我通过内外参矩阵将像素坐标转换到世界坐标有很大的误差,如下 像素坐标到世界坐标之间的转换可参考

    2024年02月10日
    浏览(49)
  • YOLOv5/YOLOv8改进实战实验:新型***亚像素卷积***优化上采样技术提升目标检测效果(即插即用)

      这是一个用于上采样的子像素卷积(SubPixel Convolution)模块,它是一种常见的图像超分辨率的技术,也可以应用于目标检测模型(如YOLO)的特征图上采样。下面我会分几个部分详细介绍这个模块的原理和在YOLO中的应用:   模块介绍:SubPixelConvolution_s是一个PyTorch模块,

    2024年02月15日
    浏览(44)
  • Opencv之角点 Harris、Shi-Tomasi 检测详解

    角点,即图像中某些属性较为突出的像素点 常用的角点有以下几种: 梯度最大值对应的像素点 两条直线或者曲线的交点 一阶梯度的导数最大值和梯度方向变化率最大的像素点 一阶导数值最大,但是二阶导数值为0的像素点 API简介: 主要用于检测图像中线段的端点或者两条

    2024年02月16日
    浏览(36)
  • opencv_角点检测

    文章内容 一个opencv检测角点的程序 运行效果

    2024年01月17日
    浏览(42)
  • Harris角点检测

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

    2024年02月08日
    浏览(50)
  • 计算机视觉-角点检测

    Harris角点检测 运行结果 SIFT特征提取 运行结果 Harris角点检测和SIFT特征提取都是计算机视觉领域中常用的特征检测与描述算法。它们的主要区别在于:Harris角点检测是一种基于 角点 的检测方法,而SIFT特征提取是一种基于 局部特征 的描述方法。Harris角点检测适用于 具有明显

    2024年02月01日
    浏览(32)
  • cesium实现大批量POI点位聚合渲染优化方案

    cesium目前只提供了entityCluster这个聚合类,使打点聚合更方便快捷的实现,但是一般在真正做项目的时候,大家会经常碰到成千上万个甚至几十万个点位需要聚合打点,那这时候你如果还是用entity去实现的话,怕是要被用户按在地上疯狂摩擦,摩擦。。。😅 我们可以通过模拟

    2024年02月09日
    浏览(40)
  • OpenCV实战(16)——角点检测详解

    在计算机视觉中,兴趣点 ( interest points ) 也称为关键点 ( keypoints ) 或特征点 ( feature points ),广泛用于解决对象识别、图像匹配、视觉跟踪、 3D 重建等领域的问题。与其将图像作为一个整体进行评估,不如选择可以用于局部分析的点,以获得将该点应用于局部或全局的信息。

    2023年04月18日
    浏览(50)
  • SUSAN角点检测算法实现(详细版)

    无 一、SUSAN算子是什么?         SUSAN ( Small univalue segment assimilating nucleus) 算子是一种基于灰度的特征点获取方法, 适用于图像中边缘和角点的检测, 可以去除图像中的噪声, 它具有简单、有效、抗噪声能力强、计算速度快的特点。         对于图像中非纹理区域的任一点

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

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

    2024年02月07日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包