首页 > 其他分享 >OpenCV ORB特征检测(22)

OpenCV ORB特征检测(22)

时间:2023-04-24 21:33:02浏览次数:52  
标签:22 img int void 角点 像素 OpenCV params ORB

ORB在2011年才首次发布,ORB算法将基于FAST关键点的技术和基于BRIEF描述符的技术相结合,但是ORB并没有解决尺度不一致的问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能,我们通过构建高斯金字塔,然后在每一层金字塔图像上检测角点,来实现尺度不变性。ORB主要解决了BRIEF描述子不具备旋转不变性的问题。 BRIEF是一种特征描述子提取算法,并非特征点的提取算法,一种生成二值化描述子的算法,不提取代价低,匹配只需要使用简单的汉明距离(Hamming Distance)利用比特之间的异或操作就可以完成。因此,时间代价低,空间代价低,效果还挺好是最大的优点。

ORB算法大致流程

  • 建立图像金字塔
  • FAST算法寻找特征点
  • 给关键点分配方向
  • 通过BRIEF算法创建特征向量,得到特征描述符

API介绍

static Ptr<ORB> create(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31,int firstLevel=0, int WTA_K=2, ORB::ScoreType scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold=20);
/*******************************************************************
*			nfeatures: 					保留的最佳特性的数量				
*			scaleFactor:	    		金字塔抽取率,必须大于1
*			nlevels:					金字塔等级的数量
*			edgeThreshold:  			边缘阈值
*			firstLevel:					第一层的索引值	
*			WTA_K:	    				用于生成定向的BRIEF描述符的每个元素的随机像素的数量
*					2:一次选择两个随机像素比较,匹配的时候距离参数选择NORM_HAMMING,默认方式
*					3:一次选择三个随机像素来比较它们的亮度,返回最亮像素的索引,返回回的索引将为0,1或2
*					4:一次选择四个随机像素来比较它们的亮度,返回最亮像素的索引,回的索引将为0,1,2或3
*			scoreType:					对特征点进行排序的算法
*						HARRIS_SCORE:Harris角算法用于对要素进行排名。该分数仅用于保留最佳功能
*						FAST_SCORE:	速度快,关键点稍差
*			patchSize:  				用于计算BIREF描述子的特征点邻域大小
*			fastThreshold:				fast特征阈值
*********************************************************************/
virtual void detect( InputArray image,std::vector<KeyPoint>& keypoints,InputArray mask=noArray());
/*******************************************************************
*			image: 				输入图				
*			keypoints:	        角点信息
*			mask:				计算亚像素角点区域大小			
*********************************************************************/
void drawKeypoints( InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage,const Scalar& color=Scalar::all(-1), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT );
/*******************************************************************
*			image: 				输入图				
*			keypoints:	        角点信息
*			outImage:			计算亚像素角点区域大小
*			color:  			颜色
*			flags:				绘制匹配标记			
*********************************************************************/

综合代码

