【Shi-Tomasi角点检测+SIFT特征匹配】OpenCV&C++实现_opencv 4.0 shi-tomas c++-程序员宅基地

技术标签: SIFT  OpenCV  计算机视觉  角点检测  

在进行SIFT特征提取时,由于会提取数量较多的尺度空间特征点,会导致特征向量提取和特征点匹配环节的用时较长。在三维测量等应用条件下,角点是进行测量的关键点,因此采用Shi-Tomasi或Harris角点检测提取关键的特征点,可以减少冗余无效的特征点,提升运算的实时性。接下来介绍在编程时遇到的两个问题:

1.如何用角点提取结果生成特征描述子

Shi-Tomasi角点检测函数如下:

goodFeaturesToTrack(Left_Corner_graysrcImage,//输入图像
		Left_Corners,//检测到的角点的输出向量
		g_maxCornerNumber,//角点的最大数量
		qualityLevel,//角点检测可接受的最小特征值
		minDistance,//角点之间的最小距离
		Mat(),//感兴趣区域
		blockSize,//计算导数自相关矩阵时指定的邻域范围
		false,//不使用Harris角点检测
		k);//权重系数

可以看到角点提取的结果是

vector<Point2f>

这一类型的动态数组,而SIFT特征匹配的特征点输入是KeyPoint类

 CV_WRAP KeyPoint();
    /**
    @param _pt x & y coordinates of the keypoint
    @param _size keypoint diameter
    @param _angle keypoint orientation
    @param _response keypoint detector response on the keypoint (that is, strength of the keypoint)
    @param _octave pyramid octave in which the keypoint has been detected
    @param _class_id object id
     */

因此需要进行转换。但是,若使用KeyPoint::convert()进行转换或直接使用detectandcompute()函数,转换出来的特征点仅有一个Point2f类型的成员变量pt即坐标信息被输入,很多重要的参数,如主方向、尺度空间信息没有输入。因此用先detect后compute的方法或者使用父类Features2D下的另一个成员函数detectandcompute(),进行特征检测的结果都不具备旋转不变性,只能应用于双目对齐后的左右视图,现详细分析detectandcompute()函数:

1.1 detectandcompute()函数

函数的参数如下:

CV_WRAP virtual void detectAndCompute( InputArray image, InputArray mask,
                                           CV_OUT std::vector<KeyPoint>& keypoints,
                                           OutputArray descriptors,
                                           bool useProvidedKeypoints=false );

最后一个参数布尔变量useProvidedKeypoints是用于判定是否使用其他检测方法检测出的特征点信息进行输入,若为false则代表使用SIFT特征检测的结果作为输入,若为true则代表采用外源输入。下面这一部分是useProvidedKeypoints为true即采用外源输入的代码:

 if( useProvidedKeypoints )
    {
    
        firstOctave = 0;
        int maxOctave = INT_MIN;
        for( size_t i = 0; i < keypoints.size(); i++ )
        {
    
            int octave, layer;
            float scale;
            unpackOctave(keypoints[i], octave, layer, scale);
            firstOctave = std::min(firstOctave, octave);
            maxOctave = std::max(maxOctave, octave);
            actualNLayers = std::max(actualNLayers, layer-2);
        }

        firstOctave = std::min(firstOctave, 0);
        CV_Assert( firstOctave >= -1 && actualNLayers <= nOctaveLayers );
        actualNOctaves = maxOctave - firstOctave + 1;
    }

可以看到特征点位置参数在内部进行了赋值。(可以自行查看源代码)
因此我们也可以采用detectandcompute函数进行特征描述子计算。

2.如何用RANSCA算法剔除误匹配点

这部分直接上代码,采用的是用findHomography函数计算单应性矩阵,然后将左图特征点单应性变换到右图上,与右图上的特征点计算误差距离。若距离大于一定阈值则剔除。

