34-SURF特征匹配(EmguCV学习)

图像特征之SURF特征匹配 原文站点:https://senitco.github.io/2017/06/27/image-feature-surf/  加速鲁棒特征(Speed Up Robust Feature, SURF)和SIFT特征类似,同样是一个用于检测、描述、匹配图像局部特征点的特征描述子。SIFT是被广泛应用的特征点提取算法,但其实时性较差,如果不借助于硬件的加速和专用图形处理器(GPUs)的配合,很难达到实时 阅读详情

34-SURF特征匹配

Record


1、原理:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2、SURF类说明:
在这里插入图片描述


3、特征点的两种匹配方法:BF与Flann,,BF更加精确,运行时间更长,Flann计算速度更快,精度稍差;
在这里插入图片描述

应用场景

1、目标查找(具有尺度不变特点)
2、图像拼接(将多幅图像拼接起来)

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Drawing;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.Util;
using Emgu.CV.Util;
using Emgu.CV.XFeatures2D;      //包含SURF
using Emgu.CV.Features2D;       //包含Features2DToolbox
using Emgu.CV.Flann;

namespace lesson34
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src1 = CvInvoke.Imread("11.jpg");
            Mat src2 = CvInvoke.Imread("22.jpg");

            CvInvoke.Imshow("src1", src1);
            CvInvoke.Imshow("src2", src2);

            SURF surf = new SURF(400);
            //计算特征点
            MKeyPoint[] keyPoints1 =  surf.Detect(src1);
            MKeyPoint[] keyPoints2 =  surf.Detect(src2);
            VectorOfKeyPoint vkeyPoints1 = new VectorOfKeyPoint(keyPoints1);
            VectorOfKeyPoint vkeyPoints2 = new VectorOfKeyPoint(keyPoints2);
            Mat suft_feature1 = new Mat();
            Mat suft_feature2 = new Mat();
            //绘制特征点
            Features2DToolbox.DrawKeypoints(src1, vkeyPoints1, suft_feature1, new Bgr(0, 255, 0));
            Features2DToolbox.DrawKeypoints(src2, vkeyPoints2, suft_feature2, new Bgr(0, 255, 0));
            //显示特征点
            CvInvoke.Imshow("suft_feature1", suft_feature1);
            CvInvoke.Imshow("suft_feature2", suft_feature2);

            //计算特征描述符
            Mat descriptors1 = new Mat();
            Mat descriptors2 = new Mat();
            surf.Compute(src1, vkeyPoints1, descriptors1);
            surf.Compute(src2, vkeyPoints2, descriptors2);
            ///匹配方法1
            //设置暴力匹配器进行匹配显示
            //VectorOfVectorOfDMatch matches = new VectorOfVectorOfDMatch();
            //BFMatcher bFMatcher = new BFMatcher(DistanceType.L2);
            //bFMatcher.Add(descriptors1);
            //bFMatcher.KnnMatch(descriptors2, matches, 2, null);

            //筛选符合条件的匹配点
            //double min_dis = 100, max_dis = 0;
            //for (int i = 0; i < descriptors1.Rows; i++)
            //{
            //    不知道为啥会抛出异常
            //    try
            //    {
            //        if (max_dis < matches[i][0].Distance)
            //        {
            //            max_dis = matches[i][0].Distance;
            //        }
            //        if (min_dis > matches[i][0].Distance)
            //        {
            //            min_dis = matches[i][0].Distance;
            //        }
            //    }
            //    catch (Exception)
            //    {
            //        Console.WriteLine("exception...");
            //    }

            //}
            //VectorOfVectorOfDMatch good_matches = new VectorOfVectorOfDMatch();
            //for (int i = 0; i < matches.Size; i++)
            //{
            //    if (matches[i][0].Distance < 2 * min_dis)        //倍数关系自由调整
            //    {
            //        good_matches.Push(matches[i]);
            //    }
            //}
            //不使用掩膜,直接绘制出匹配的特征点
            //Mat result = new Mat();
            //Features2DToolbox.DrawMatches(src1, vkeyPoints1, src2, vkeyPoints2, good_matches, result,
            //                              new MCvScalar(0, 255, 0), new MCvScalar(0, 0, 255), null);
            //显示最终结果
            //CvInvoke.Imshow("match-result", result);
            //CvInvoke.WaitKey(0);

            ///匹配方法2-Flann快速匹配
            //创建Flann对象
            IIndexParams id = new LinearIndexParams();
            SearchParams sp = new SearchParams();
            FlannBasedMatcher flannBasedMatcher = new FlannBasedMatcher(id, sp);
            //添加模板
            flannBasedMatcher.Add(descriptors1);
            //计算匹配
            VectorOfVectorOfDMatch matches = new VectorOfVectorOfDMatch();
            flannBasedMatcher.KnnMatch(descriptors2, matches, 2, null);

            Mat mask = new Mat(matches.Size, 1, DepthType.Cv8U, 1);
            mask.SetTo(new MCvScalar(255));
            Features2DToolbox.VoteForUniqueness(matches, 0.7, mask); //计算掩膜
            //绘制并显示匹配的特征点
            Mat result = new Mat();
            Features2DToolbox.DrawMatches(src1, vkeyPoints1, src2, vkeyPoints2, matches, result, new MCvScalar(0, 255, 0),
                new MCvScalar(0, 0, 255), mask);

            CvInvoke.Imshow("match-result", result);
            CvInvoke.WaitKey(0);
        }
    }
}


