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

OpenCV 特征检测(21)

时间:2023-04-23 11:01:33浏览次数:33  
标签:std 21 img int 检测 角点 像素 OpenCV vector

FAST(features from accelerated segment test)是基于⾓点检测的图像特征,是公认的比较快速的特征点检测方法,只利用周围像素比较的信息就可以得到特征点,简单,有效。很多传统的算法都很耗时,而且特征点检测算法只是很多复杂图像处理里中的第一步,得不偿失。FAST算法思想是若某像素与其周围领域内足够多的像素点相差较大,则该像素可能是角点

FAST算法大致流程

  • 确定候选角点
  • 非极大值抑制

API介绍

static Ptr<FastFeatureDetector> create( int threshold=10,bool nonmaxSuppression=true,
FastFeatureDetector::DetectorType type=FastFeatureDetector::TYPE_9_16 );
/*******************************************************************
*			threshold: 					比较时边缘轨迹点和中心点的差值			
*			nonmaxSuppression:	    	是否使用非极大值抑制
*			type:						FastFeatureDetector枚举类型					
*						TYPE_5_8 从轨迹中取8个点,当有5个点满足条件,就是特征点.
*						TYPE_7_12 取轨迹12个点,7个满足条件,就是特征点.
*						TYPE_9_16 取轨迹16个点,当9个满足条件,就是特征点.
*********************************************************************/
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 FastFeature
{
public:
	FastFeature() :img(imread("mm.jpg"))
	{
		result["img"] = img;
	}
	void TestFAST()
	{
		Ptr<FastFeatureDetector> fast = FastFeatureDetector::create();
		fast->detect(img, point);
		drawKeypoints(img, point, result["SIFT"], 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<FastFeature> p(new FastFeature);
	p->TestFAST();
	p->Show();
	return 0;
}

OpenCV 特征检测(21)_特征点

opencv BRISK特征检测

BRISK(Binary Robust Invariant Scalable Keypoints)是一种二进制的特征描述算子。它具有较好的旋转不变性、尺度不变性,较好的鲁棒性(稳定性)等。在对有较大模糊的图像配准时,BRISK算法在其中表现最为出色。对描述子匹配时,采用汉明距离,进行二值匹配。

汉明距离:它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。例如:1011101 与 1001001 之间的汉明距离是 2。

BRISK算法大致流程

  • 建立尺度空间
  • 特征点检测
  • 非极大值抑制
  • 亚像素插值
  • 特征点描述
  • 高斯滤波
  • 局部梯度计算

API介绍

static Ptr<BRISK> create(int thresh=30, int octaves=3, float patternScale=1.0f);
/*******************************************************************
*			thresh: 					检测阈值				
*			octaves:	    			检测角度
*			patternScale:				邻域采样比例
*********************************************************************/
static Ptr<BRISK> create(const std::vector<float> &radiusList, const std::vector<int> &numberList,float dMax=5.85f, float dMin=8.2f, const std::vector<int>& indexChange=std::vector<int>());
/*******************************************************************
*			radiusList: 				关键点周围采样的半径				
*			numberList:	        		定义采样圆上的采样点数
*			dMax:						长配对阈值	
*			dMin: 						短配对阈值			
*			indexChange:	    		位的索引重新映射
*********************************************************************/
static Ptr<BRISK> create(int thresh, int octaves, const std::vector<float> &radiusList,const std::vector<int> &numberList, float dMax=5.85f, float dMin=8.2f,const std::vector<int>& indexChange=std::vector<int>());
/*******************************************************************
*			thresh: 					检测阈值				
*			octaves:	    			检测角度
*			radiusList: 				关键点周围采样的半径				
*			numberList:	        		定义采样圆上的采样点数
*			dMax:						长配对阈值	
*			dMin: 						短配对阈值		
*			indexChange:	    		位的索引重新映射
*********************************************************************/
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 BRISKFeature
{
public:
	BRISKFeature() :img(imread("mm.jpg"))
	{
		result["img"] = img;
	}
	void TestFAST()
	{
		Ptr<BRISK> fast = BRISK::create(10);
		fast->detect(img, point);
		drawKeypoints(img, point, result["BRISK"], 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<BRISKFeature> p(new BRISKFeature);
	p->TestFAST();
	p->Show();
	return 0;
}

OpenCV 特征检测(21)_特征点_02

opencv 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 特征检测(21)_角点_03

标签:std,21,img,int,检测,角点,像素,OpenCV,vector
From: https://blog.51cto.com/u_15959862/6216867

相关文章

  • agc021 vp记录
    abcd都是签到题[AGC021E]BallEatChameleons有\(n\)只变色龙,一开始都是蓝色。现在你喂了\(k\)次球,每次指定一只变色龙吃下你指定颜色的球。一只变色龙从蓝色变成红色当且仅当它吃的红球比蓝球多;一只变色龙从红色变成蓝色当且仅当它吃的蓝球比红球多。求最后能使所有......
  • OpenCV图像纹理(20)
    LBP描述LBP(LocalBinaryPattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T.Ojala,M.Pietikäinen,和D.Harwood在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征计算过程原始的LBP算子定义......
  • 今日总结0421
    今天是周五,满课的一天,上午是计算机网络和概率论。计算机网络讲了IPv6和IPv4的区别。概率论讲了数学期望的知识。今日解决的问题:解决了地图接口导航问题遇到的问题:依旧是昨天的问题,没有解决方法中传值的问题。明日要干什么:查查方法能不能解决......
  • Dlib 结合 Opencv 识别技术代码资料
    结合Dlibshap64面部识别#include<dlib/opencv.h>#include<opencv2/opencv.hpp>#include<dlib/image_processing/frontal_face_detector.h>#include<dlib/image_processing/render_face_detections.h>#include<dlib/image_processing.h>......
  • 2023 目标检测技术调研
     目标是找到一个实时的,能处理1080p视频流的算法,工程实现比较靠谱的项目 yolov7https://www.analyticsvidhya.com/blog/2022/08/yolov7-real-time-object-detection-at-its-best/https://viso.ai/deep-learning/yolov7-guide/ yolov8,2023年1月份https://github.com/ul......
  • MATLAB图像倾斜校正算法实现:图像倾斜角检测及校正|附代码数据
    全文下载链接:http://tecdat.cn/?p=13981最近我们被客户要求撰写关于图像倾斜校正算法的研究报告,包括一些图形和统计输出。在本文中,随着多媒体技术的不断发展,数码相机,高清拍照手机等多媒体设备已经在人们的生活中占据了越来越重要的地位通过采用图像处理技术,可以将数码设备采集......
  • 【读书笔记】ISBN9787121353932
     【前言】是否所有人都可以公平地享受科技发展带来的生产力进步?AIGC应用越完善,内容生产的社会必要劳动时间就越少,人工就越没有价值。全社会新增劳动岗位的速度很快就会跟不上AIGC应用取代人工的速度,而不会使用AIGC应用的劳动者可能将无法获得收入、无法进行消费,从而逐步被剥离......
  • 20-4-21--链表--两个有序链表序列的合并
    已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不......
  • 图像边缘检测(Canny)
    Canny检测的流程Canny检测主要是用于边缘检测1)使用高斯滤波器,以平滑图像,滤除噪声。 2)计算图像中每个像素点的梯度强度和方向。3)应用非极大值(Non-MaximumSuppression)抑制,以消除边缘检测带来的杂散响应4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘5)......
  • Microsoft PowerPoint LTSC 2021 for Mac(ppt演示工具) v16.73 beta版
    MicrosoftPowerPointLTSC2021forMac是一款专业的幻灯片演示软件,适用于苹果电脑。是office LTSC2021套装中的一个组成部分,与Word、Excel和Outlook等其他应用程序一起提供。PowerPointLTSC2021具有许多易于使用的工具和功能,可以帮助用户创建具有吸引力的演示文稿。Microsoft......