//【10】计算单应性矩阵H,用RANSCA剔除误匹配点
	vector<Point2f> Left_Matches, Right_Matches;
	int Match_Points_Num = matches.size();
	for (int i = 0; i < Match_Points_Num; i++)//将得到的左右匹配结果点分别存入动态数组
	{
    
		Left_Matches.push_back(Left_Keypoints[matches[i].queryIdx].pt);
		Right_Matches.push_back(Right_Keypoints[matches[i].trainIdx].pt);
	}
	Mat H = findHomography(Left_Matches, Right_Matches, CV_RANSAC);
	vector<char> mask(Left_Matches.size());
	vector<Point2f> Left_Matches_Aftertrans;
	perspectiveTransform(Left_Matches, Left_Matches_Aftertrans, H);
	
	for (int i = 0; i < Right_Matches.size(); i++)//剔除误差范数大于5的点
	{
    
		if (norm(Right_Matches[i] - Left_Matches_Aftertrans[i]) <= 5)
		{
    
			mask[i] = 1;
		}
	}
	Mat img_matches;
	drawMatches(Left_Corner_srcImage, Left_Keypoints, Right_Corner_srcImage,Right_Keypoints, 
		matches, img_matches, Scalar::all(-1), Scalar::all(-1), mask, DrawMatchesFlags::DEFAULT);

匹配结果:
在这里插入图片描述
该工程的代码可以在我的github主页上看到:
https://github.com/Yaoevol/Detect_and_Match

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40690316/article/details/102941181

智能推荐

2021电赛F题-智能送药小车-国一_电赛送药小车国一多少分-程序员宅基地

文章浏览阅读4.3k次,点赞22次,收藏119次。2021电赛F题-智能送药小车-国一B站视频链接:https://www.bilibili.com/video/BV1u44y1e7qk/(这大概是b站第一个双车视频吧,嘿嘿????)全部代码开源-下载链接:https://download.csdn.net/download/my_id_kt/76744664(记得先看readme哈)(也可以从b站链接简介处下载gittee上的,内容一致)有任何问题欢迎评论或者私信文章目录2021电赛F题-智能送药小车-国一一、原题(了解可以跳过)二、赛题分析_电赛送药小车国一多少分

deep-learing环境搭建-NVIDIA显卡驱动安装_deeplear 显卡-程序员宅基地

文章浏览阅读313次。本人机子配置 i5 GT610 ubuntu 16.04 64位 过程是很痛苦的,折腾好长时间,重装系统也好几次,总之最后是弄好的,在这记录下。开始装驱动时,也是在网上一通找,根据一个好点的教程弄,ppa源安装驱动https://blog.csdn.net/ghw15221836342/article/details/79571559满心欢喜的没有出问题,可是最后竟然登录不了,..._deeplear 显卡

/proc/meminfo解析-程序员宅基地

文章浏览阅读785次,点赞24次,收藏25次。/proc/meminfo内容解析

饮食不规律,脾胃出现问题的人越来越多,该怎么办?-程序员宅基地

文章浏览阅读131次。脾与胃都是独立的器官,但是它们关系密切,人们平时吃完食物后,食物一开始会在胃中磨碎消化,其次就会经过脾进行消化吸收,将营养输送到全身各处,如果是胃不好的人,可能就会引起食欲不振、消化不良、腹胀腹泻、打嗝等。随着生活节奏的加快,加上大多数人饮食上的不注意,经常喝冰吃辣的,脾胃出现问题的人越来越多,比如胃痛、消化不良、便秘、腹泻等。在中医中,脾胃为后天之本,脾胃是非常重要的,因为脾胃功能受损会导致很多疾病。脾胃虚弱的人通常表现睡眠质量差,失眠,早醒多梦,经常半夜惊醒,然后就很难再次入睡。

Vmware虚拟机和Ubuntu16.04遇到的问题(持续完善~~)_为什么ubantu虚拟机的时候没让选择地区-程序员宅基地