效果

SURF的BF匹配:(不知道为啥出现了一对多的情况)
在这里插入图片描述
在这里插入图片描述

SURF的Flann匹配:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Emgucv不完整图像分割试验(十五)—— 匹配特征点的提取以及半透明显示连接线 有人求助说要将Emgucv模板匹配中的连接线半透明显示出来,没想多示例代码的集成度太高, Mat mask; FindMatch(modelImage, observedImage, out matchTime, out modelKeyPoints, out observedKeyPoints, matches, out... 阅读详情

相关推荐

C#图像处理 | EmguCV+OpenCVSharp二合一教程 你值得拥有

VS2017+EmguCV3.4高清入门视频教程 视频教程原链接如上,内容预览与目录如下 EmguCV+OpenCVSharp视频教程二合一版本 C#视觉开发者必备 EmguCV基础视频教程---第01讲(EmguCV介绍与安装配置) EmguCV基础视频教程---第01讲---补充更新(EmguCV3.4.1安装配置) EmguCV基础视频教程---第02讲(EmguCV自带例程赏析) EmguCV基础视频教程---第03讲(图像读取_显示_保...

Color Space的博客 4417

Emgucv SURF特征点的寻找和匹配

使用SURF类和其相关的函数需要添加Emgu.CV.Features2D和Emgu.CV.XFeatures2D这两个命名空间,同时也可以使用cuda模块来进行加速,由于使用Cuda需要安装,但Cuda目前支持的显卡驱动并不兼容win10,所以这里我就简单的说一下通用的方法吧。 这个代码里使用了UMat,UMat应该算是3.0版本中的新特性,根据官方的说法,UMat等价于Opencv中的Mat。具

k 2万+

EmGU(4.7) 和C#中特征检测算法详解集合

Emgu库是将OpenCV使用.net编程语言(C#)封装成的.net库。在实际软件开发中具有重要用途。图像特征提取是从原始图像中提取对图像识别、分类、检索等任务有用的信息。这些特征通常具有对变换、光照、尺度等因素的不变性,从而使得后续任务更为稳定和可靠。针对Emgu库中间不同版本之间Api函数差异大,而且目前缺少结合实际例子的Api学习,本文对Emgu原文档进行解读并配备实例进行演示。

lichaoqi1的博客 2457

SURF特征检测与匹配

好的特征应该具有以下几个特点: 重复性:不同图像相同的区域应该能被重复检测到,而且不受到旋转、模糊、光照等因素的影响; 可区分性:不同的检测子,应该可以被区分出来,而为了区分它们,应运而生的就是与检测对应的描述子了; 数量适宜:检测子可别太多,不然啥阿猫阿狗都能出来混,但也不能太少,要求太高可就招不到人才了; 高定位(尺度和位置):是在哪出现的,最好就在哪被找到,可别跑偏了; 有效性:检测速度越...

IT荻的博客 5529

emgucv4学习14---轮廓特征分析

emgucv4学习11---图像边缘检测_zhangdaoliang1的博客-优快云博客图像边缘主要是描述了图像的一个结构形状,包含图像的大量信息,也 是图像识别中重要的图像特征之一。从本质上说,图像边缘是图像局部特性 不连续的反映,它标志着一个区域的终结和另一个区域的开始。它存在目标 与背景,目标与目标,因此它是图分割所依赖的重要特性,也是纹理特征的 重要信息源和形状特征的基础,图像的纹理特性的提取依赖于图像的分割。 人对物体的识别很大程度上也是依赖于图像的边缘。边缘蕴含了丰富的内在 信...

qianxun 781

SURF算法特征点匹配实战指南

本文还有配套的精品资源,点击获取 简介:SURF算法作为一种快速的特征检测和描述方法,在计算机视觉领域被广泛应用。它能够在图像变换后保持良好的稳定性和不变性。本指南详细介绍SURF算法的基本原理,包括尺度空间极值检测、加速关键点定位、方向分配、特征描述符提取以及关键点匹配。同时,介绍了如何通过MATLAB实现SURF算法,并展示了其在图像匹配、目标识别、3D重建和增强现实等...

weixin_35750483的博客 1489

Surf算法特征点检测与匹配

Speeded Up Robust Features(SURF,加速稳健特征),是一种稳健的局部特征点检测和描述算法。最初由Herbert Bay发表在2006年的欧洲计算机视觉国际会议(Europen Conference on Computer Vision,ECCV)上,并在2008年正式发表在Computer Vision and Image Understanding期刊上。 Surf

牧野的博客 11万+

C#-EmguCV 特征匹配

C#版本EmguCV,实现特征匹配,对特征点进行处理,标识

基于emgucv和c#的书本特征匹配

文章目录前言一、主要步骤1.窗体设计2.引用命名空间3.主要算法3.结果总结题外话 前言 本blog是该系列文章的第一篇demo,主要功能是实现书本的目标检测,主要算法是用了sift特征匹配。 一、主要步骤 1.窗体设计 该窗体主要用到了两个imagebox,三个button,整体形状如图 2.引用命名空间 该功能需要引用 emgu.cv, emgu.cv.contrib, emgu.cv.ui, emgu.cv.uti 四个dll库,相应的命名空间如下 using System.Window..

bookshu6的博客 1417

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

【王道训练营 C/C++方向基础 60 题(31-40)】

王道训练营 C/C++方向基础 60 题(31-40)

qq_55805517的博客 3067

OpenCV中的SURF特征检测、匹配与对象查找

SURF算法工作原理选择图像中的POI(Points of interest) Hessian Matrix在不同的尺度空间发现关键点,非最大信号压制发现特征点方法、旋转不变性要求生成特征向量。

金戈鐡馬 2196

win x64下安装oracle 12c出现[INS-30131]报错的解决方案

问题:  win x64下安装oracle 12c出现[INS-30131]报错的解决方案 安装oracle11g碰到“无法访问临时位置”的问题,详细信息如下: INS-30131] 执行安装程序验证所需的初始设置失败。 原因 - 无法访问临时位置。   操作 - 请确保当前用户具有访问临时位置所需的权限。   附加信息:  - 所有节点上的框架设置检查都失败  

一条道走到黑的GISer 1347

sift、surf、orb 特征提取及最优特征点匹配

目录 sift sift特征简介 sift特征提取步骤 surf surf特征简介 surf特征提取步骤 orb orb特征简介 orb特征提取算法 ...

weixin_30466421的博客 3027

SQL Server2008详细安装步骤(超详细步骤)

https://pan.baidu.com/s/1yvolqfU-AbiuGrIzblA7pA 提取码:lzw81.下载好安装包后解压到除C盘以外的磁盘,避免系统卡顿2.使用管理员身份打开安装程序注意:使用管理员身份打开时,此时如果显示以下画面属于正常现象,下载安装即可。因为.net现在有很多软件都需要,包括SQLSERVER2008,它里面有visual studio都要有net,电脑系统没有的话安装一下好了。3.选择全新安装或向现有安装添加新功能4.点击确定5.出现以下画面之后,输入产品密钥即可(密钥在

m0_67402774的博客 4万+

Kindle使用USB数据线传书封面无法显示问题

不建议按这个解决封面问题,首先USB多次插拔麻烦,其次就是我起初按博主方法没啥问题,后面无论我怎么个顺序都出现了‘暂无图片’,我的建议是在亚马逊退出国内只能USB传书的情况下,下载一个calibre 和。飞行模式下用calibre传书到kindle ,然后用Fix Kindle Ebook Cover 修复一下,后面你要继续飞行模式还是连网随你便,两步完事。2,‘’发送到设备’的时候也最好选择 ‘发送特定格式至’ 选择具体的电子书格式,你的电子书是azw3就选azw3,是mobi就选mobi。

meser88的博客 7416

Emgu.CV训练自己的hog特征,可实现任意物体的检测

emgu.cv自行训练HOG,目前最详细的一篇C#资料

技术+管理+经验+沟通+人品=>合格的项目管理者 1万+

异步bus交互(一)— 两级DFF同步器

异步bus交互(一)— 两级DFF同步器 跨时钟域处理 & 亚稳态处理 1.问题产生 现在的芯片(比如SOC,片上系统)集成度和复杂度越来越高,通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会工作在另一个时钟频率下,而普通的信号又会工作在另外的时钟频率下。这3个不同时钟频率下工作的信号往往需要相互沟通和传递信号。 不同时钟域下的信号传递就涉及到跨时钟域信号处理,因为相互之间的频率、相位不一样,如果不做处理或者

qq_44816673的博客 5118

OpenCV第十三讲:SURF特征点的检测与匹配详解

Dog算子,SIFT特征点, Fast角点 ,ORB特征点 有时间慢慢再来解析 1. SURF的优势 SURF主要有以下几点优势 SURF是尺度不变特征变换算法(SIFT)的加速版,一般来说它比SIFT要快好几倍,且在多幅图像下具有更好的稳定性; SURF采用了harr特征+积分图像的概念,大大加快了程序的运行时间。 SURF可以应用于计算机视觉的物体识别以及3D重构 ...

Ian的博客 9692

cannot import name ‘BUFSIZE‘ from ‘numpy‘ 解决方案

本文主要介绍了cannot import name ‘BUFSIZE’ from ‘numpy’ 解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 22万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OpneCV3特征提取及匹配SURF算法(一)——SURF概述与代码演示

前言 一、SURF概述 1、SURF(Speed Up Robust Features)是加速具有鲁棒特性的特征算法,首先于2006年发表在ECCV大会由Herbert Bay等人提出,SURF对SIFT进行了改进,SIFT要加速的话得借助硬件或者专门的图像处理器(GPU)进行加速,SIFT算法很难达到实时处理的效果。 SURF使用海森矩阵(Hessian)的行列式值作特征点响应侦测并用积分图加速...

知来者逆的博客 2304

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

31-角点检测(EmguCV学习)

文章目录说明Code效果 说明 1、EmguCV中Harris角点检测函数:CvInvoke.CornerHarris(); 参数harrisResponse为CV_32FC1的图像,计算后需要进行归一化或者阈值化,转换为CV8U再显示; 参数blockSize : 领域大小,和协方差矩阵M的计算有关(影响M的值) 2、Harris检测的结果衡量(角点响应度量):M为协方差矩阵,度量R判断是否...

hello 1796

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

emgu cv hog 特征提取 与opencv 生成的结果略有区别

//////////////////////////////////////////////////////////////////参数设定////////////////////////////////根据自己的参数设置/////////////////////// Rectangle rc = new Rectangle(); rc.Width

911的专栏 3389

SURF特征点检测和匹配

SURF全称为“加速稳健特征”(Speeded Up Robust Feature),它们不仅是尺度不变特征,而且是具有较高计算效率的特征。 #include "highgui/highgui.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/legacy/legacy.hpp" #include &l...

YangYaYan的博客 749
上一篇: 33-SIFT特征匹配(EmguCV学习)
下一篇: 35-运动物体检测1(EmguCV学习)
hellohake
博客等级 码龄10年 4543粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值