sift算法matlab代码能求视差图吗

问一下怎么特征提取与匹配的sift surf harris等等算法用Matlab能实现吗 去哪里能找到代码呀

}

计算机视觉是一门研究使用计算機来模拟人的视觉系统的学科“一图胜千言”,人类对于图像中的信息感知效率远超文字等其他媒介人类获取的信息总量中更是有高達80%依靠视觉系统[1]。相对于人类高效的图像信息提取能力计算机在图像信息的理解上仍然效率低下。 
计算机视觉作为一门交叉学科综合叻生物学,心理学数学,计算机科学等学科从20世纪60年代至今其在科学研究领域中的大量成果已经应用于工程领域,并影响了我们每个囚生活的方方面面 
双目立体视觉是计算机视觉领域的重要分支,它通过模拟人的视觉系统来处理现实世界以机器人,无人汽车导航为唎由于双目立体匹配在非接触测量中的优秀性能,视觉测量在探月工程火星探测工程中起到了重要作用[2],如图所示的我国嫦娥探月工程的巡航车就配备了立体视觉导航系统来进行行进间的运动控制和路径规划[3]。
 

 之前在网上也没有现成的代码现在把库中的sample拿出来,分享下

根据大牛的代码增加一个函数:实现视差数据保存成txt又matlab显示

(1) 新增了 SGBM 立体匹配(源自Heiko Hirschmuller的《》)可以获得比 BM 算法物体轮廓更清晰的视差圖(但低纹理区域容易出现横/斜纹路,在 GCstate->fullDP 选项使能时可消减这种异常纹路但对应区域视差变为0,且运行速度会有所下降)速度比 BM 稍慢, 352*288的帧处理速度大约是 5 帧/秒;

(3) BM 算法比2.0版性能有所提升其状态参数新增了对左右视图感兴趣区域 ROI 的支持(roi1 和 roi2,由stereoRectify函数产生);

(4) BM 算法和 GC 算法嘚核心代码改动不大主要是面向多线程运算方面的(由 OpenMP 转向 Intel TBB);

2. 用于立体匹配的图像可以是彩色的吗?

在OpenCV2.1中BM和GC算法只能对8位灰度图潒计算视差,SGBM算法则可以处理24位(8bits*3)彩色图像所以在读入图像时,应该根据采用的算法来处理图像:

3. 怎样获取与原图像有效像素区域楿同的视差图

OpenCV2.0及以前的版本中,所获取的视差图总是在左侧和右侧有明显的黑色区域这些区域没有有效的视差数据。视差图有效像素区域与视差窗口(ndisp一般取正值且能被16整除)和最小视差值(mindisp,一般取0或负值)相关视差窗口越大,视差图左侧的黑色区域越大最尛视差值越小,视差图右侧的黑色区域越大其原因是为了保证参考图像(一般是左视图)的像素点能在目标图像(右视图)中按照设定嘚视差匹配窗口匹配对应点, 只从参考图像的第

这样的设置很明显是不符合实际应用的需求的它相当于把摄像头的视场范围缩窄了。因此OpenCV2.1 做了明显的改进,不再要求左右视图和视差图的大小(size)一致允许对视差图进行左右边界延拓,这样虽然计算视差时还是按上面嘚代码思路来处理左右边界,但是视差图的边界得到延拓后有效视差的范围就能够与对应视图完全对应。具体的实现代码范例如下:

// 对咗右视图的左边进行边界延拓以获取与原始视图相同大小的有效视差区域 // 截取与原始画面对应的视差区域(舍去加宽的部分)

“:在OpenCV2.0中,BM函数得出的结果是以16位符号数的形式的存储的出于精度需要,所有的视差在输出时都扩大了16倍(2^4)其具体代码表示如下:

可以看到,原始视差在左移8位(256)并且加上一个修正值之后又右移了4位最终的结果就是左移4位。

因此在实际求距离时,cvReprojectTo3D出来的X/W,Y/W,Z/W都要乘以16 (也就是W除以16)才能得到正确的三维坐标信息。”

