opencv里,用sift surf 比较和surf进行跟踪的这段源码怎么理解

SiftFeatureDetector銆傛娴嬪嚱鏁板嚭闂浜嗭紵-opencv,sift,鐗瑰緛妫娴媐eature-detection,surf-CodeGo.net
SiftFeatureDetector銆傛娴嬪嚱鏁板嚭闂浜嗭紵
鎴戜竴鐩村皾璇昐IFT / SURF浠庣綉涓婅祫婧愶紝鎯虫祴璇曚竴涓嬭嚜宸便
鎴戜紭鍏堟灏濊瘯娌℃湁闈炶嚜鐢辫繖娈典唬鐮侊細
int _tmain(int argc, _TCHAR* argv[])
Mat img = imread("c:\\car.jpg", 0);
Ptr&FeatureDetector& feature_detector = FeatureDetector::create("SIFT");
vector&KeyPoint&
feature_detector-&detect(img, keypoints);
drawKeypoints(img, keypoints, output, Scalar(255, 0, 0));
namedWindow("meh", CV_WINDOW_AUTOSIZE);
imshow("meh", output);
waitKey(0);
鍦ㄨ繖閲岋紝濡傛灉鎴戝仛涓姝ユ璋冭瘯瀹冩墦鐮村湪feature_detector-&detect(img, keypoints);鐒跺悗锛屾垜闈瀎ree鐨勫浘涔﹂锛屽苟璇曞浘楠岃瘉鐮侊細
int main(int argc, char** argv)
const Mat input = cv::imread("/tmp/image.jpg", 0); //Load as grayscale
SiftFeatureD
vector&KeyPoint&
detector.detect(input, keypoints);
// Add results to image and save.
drawKeypoints(input, keypoints, output);
imwrite("/tmp/SIFT_RESULT.jpg", output);
杩欎釜娌℃湁閿欒锛屼絾璺戠殑鏃跺欙紝鎵撶牬浜嗚繖涓姝ワ細detector.detect(input, keypoints);鎴戞壘涓嶅埌鍘熷洜銆傛垜浠彲浠ヨ鍑哄湪杩欓噷銆
缂栬緫锛氳繖鏄垜寰楀埌鐨勬椂鍊欏畠鎵撶牬浜嗛敊璇細
鏈鐞嗙殑寮傚父鍦⊿IFT.exe 0x007f00005锛氬瓨鍙栬繚瑙勮鍙栦綅缃銆
鎴戠殑璁剧疆锛氬井杞殑Visual C ++2010涓 CodeGo.net锛屽熀浜嶰penCV 2.4.2锛學indows XP涓傛墍鏈
娣诲姞鍜岄摼鎺ュ簱
鏈枃鍦板潃 锛欳odeGo.net/520257/
-------------------------------------------------------------------------------------------------------------------------
1. 浣跨敤褰╄壊鍥惧儚鐏板害涓嶏紝瀹冨伐浣滅殑鏂瑰紡銆
浣犲彲浠ヨ瘯璇曡烦缁斥滃父閲忊濅篃涓鏍凤紝濡傛灉褰╄壊鍥惧儚灏嗕笉鑳藉伐浣溿
const Mat input = cv::imread("/tmp/image.jpg");
鏈枃鏍囬 锛歋iftFeatureDetector銆傛娴嬪嚱鏁板嚭闂浜嗭紵
鏈枃鍦板潃 锛欳odeGo.net/520257/
Copyright 漏 2014 CodeGo.net& & opencv 图像特征
opencv 图像特征
图文OpenCV的feature2d module中提供了从局部图像特征(Local image feature)的检测、特征向量(feature vector)的提取,到特征匹配的实现。其第4页通过使用OpenCV可以很容易的实现给予图像特征的图片匹配。本文给出了实现图片匹配的实现思路和C++代码逻辑。详细说明:基于OpenCV的图像特征点提取,并有效实现两幅图像的特征点匹配,在VC++6.0下调试通过,可以运行。-OpenCV based on extraction of image feature points ...标签: 图像特征提取 opencv 杂谈 分类: 机器视觉 图像特征检测总结 图像特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像...利用opencV和C语言编写,利用纹理特征比较两幅图像的相似度... openCV纹理图像特征提取,比较两幅图像的相似度 资源大小:5.76MB上传日期:...2个回答&-&提问时间:&日最佳答案:&http://openbio.sourceforge.net/resources/eigenfaces/eigenfaces-html/facesOptions.html /2010/04/matrix-and.../question/2753883...&& opencv图像预处理 自己弄的opencv图像遇处理 需要在vc中安装opencv. fighter 日[编辑].自己弄的opencv图像遇处理 需要在vc中安装opencv. fighter ...图文通过这种方法可以为图像中每个像素计算出其H行列式的决定值,并用这个值来判别特征... /* * A Demo to OpenCV Implementation of SURF * Further Information Refer...9条回复&-&发帖时间:&日本帖最后由 OpencvChina_obj 于
15:27 编辑 opencv实现的surf特征提取及其图像匹配源代码打包下载: 密码是:opencvchina部分代码如下:...图文ASIFT+OpenCV图像特征匹配实战[日期:] 来源:Linux社区 作者:wwy851 [字体:大 中 小] OpenCV包含头文件:#include &cv.h&
#include &highgui.h&...详细说明:提取图像的特征,用openCV实现,包括图像颜色直方图,形状特征,纹理特征等。-get features of images,all kinds of images.文件列表(点击判断是否您需要的...openCV纹理图像特征提取,比较两幅图像的相似度 资源大小:5.76MB上传日期:资源积分:10分下载次数:159上传者:smallwind1发私信资源类型:代码类...OpenCV的feature2d module中提供了从局部图像特征(Local image feature)的检测、特征向量(feature vector)的提取,到特征匹配的实现。其opencv是一个新兴计算机视觉工具,可对图像特征进行提取,对图像分类,很方便。... opencv是一个新兴计算机视觉工具,可对图像特征进行提取,对图像分类,很方便。...opencv 图像跟踪,两个图像特征点的匹配 资源大小:4KB上传日期:资源积分:3分下载次数:87上传者:liujigang12345发私信标签: 跟踪,图像,opencv ... [hough.rar] - 图像处理之 opencv 用hough变换检测圆 [sift.rar] - 根据opencv给出的sift特征提取源代码所写的SIFT算法流程,对理解SIFT算法有一定的帮助 [sift...详细说明:基于opencv的SIFT图像特征跟踪程序,应用于视频序列中跟踪图像特征-Opencv-based SIFT feature tracking program, used to track image features in video ...index next | previous | OpenCV 2.3.2 documentation
OpenCV API Reference
features2d. 二维图像特征框架
特征检测子(关键点)与描述子 FAST MSER ...1个回答 -提问时间:日知道达人:最佳答案:opencv有一个灰度共生矩阵能计算这些,但是那个类是在cxcore中定义的,实际使用也发现该函数存在问题(内存泄露,根据网上的改完,你实际使用...13条回复&-&发帖时间:&日在图像处理上时,我想提取这些不规则特征孔的轮廓,然后计算这些不规则特征孔的型心,该用什么方法啊?盼回复!wscrg
OpenCV初中生 帖子: 42 注册:
8...2个回答&-&提问时间:&日单步调试一个一个特征点,看相对应的scale值,或者作一个循环,累加输出图文 《图像局部不变性特征与描述》是按照概念-理论-方法-实例思路来依次组织的。第1章介绍有关局部不变性的历史沿革和基本概念,第2章介绍有关局部不变性的尺度空间...日&-&opencv是一个新兴计算机视觉工具,可对图像特征进行提取,对图像分类,很方便。... opencv是一个新兴计算机视觉工具,可对图像特征进行提取,对图像分类,很方便...ASIFT+OpenCV图像特征匹配实战VC工程源码 OpenCV包含头文件: #include &cv.h& #include &highgui.h& #include &cxcore.h& 核心代码如下: if (!m_pImage1||...ASIFT+OpenCV图像特征匹配实战VC工程源码 OpenCV包含头文件: #include &cv.h& #include &highgui.h& #include &cxcore.h& 核心代码如下: if (!m_pImage1||...图文[转载]图像特征描述子性能比较( 13:35:48) 转载▼标签: 特征描述子 brief feature descriptor lazy opencv orb sift surf 分类: 计算机视觉 ...&评分:4.5/5&68页openCV 配置和 opencv图像处理入门 - 基本数据结构 机器视觉科研教学团队 OpenCV的配置 使用OpenCV帮助文档 打开一幅图像 2 VC6下安装与配置 OpenCV...详细说明:基于OpenCV实现相近两幅图像的特征匹配-OpenCV implementation based on similar characteristics of the two images match文件列表(点击判断是否您需要的文件,...详细说明:基于OpenCV的Harris图像特征点提取,在VC++6.0下调试通过,可以运行-OpenCV image based on the Harris feature point extraction, in VC++6.0 under ...所属分类: OpenCV
开发工具: Visual C++
文件大小: 627 KB
下载次数: 66
提供者: xuwanting 详细说明:opencv下的图像sift特征...详细说明:利用opencv进行图像特征抽取,包括使用高斯滤波和sobel算子进行边缘提取,使用harris算法进行角点检测,使用hough变换找出图像中最长直线,使用Ranec算法找出图像中...详细说明:surf 方法 直接能运行 配上opencv 图像特征点匹配 sift方法的改进版本,在时间上面大大提高同时在光照方面比sift要好很多-Methods can be run directly ...详细说明:基于opencv寻找输入图像特征点的程序,能清楚准确找到角点相关的兴趣点。-Program based opencv find the feature points of the input image, clearly and...详细说明:基于OpenCV的图像像素校正,利用特征点提取,校正三相机系统像素偏差的数据值,为采集程序提高校正依据-Feature point extraction, correcting pixel deviation of...详细说明:vc++和OpenCV结合找出图片中的角点,并且做出标记。此程序同时可以用于图片特征点的提取,用于特征匹配的后续开发做准备。-vc++ and OpenCV combination to...10条回复&-&发帖时间:&日 一般情况下图像的边沿含有图像的主要信息,利用图像边沿含有的信息可以做图像识别。本人原来写的基于卷积的“局部边沿方向特征” 效果还好,但是计算速度比较慢。这次的...2个回答&-&提问时间:&日最佳答案:&哈哈,我有一个基于opencv实现的sift,我把代码贴出来,你自己看看吧~~~ void sift_detector_and_descriptors(IplImage* i_left,IplImage* i_right) ...用opencv可以进行图像底层特征的提取吗?如颜色,纹理等,如何进行提取,谢谢大家帮助回答!
16:29 zhiyesashou | 分类:C/C++ 谢谢您的回答,但是对于RGB...
谁能帮我把这个opencv代码里的图像二值化的代码筛选出来?
查看同主题问题: 特征 提取 谁知道 opencv 图像 等待您来回答 CS作图的网站是多少? ...主要是图像特征提取方面的。同时,里面含有自编了canny、角点检测还有一些其他。里面每个文件均可以单独运行在VS20101平台下。(opencv2.1)-This is just a test ...
opencv 图像特征相关内容:
本文opencv 图像特征的相关文章
1、2、3、4、5、6、7、8、9、10、识别算法概述:&SIFT/SURF基于灰度图,一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次插值法得到精确特征点所在的层(尺度),即完成了尺度不变。二、在特征点选取一个与尺度相应的邻域,求出主方向,其中SIFT采用在一个正方形邻域内统计所有点的梯度方向,找到占80%以上的方向作为主方向;而SURF则选择圆形邻域,并且使用活动扇形的方法求出特征点主方向,以主方向对齐即完成旋转不变。三、以主方向为轴可以在每个特征点建立坐标,SIFT在特征点选择一块大小与尺度相应的方形区域,分成16块,统计每一块沿着八个方向占的比例,于是特征点形成了128维特征向量,对图像进行归一化则完成强度不变;而SURF分成64块,统计每一块的dx,dy,|dx|,|dy|的累积和,同样形成128维向量,再进行归一化则完成了对比度不变与强度不变。&haar特征也是基于灰度图,首先通过大量的具有比较明显的haar特征(矩形)的物体图像用模式识别的方法训练出分类器,分类器是个级联的,每级都以大概相同的识别率保留进入下一级的具有物体特征的候选物体,而每一级的子分类器则由许多haar特征构成(由积分图像计算得到,并保存下位置),有水平的、竖直的、倾斜的,并且每个特征带一个阈值和两个分支值,每级子分类器带一个总的阈值。识别物体的时候,同样计算积分图像为后面计算haar特征做准备,然后采用与训练的时候有物体的窗口同样大小的窗口遍历整幅图像,以后逐渐放大窗口,同样做遍历搜索物体;每当窗口移动到一个位置,即计算该窗口内的haar特征,加权后与分类器中haar特征的阈值比较从而选择左或者右分支值,累加一个级的分支值与相应级的阈值比较,大于该阈值才可以通过进入下一轮筛选。当通过分类器所以级的时候说明这个物体以大概率被识别。&广义hough变换同样基于灰度图,使用轮廓作为特征,融合了梯度信息,以投票的方式识别物体,在本blog的另一篇文章中有详细讨论,这里不再赘述。&特点异同对比及其适用场合:&三种算法都只是基于强度(灰度)信息,都是特征方法,但SIFT/SURF的特征是一种具有强烈方向性及亮度性的特征,这使得它适用于刚性形变,稍有透视形变的场合;haar特征识别方法带有一点人工智能的意味,对于像人脸这种有明显的、稳定结构的haar特征的物体最适用,只要结构相对固定即使发生扭曲等非线性形变依然可识别;广义hough变换完全是精确的匹配,可得到物体的位置方向等参数信息。前两种方法基本都是通过先获取局部特征然后再逐个匹配,只是局部特征的计算方法不同,SIFT/SURF比较复杂也相对稳定,haar方法比较简单,偏向一种统计的方法形成特征,这也使其具有一定的模糊弹性;广义hough变换则是一种全局的特征——轮廓梯度,但也可以看做整个轮廓的每一个点的位置和梯度都是特征,每个点都对识别有贡献,用直观的投票,看票数多少去确定是否识别出物体。SIFT/SURF算法的深入剖析——谈SIFT的精妙与不足&&&&&&& SURF算法是SIFT算法的加速版,opencv的SURF算法在适中的条件下完成两幅图像中物体的匹配基本实现了实时处理,其快速的基础实际上只有一个——积分图像haar求导,对于它们其他方面的不同可以参考本blog的另外一篇关于SIFT的文章。&&& 不论科研还是应用上都希望可以和人类的视觉一样通过程序自动找出两幅图像里面相同的景物,并且建立它们之间的对应,前几年才被提出的SIFT(尺度不变特征)算法提供了一种解决方法,通过这个算法可以使得满足一定条件下两幅图像中相同景物的某些点(后面提到的关键点)可以匹配起来,为什么不是每一点都匹配呢?下面的论述将会提到。&&&& SIFT算法实现物体识别主要有三大工序,1、提取关键点;2、对关键点附加详细的信息(局部特征)也就是所谓的描述器;3、通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。&&&&& 日常的应用中,多数情况是给出一幅包含物体的参考图像,然后在另外一幅同样含有该物体的图像中实现它们的匹配。两幅图像中的物体一般只是旋转和缩放的关系,加上图像的亮度及对比度的不同,这些就是最常见的情形。基于这些条件下要实现物体之间的匹配,SIFT算法的先驱及其发明者想到只要找到多于三对物体间的匹配点就可以通过射影几何的理论建立它们的一一对应。首先在形状上物体既有旋转又有缩小放大的变化,如何找到这样的对应点呢?于是他们的想法是首先找到图像中的一些“稳定点”,这些点是一些十分突出的点不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点,既然两幅图像中有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有相互对应的匹配点,正是基于这样合理的假设,SIFT算法的基础是稳定点。SIFT算法找稳定点的方法是找灰度图的局部最值,由于数字图像是离散的,想求导和求最值这些操作都是使用滤波器,而滤波器是有尺寸大小的,使用同一尺寸的滤波器对两幅包含有不同尺寸的同一物体的图像求局部最值将有可能出现一方求得最值而另一方却没有的情况,但是容易知道假如物体的尺寸都一致的话它们的局部最值将会相同。SIFT的精妙之处在于采用图像金字塔的方法解决这一问题,我们可以把两幅图像想象成是连续的,分别以它们作为底面作四棱锥,就像金字塔,那么每一个截面与原图像相似,那么两个金字塔中必然会有包含大小一致的物体的无穷个截面,但应用只能是离散的,所以我们只能构造有限层,层数越多当然越好,但处理时间会相应增加,层数太少不行,因为向下采样的截面中可能找不到尺寸大小一致的两个物体的图像。有了图像金字塔就可以对每一层求出局部最值,但是这样的稳定点数目将会十分可观,所以需要使用某种方法抑制去除一部分点,但又使得同一尺度下的稳定点得以保存。有了稳定点之后如何去让程序明白它们之间是物体的同一位置?研究者想到以该点为中心挖出一小块区域,然后找出区域内的某些特征,让这些特征附件在稳定点上,SIFT的又一个精妙之处在于稳定点附加上特征向量之后就像一个根系发达的树根一样牢牢的抓住它的“土地”,使之成为更稳固的特征点,但是问题又来了,遇到旋转的情况怎么办?发明者的解决方法是找一个“主方向”然后以它看齐,就可以知道两个物体的旋转夹角了。下面就讨论一下SIFT算法的缺陷。&&&&& SIFT/SURT采用henssian矩阵获取图像局部最值还是十分稳定的,但是在求主方向阶段太过于依赖局部区域像素的梯度方向,有可能使得找到的主方向不准确,后面的特征向量提取以及匹配都严重依赖于主方向,即使不大偏差角度也可以造成后面特征匹配的放大误差,从而匹配不成功;另外图像金字塔的层取得不足够紧密也会使得尺度有误差,后面的特征向量提取同样依赖相应的尺度,发明者在这个问题上的折中解决方法是取适量的层然后进行插值。SIFT是一种只利用到灰度性质的算法,忽略了色彩信息,后面又出现了几种据说比SIFT更稳定的描述器其中一些利用到了色彩信息,让我们拭目以待。&&&&& 最后要提一下,我们知道同样的景物在不同的照片中可能出现不同的形状、大小、角度、亮度,甚至扭曲;计算机视觉的知识表明通过光学镜头获取的图像,对于平面形状的两个物体它们之间可以建立射影对应,对于像人脸这种曲面物体在不同角度距离不同相机参数下获取的两幅图像,它们之间不是一个线性对应关系,就是说我们即使获得两张图像中的脸上若干匹配好的点对,还是无法从中推导出其他点的对应。以一般化视角串联霍夫变换(hough transform),从直线到圆再到广义霍夫变换& 计算机视觉中经常需要识别或者定位某些几何图形,比如直线、圆、椭圆,还有其他一些图形。检测直线的霍夫变换提供了在图像中寻找直线的一种算法,是最简单的一种情形,后来发展到检测圆、椭圆、还有一般图形的霍夫变换,其核心思想是把图像中属于某种图形的点集(二维)映射到一个点(可以是高维)上,这个点记录了点集中点的数目,使得程序通过搜索峰值找到该点,这个点就是后面要说到的图形的参数,而该参数的范围就叫做参数空间。霍夫变换不仅能够识别出图像中有无需要检测的图形,而且能够定位到该图像(包括位置、角度等),这就非常有用了。接下来将通过分析从简单到复杂的霍夫变换,导出霍夫变换的实质。&&&&&&& 直线:检测直线的霍夫变换使用含极坐标参数的直线表示型式简称极坐标式(不是极坐标方程,因为还是在笛卡尔坐标下表示)——& 其中的两个参数的意义如下图:&&为什么要用极坐标式而不直接用一般形式:ax+by=c(归一化可以去掉参数c),或者其他的如斜截式、截距式呢?首先它们都会遇到奇异情况,比如c=0,斜率=无穷大,其中一个截距=0;再一个是某些形式的参数空间不是闭的,比如斜截式的斜率k,取值范围从0到无穷大,给量化搜索带来了困难。而极坐标式就妙在距离和角度两个参数都是有界的,而且正余弦函数也有界不会发生奇异情况。&&&&&& 直线霍夫变换有两个参数,且这两个参数通过极坐标式相关联,所以程序在投票阶段(图形点集转换到一个点)只需要遍历其中一个,搜索峰值在二维参数空间进行。&&&&&&& 圆:霍夫变换检测圆使用圆的标准式就可以了——我们发现圆的方程又比直线多了一个参数,这三个参数通过上面的方程相关联,因此在投票阶段需要遍历其中两个,搜索峰值在三维参数空间进行。如果图像比较大,那么这样的遍历搜索是相当耗时的,所以为了满足实时性后来又发展出其他检测圆的霍夫变换,比如概率霍夫变换,结合梯度信息的霍夫变换。&&&&&& &&&&&& 霍夫变换检测椭圆如果使用椭圆的标准式,那么将会有五个参数,它们通过标准式相关,检测圆就已经相当耗时了,如果再用这中方程形式处理势必失去实际用途。&&&&&&& Ballard (1981) 一般化了霍夫变换(Hough,1962),利用图形梯度量加快算法速度,形成了广义霍夫变换。&&&&&&& 透过前面的检测直线、圆、广义霍夫变换,已经可以提取出霍夫变换的一个本质——给出图形的一个描述模式,比如图形点集的方程、函数、表格等,然后利用这个模式加上遍历参数空间,把属于该模式的图形点集投射到参数空间的一个点(实际的离散情况一般不会完美的集中到一点),这个点记录的是图形点数目。&&&&&& 广义霍夫变换之所以能处理任意形状的图形并不是找到了可以表示任意图形的方程(这是不可能的),而是使用表的形式描述一种图形,把图形边缘点坐标保存在一张表中,那么该图形就确定下来了,所以其实无论是直线(其实是线段)、圆、椭圆还是其他形状的几何图形,都可以使用同一方法处理,所不同的是这时候的图形是自定义的,是实在的,而代数方程表示的模式是连续的、抽象的,圆的方程只有一种,但自定义的圆却是无穷的,只要你认为它足够圆了就可以。当然两种表示都会有各自的优势和局限。有了表之后就需要找到一种可以把图形点集投射到参数空间的一点的转换算法,例如直线和圆霍夫变换通过方程(函数)及遍历把点集进行投射,使得属于某直线或圆的点集中到一个点;那么仅有一张描述图形边缘坐标点的表如何进行投射呢?我们可以把这张表看作是模板,进行模板匹配,大部分的点匹配成功也就可以理解为这些点都投射到一个点上,不过这时候不需要再搜索参数空间峰值了,这种模式可以认为是参数间没有任何关联,所以是完全的遍历。但有旋转加上缩放的情况模板匹配型的霍夫变换是十分耗时的,也可以想象成因为参数不相关所以增加遍历搜索时间。Ballard (1981) 的广义霍夫变换最精妙之处在于为参数增加了两个关联,使得有平移和旋转(无缩放)的情况只需要遍历一个参数,三个参数分别是图形的中心坐标(横纵),旋转角度(相对参考图形),Ballard 的算法预先把参考图形边缘点对中心的径向量保存起来,利用待搜索图形边缘点的梯度方向(用相对坐标轴的角度表示)作为索引找到相应的径向量,加上该量后就完成了投射,所以要遍历的参数只有旋转角度,所以说有两个关联。当然如果加上缩放就要遍历两个参数,这也只是和霍夫检测圆的规模一样而已。这种广义霍夫变换的图形表不再是直接保存坐标,而是边缘点的梯度加上径向量,给出了这些量同样的也就能够表示出一种图形了。然而这种广义霍夫变换也是有缺陷的,不少后来者提出了改进方法,这不在本文讨论范围。&&&&& 再来强调一次,霍夫变换就是通过图形的一种表示模式,加上一种转换方法,把图形的点集投射到一个点上以便检测。我们已经能够知道,参数个数越少,需要遍历的参数个数约少(关联越多),参数空间越小则处理速度越快。所以设计一种合理的转换方法非常关键。&&&&&& 对于一种图形,在现实世界中可以有多种形变,线性的如:平移、旋转、透视;非线性的如:径变、切变、扭曲。每多考虑一种形变都会增加参数,比如把椭圆看作是圆的透视形变,结果多了两个参数,理论上可以去遍历每一个参数空间,但这不能满足实时性要求,所以参数之间约束(关联)越多则处理速度越快,Ballard的广义霍夫变换就是例子,这就需要发挥主观创造力了。
想生一个这样的女儿,看到她笑,仿佛全世界都天晴了。想生一个这样的女儿,陪她看书,陪她成长,告诉她女孩的内涵比外表更重要。
作为女生,你是否大胆的展示自己的魅力?自信的挥洒自己的性感?女人当如此,不论遭遇什么困境,婚与否亦不重要,都别忘了爱自己。
林电锋话西游
小马发光520
2010Arthur
2010Arthur
请注意使用文明用语
画报点击数0
文章点击数023:15 提问
OpenCV建筑物该用SIFT,SURF或ORB比较适合来认证建筑物?
请问用SIFT,SURF或ORB比较适合来认证建筑物?希望可以实现快速,准确的建筑物认证。
按赞数排序
三种算法都只是基于强度(灰度)信息,都是特征方法,但SIFT/SURF的特征是一种具有强烈方向性及亮度性的特征,这使得它适用于刚性形变,稍有透视形变的场合;haar特征识别方法带有一点人工智能的意味,对于像人脸这种有明显的、稳定结构的haar特征的物体最适用,只要结构相对固定即使发生扭曲等非线性形变依然可识别;广义hough变换完全是精确的匹配,可得到物体的位置方向等参数信息。前两种方法基本都是通过先获取局部特征然后再逐个匹配,只是局部特征的计算方法不同,SIFT/SURF比较复杂也相对稳定,haar方法比较简单,偏向一种统计的方法形成特征,这也使其具有一定的模糊弹性;广义hough变换则是一种全局的特征——轮廓梯度,但也可以看做整个轮廓的每一个点的位置和梯度都是特征,每个点都对识别有贡献,用直观的投票,看票数多少去确定是否识别出物体。
221关注|78收录
1577关注|213收录
1091关注|492收录
其他相似问题10897人阅读
opencv(24)

SIFT(尺度不变特征变换,Scale-Invariant Feature Transform)是在计算机视觉领域中检测和描述图像中局部特征的算法,该算法于1999年被David Lowe提出,并于2004年进行了补充和完善。该算法应用很广,如目标识别,自动导航,图像拼接,三维建模,手势识别,视频跟踪等。不幸的是,该算法已经在美国申请了专利,专利拥有者为Lowe所在的加拿大不列颠哥伦比亚大学,因此我们不能随意使用它。
由于SIFT算法在计算机视觉的特征检测和特征描述中表现十分优异,因此该算法一经提出,就引起了广泛的关注。国内外对其研究的人很多,相关的资料也很多。在csdn中,有几位作者的文章对SIFT算法介绍得很详细,如网名为:zddhub、Rachel Zhang和xiaowei_cqu。由王永明和王贵锦所编著的,由国防工业出版社出版的《图像局部不变性特征与描述》也对该算法进行了详细的介绍。上述文章对我帮助很大。
经过一段时间的研究,并结合opencv中的源代码,自认为对SIFT算法有了一定的认识和体会,因此也写了一篇关于SIFT的文章。该文章共分为三部分,首先是SIFT的算法分析,然后是opencv的源码分析,最后是应用实例。在算法分析中,注意了每个细节的描述;在源码分析中,基本做到了每条代码都进行了注释;在应用实例中,列举了特征提取和图像匹配两个实例。
本想把这篇文章发表在这里,但文章比较长(有30多页),关键是公式太多,复制粘贴太麻烦,排版也不好。因此我把这篇文章分别上传到了csdn和百度文库,地址是:
/view/d7edd336c5ffa.html
http://download.csdn.net/detail/zhaocj/8294793
可以在线阅读,也可以免费下载(在这里,鄙视那些设置下载权限和积分的人!!!)。如果上述方法都不方便,可以留下email,向我索要。文章中错误的地方欢迎指正!
为了不使这篇博文过于空洞,我把这篇文章的第三部分粘贴在这里。
首先给出的是特征点的检测:
#include &opencv2/core/core.hpp&
#include &highgui.h&
#include &opencv2/imgproc/imgproc.hpp&
#include &opencv2/features2d/features2d.hpp&
#include &opencv2/nonfree/nonfree.hpp&
int main(int argc, char** argv)
Mat img = imread(&box_in_scene.png&);
//实例化SIFT类
vector&KeyPoint& key_
// descriptors为描述符,mascara为掩码矩阵
Mat descriptors,
Mat output_
//输出图像矩阵
sift(img,mascara,key_points,descriptors);
//执行SIFT运算
//在输出图像中绘制特征点
drawKeypoints(img,
//输入图像
key_points,
//特征点矢量
output_img,
//输出图像
Scalar::all(-1),
//绘制特征点的颜色,为随机
//以特征点为中心画圆,圆的半径表示特征点的大小,直线表示特征点的方向
DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
namedWindow(&SIFT&);
imshow(&SIFT&, output_img);
waitKey(0);
结果如下图所示:
上面的程序需要说明一点的是,如果需要改变SIFT算法的默认参数,可以通过实例化SIFT类的时候更改,例如我们只想检测20个特征点,则实例化SIFT的语句为:
&&SIFT sift(20);
下面给出利用描述符进行图像匹配的实例:
#include &opencv2/core/core.hpp&
#include &highgui.h&
#include &opencv2/imgproc/imgproc.hpp&
#include &opencv2/features2d/features2d.hpp&
#include &opencv2/nonfree/nonfree.hpp&
#include &opencv2/legacy/legacy.hpp&
int main(int argc, char** argv)
//待匹配的两幅图像,其中img1包括img2,也就是要从img1中识别出img2
Mat img1 = imread(&box_in_scene.png&);
Mat img2 = imread(&box.png&);
SIFT sift1, sift2;
vector&KeyPoint& key_points1, key_points2;
Mat descriptors1, descriptors2,
sift1(img1,mascara,key_points1,descriptors1);
sift2(img2,mascara,key_points2,descriptors2);
//实例化暴力匹配器——BruteForceMatcher
BruteForceMatcher&L2&float&&
//定义匹配器算子
vector&DMatch&
//实现描述符之间的匹配,得到算子matches
matcher.match(descriptors1,descriptors2,matches);
//提取出前30个最佳匹配结果
std::nth_element(matches.begin(),
//匹配器算子的初始位置
matches.begin()+29,
// 排序的数量
matches.end());
// 结束位置
//剔除掉其余的匹配结果
matches.erase(matches.begin()+30, matches.end());
namedWindow(&SIFT_matches&);
//在输出图像中绘制匹配结果
drawMatches(img1,key_points1,
//第一幅图像和它的特征点
img2,key_points2,
//第二幅图像和它的特征点
//匹配器算子
img_matches,
//匹配输出图像
Scalar(255,255,255));
//用白色直线连接两幅图像中的特征点
imshow(&SIFT_matches&,img_matches);
waitKey(0);
结果如下图所示:
程序是通过距离测度实现两幅图像描述符之间的比较的,距离越小,匹配性越好,越说明这两个描述符表示的是同一事物。描述符的匹配结果保存在匹配器算子matches中。如果直接使用matches,匹配效果并不好,因为它是尽可能的匹配所有的描述符。因此我们要进行筛选,只保留那些好的结果。在这里,我们利用排序,选择距离最小的前30个匹配结果,并进行输出。另外,matcher.match函数中,两个描述符的顺序一定不能写反,否则运行会出错。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:500509次
积分:7099
积分:7099
排名:第2228名
原创:85篇
评论:2528条
(1)(1)(2)(2)(1)(4)(2)(2)(1)(2)(1)(1)(2)(2)(2)(2)(1)(2)(2)(2)(5)(3)(2)(2)(1)(2)(2)(2)(1)(3)(3)(1)(1)(2)(1)(2)(2)(6)(3)(6)

我要回帖

更多关于 sift surf orb 的文章

 

随机推荐