文章浏览阅读1.6k次。一、 想要sudo apt-get install 工具 或者sudo apt-get update出现问题source本身的问题根据提示,我们首先应当 apt-get update 一下source,如果在apt-get update后依然报这个error,那就说明这个source本省就有错误,尝试apt-get update --fix-missing后依旧报这个error,果断换sour..._为什么ubantu虚拟机的时候没让选择地区

Maven setting配置_maven setting文件配置-程序员宅基地

文章浏览阅读234次。mirrors标签用于配置镜像,镜像可以用于替换仓库的路径_maven setting文件配置

随便推点

MXNet转onnx问题点记录_onnx bn层-程序员宅基地

文章浏览阅读961次,点赞2次,收藏3次。MXNet转onnx问题点记录MXnet转onnx时碰到的问题记录主要问题总结MXnet转onnx时碰到的问题记录最近将mxnet转onnx时碰到很多问题,在查找过程中发现解决方法,特记录下;转换过程主要参考如下链接中的解决方法mxnet模型转onnx模型 作者liguiyuan112 Insightface中ArcFace MxNet2ONNX踩坑MXNet Symbol Batch Normalization fix_gamma=True转ONNX方法主要问题转换时BN层出现错误on_onnx bn层

Wireshark:当网口列表中没有自己需要的本地连接时的解决办法之一_wireshark便携版 没有本地连接-程序员宅基地

文章浏览阅读3.9k次。Wireshark:当网口列表中没有自己需要的本地连接时的解决办法之一**问题:**在使用wireshark去抓取手机的数据包时,利用360wifi为手机提供热点,打开wireshark后再网口列表中没有列出手机使用的网口。解决方法:win+R输入cmd,输入ipconfig后找到自己手机连接的网口名(此处应该是本地连接*2,但是截图时没连接)打开控制面板—》网络和Internet—》查..._wireshark便携版 没有本地连接

linux执行脚本中方法,Linux中执行shell脚本命令的4种方法总结-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏11次。bash shell 脚本的方法有多种,现在作个小结。假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限。方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本:复制代码 代码如下:cd /data/shell./hello.sh./的意思是说在当前的工作目录下执行hello.sh。如果不加上./,bash可能会响..._linux 怎么调用shell脚本中的方法

Dubbo服务调用过程?_dubbo status = 20, event = false, error = null,-程序员宅基地

文章浏览阅读685次。简单的想想大致流程在分析Dubbo的服务调用过程前我们先来思考一下如果让我们自己实现的话一次调用过程需要经历哪些步骤?首先我们已经知晓了远程服务的地址,然后我们要做的就是把我们要调用的方法具体信息告知远程服务,让远程服务解析这些信息。然后根据这些信息找到对应的实现类,然后进行调用,调用完了之后再原路返回,然后客户端解析响应再返回即可。调用具体的信息那客户端告知服务端的具体信息应该包含哪些呢?首先客户端肯定要告知要调用是服务端的哪个接口,当然还需要方法名、方法的参数类型、方法的参._dubbo status = 20, event = false, error = null,

ATR指标详细介绍-程序员宅基地

文章浏览阅读1.1w次。为想要了解外汇技术指标或者怎样分析做外汇以及如何使用市场ATR指标,以及ATR指标详细的计算方法、应用分析、使用方法、以及对外汇新手普及一些ATR知识。希望被采纳。工具/原料笔记本MT4平台方法/步骤 ATR指标详细介绍 ATR又称 Average _atr指标

iOS逆向学习笔记之--砸壳和导出应用头文件_dump.py -l-程序员宅基地

文章浏览阅读1.6k次。iOS逆向学习笔记之–砸壳和导出应用头文件dumpdecrypted砸壳工具的使用1、下载源代码git clone https://github.com/stefanesser/dumpdecrypted.git 2、进入dumpdecrypted文件夹目录。使用make命令生成dumpdecrypted.dylib文件 3、ssh登录越狱手机,关闭所有应用,启动需要砸壳的目标应用..._dump.py -l