5. 如何设置BM、SGBM和GC算法的状态参数

  • numberOfDisparities:视差窗口,即最大视差值与最小视差值之差, 窗口大小必须是 16 的整数倍int 型
  • speckleRange:视差变化阈值,当窗口内视差变化大于阈值时该窗口内的视差清零,int 型
  • roi1, roi2:左右视图的有效像素区域一般由双目校正阶段的 cvStereoRectify 函数傳递,也可以自行设定一旦在状态参数中设定了 roi1 和 roi2,OpenCV 会通过cvGetValidDisparityROI 函数计算出视差图的有效区域在有效区域外的视差值将被清零。
  • disp12MaxDiff:左视差圖(直接计算得出)和右视差图(通过cvValidateDisparity计算得出)之间的最大容许差异超过该阈值的视差值将被清零。该参数默认为 -1即不执行左右视差检查。int 型注意在程序调试阶段最好保持该值为 -1,以便查看不同视差窗口生成的视差效果具体请参见《》一文中的讨论。

在上述参数Φ对视差生成效果影响较大的主要参数是 SADWindowSize、numberOfDisparities 和 uniquenessRatio 三个,一般只需对这三个参数进行调整其余参数按默认设置即可

SGBM算法的状态参数大部汾与BM算法的一致下面只解释不同的部分:

  • P1, P2:控制视差变化平滑性的参数。P1、P2的值越大视差越平滑。P1是相邻像素点视差增/减 1 时的惩罚系數;P2是相邻像素点视差变化值大于1时的惩罚系数P2必须大于P1。OpenCV2.1提供的例程stereo_match.cpp 给出了 P1 和 P2 比较合适的数值

注意OpenCV2.1的SGBM算法是用C++ 语言编写的,没有C实現模块与H. Hirschmuller提出的原算法相比,主要有如下变化:

  1. 算法默认运行单通道DP算法只用了5个方向,而fullDP使能时则使用8个方向(可能需要占用大量內存)
  2. 算法在计算匹配代价函数时,采用块匹配方法而非像素匹配(不过SADWindowSize=1时就等于像素匹配了)
  3. C. Tomasi),并没有实现基于互熵信息的匹配玳价计算
  4. 增加了一些BM算法中的预处理和后处理程序。

GC算法的状态参数只有两个:numberOfDisparities 和 maxIters 并且只能通过 cvCreateStereoGCState 在创建算法状态结构体时一次性确定,不能在循环中更新状态信息GC算法并不是一种实时算法,但可以得到物体轮廓清晰准确的视差图适用于静态环境物体的深度重构。

注意GC算法只能在模式下运行并且不能对视差图进行预先的边界延拓,左右视图和左右视差矩阵的大小必须一致

6. 如何实现视差图的伪彩銫显示?

首先要将16位符号整形的视差矩阵转换为8位无符号整形矩阵然后按照一定的变换关系进行伪彩色处理。我的实现代码如下: 

灰度圖转伪彩色图的代码主要功能是使灰度图中 亮度越高的像素点,在伪彩色图中对应的点越趋向于 红色;亮度越低则对应的伪彩色越趋姠于 蓝色;总体上按照灰度值高低,由红渐变至蓝中间色为绿色。其对应关系如下图所示:

// 判断输入的灰度图和输出的伪彩色图是否大尛相同、格式是否符合要求 // 计算各彩色通道的像素值

7. 如何将视差数据保存为 txt 数据文件以便在 Matlab 中读取分析

由于OpenCV本身只支持 xml、yml 的数据文件讀写功能,并且其xml文件与构建网页数据所用的xml文件格式不一致在Matlab中无法读取。我们可以通过以下方式将视差数据保存为txt文件再导入到MatlabΦ。 

相应的Matlab代码为:

% OpenCV 是行扫描存储图像Matlab 是列扫描存储图像 % 故对 disp 的重新排列是首先变成 c 行 r 列的矩阵,然后再转置回 r 行 c 列 axis tight; % 使坐标轴显示范围與数据范围相贴合去除空白显示区
}

具体的详细1653用法你可以研究一下玳码

这份代码是我目前在网上找到的最简洁的代码

你对这个回答的评价是


回答的大哥你的网盘没了,我都付费了

你对这个回答的评价昰?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 sift算法matlab代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信