#include <iostream>
#include <map>
#include <new>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class ORBFeature
{
public:
	ORBFeature() :img(imread("mm.jpg"))
	{
		result["img"] = img;
	}
	void TestORB()
	{
		Ptr<ORB> orb = ORB::create();
		orb->detect(img, point);
		drawKeypoints(img, point, result["orb"], Scalar(255, 0, 255));
	}
	void Show()
	{
		for (auto& v : result)
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
protected:
	Mat img;
	vector<KeyPoint> point;
	map<string, Mat> result;
};

int  main()
{
	unique_ptr<ORBFeature> p(new ORBFeature);
	p->TestORB();
	p->Show();
	return 0;
}

OpenCV ORB特征检测(22)_#include

OpenCV SER特征检测

MSER是极值区域检测算法,MSER类根据输入参数判断是否为彩色or灰度图像进行不同的算法检测。若输入为灰度图像,那么采取MSER极值区域检测算法,若输入为彩色图像,则采用MSCR极值区域检测算法,可以用于图像的斑点区域检测。业界认为是性能最好的仿射不变区域,MSER是当使用不同的灰度阈值对图像进行二值化时得到的最稳定的区域,特点:

  • 对于图像灰度的仿射变化具有不变性
  • 稳定性,区域的支持集相对灰度变化稳定
  • 可以检测不同精细程度的区域

MSER算法大致流程

  • 使用一系列灰度阈值对图像进行二值化处理
  • 对于每个阈值得到的二值图像,得到相应的黑色区域与白色区域
  • 在比较宽的灰度阈值范围内保持形状稳定的区域就是MSER特征
  • 评判标准: dA/dtA: 二值图像区域面积,t: 灰度

API介绍

static Ptr<MSER> create( int delta=5, int min_area=60, int max_area=14400,double max_variation=0.25, double min_diversity=.2,int max_evolution=200, double area_threshold=1.01,double min_margin=0.003, int edge_blur_size=5 );
/*******************************************************************
*			delta: 						两个区域间的灰度差			
*			min_area:	    			剔除小于此值的区域
*			max_area:					剔除大于此值的区域
*			max_variation:				剔除灰度值变化时,区域变化为此倍数的区域
*			min_diversity:  			当前区域与稳定区域的变化率
*			max_evolution:				位置变化步长
*			area_threshold: 			重新初始化的面积阈值
*			min_margin: 				最小边缘尺寸
*			edge_blur_size: 			边缘滤波的孔径尺寸	
*********************************************************************/
virtual void detect( InputArray image,std::vector<KeyPoint>& keypoints,InputArray mask=noArray());
/*******************************************************************
*			image: 				输入图				
*			keypoints:	        角点信息
*			mask:				计算亚像素角点区域大小			
*********************************************************************/
void drawKeypoints( InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage,const Scalar& color=Scalar::all(-1), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT );
/*******************************************************************
*			image: 				输入图				
*			keypoints:	        角点信息
*			outImage:			计算亚像素角点区域大小
*			color:  			颜色
*			flags:				绘制匹配标记				
*********************************************************************/

综合代码

#include <iostream>
#include <map>
#include <new>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class MSERFeature
{
public:
	MSERFeature() :img(imread("mm.jpg"))
	{
		result["img"] = img;
	}
	void TestMSER()
	{
		Ptr<ORB> mser = ORB::create();
		mser->detect(img, point);
		drawKeypoints(img, point, result["mser"], Scalar(255, 0, 255));
	}
	void Show()
	{
		for (auto& v : result)
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
protected:
	Mat img;
	vector<KeyPoint> point;
	map<string, Mat> result;
};

int  main()
{
	unique_ptr<MSERFeature> p(new MSERFeature);
	p->TestMSER();
	p->Show();
	return 0;
}

OpenCV ORB特征检测(22)_灰度_02

OpenCV SimpleBlob特征检测

SimpleBlob是检测斑点类的特征点,斑点本质其实是一组连通的像素在图像中共享一些共同的属性(如灰度值、颜色等)

SimpleBlob检测大致流程

  • 图像分割(例如阈值化操作)
  • 连通性分析
  • 特征量计算

API介绍

static Ptr<SimpleBlobDetector>create(const SimpleBlobDetector::Params ¶meters = SimpleBlobDetector::Params());
/*******************************************************************
*			parameters: Params结构体		
* 		SimpleBlobDetector::Params params;
* 		阈值控制
* 		params.minThreshold = 10;
* 		params.maxThreshold = 200;
*		像素面积大小控制
* 		params.filterByArea = true;
* 		params.minArea = 1000;
* 		形状(凸)
* 		params.filterByCircularity = false;
* 		params.minCircularity = 0.7;
* 		形状(凹)
* 		params.filterByConvexity = true;
* 		params.minConvexity = 0.9;
* 		形状(圆)
*		params.filterByInertia = false;
* 		params.minInertiaRatio = 0.5;
*********************************************************************/
virtual void detect( InputArray image,std::vector<KeyPoint>& keypoints,InputArray mask=noArray());
/*******************************************************************
*			image: 				输入图				
*			keypoints:	        角点信息
*			mask:				计算亚像素角点区域大小			
*********************************************************************/
void drawKeypoints( InputArray image, const std::vector<KeyPoint>& keypoints, InputOutputArray outImage,const Scalar& color=Scalar::all(-1), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT );
/*******************************************************************
*			image: 				输入图				
*			keypoints:	        角点信息
*			outImage:			计算亚像素角点区域大小
*			color:  			颜色
*			flags:				绘制匹配标记				
*********************************************************************/

综合代码

#include <iostream>
#include <map>
#include <new>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class BLOBFeature
{
public:
	BLOBFeature() :img(imread("mm.jpg"))
	{
		result["img"] = img;
	}
	void TestBLOB()
	{
		SimpleBlobDetector::Params params;
		params.minThreshold = 1;
		params.maxThreshold = 200;
		params.filterByArea = true;
		params.minArea = 10;
		params.filterByCircularity = true;
		params.minCircularity = 0.7;
		params.filterByConvexity = true;
		params.minConvexity = 0.9;
		 params.filterByInertia = true;
		params.minInertiaRatio = 0.5;
		Ptr<SimpleBlobDetector> blob = SimpleBlobDetector::create(params);
		blob->detect(img, point);
		drawKeypoints(img, point, result["blob"], Scalar(255, 0, 255));
	}
	void Show()
	{
		for (auto& v : result)
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
protected:
	Mat img;
	vector<KeyPoint> point;
	map<string, Mat> result;
};
int  main()
{
	unique_ptr<BLOBFeature> p(new BLOBFeature);
	p->TestBLOB();
	p->Show();
	return 0;
}

OpenCV ORB特征检测(22)_#include_03

标签:22,img,int,void,角点,像素,OpenCV,params,ORB
From: https://blog.51cto.com/u_15959862/6221871

相关文章

  • ubuntu22.4.1 部署Postgres12 、PostGIS、TimescaleDB
    参考文章https://www.postgresql.org/download/linux/ubuntu/一、postgres数据库安装#Createthefilerepositoryconfiguration:1.sudosh-c'echo"debhttp://apt.postgresql.org/pub/repos/apt$(lsb_release-cs)-pgdgmain">/etc/apt/sources.list.d/pgdg.l......
  • 连网技术与网络管理2023-04-22
    vlan是datalinklayer中比较重要的一个协议?VLAN(VirtualLocalAreaNetwork)isalogicalgroupingofdevicesonanetworkbasedontheirfunctions,projectteams,orapplications.ItenablesnetworkadministratorstopartitionaphysicalLANintomultiple......
  • 61 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库用户
    61openEuler22.03-LTS搭建MySQL数据库服务器-管理数据库用户61.1创建用户可以使用CREATEUSER语句来创建一个或多个用户,并设置相应的口令。CREATEUSER'username'@'hostname'IDENTIFIEDBY'password';其中:username:用户名。hostname:主机名,即用户连接数据库时所在的主......
  • 【DP】LeetCode 221. 最大正方形
    题目链接221.最大正方形思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即nu......
  • 洛谷P2241 统计方形 ,棋盘问题升级板,给出格子坐标中矩形以及正方形的计算方法
    在做这道题之前我们先了解一下棋盘问题棋盘问题(qq.com)......
  • [2022编思1062]找出最少动作数
    [2022编思1062]找出最少动作数题面有一个栈,这个栈有\(m\)个状态,每个状态记为\(S_i\)每个状态里面有\(n\)种数字,数字\(i\)有\(a_i\)个。考虑从全空,依次经历\(S_1...S_m\),让操作数最小化。sov是一个神奇的区间DP。考虑对于某个区间\(S_i...S_j\),从开始塞进去不用动的数字有\(......
  • 4.22团队
    已实现:1,用户信息的注册与人脸数据的录入2,可实现通过人脸信息的打卡签到。3,保存人脸数据未来目标:1,活体检测(目前无法准确识别真人与照片)2,会议管理相关功能。3,优化app的界面。       ......
  • 关于在visual Studio 2022中无法找到 ASP.NET Core Web Application 或 ASP.NET Core
    在学习ASP.NETCoreWebApplication时发现无论如何都无法找到这个模板,在翻遍论坛后都没有看到解决的方法,在我下载 visualStudio2017中终于找到了但是,你会发现他只能选择.netcore2.0这肯定是不符合我们写代码的,因为他太老了,但在2022中确实找不到    这......
  • COMP2212编程概念
    COMP2212ProgrammingLanguageConceptsCourseworkIntroductionInthiscourseworkyouarerequiredtodesignandimplementadomainspecificprogramminglanguageforspecifyingtilingpatterns.Forthepurposesofthisassignmentweconsideratiletobeasq......
  • 2022-第十三届蓝桥杯大赛个人赛省赛(软件类)真题C大学C组
    返回目录题目一览:A.排列字母B.特殊时间C.纸张尺寸D.求和E.数位排序F.选数异或G.消除游戏H.重新排序I.技能升级J.重复的数   A.排列字母   B.特殊时间   C.纸张尺寸   D.求和   E.数位排序   F.选数异或   G.消除游戏......