尝试用OpenCV来实现立体视觉也有一段时间了,主要的参考资料就是Learning OpenCV十一、十二章和OpenCV论坛上一些前辈的讨论。过程中磕磕碰碰,走了不少弯路,终于在前不久解决了最头大的问题,把整个标定、校准、匹配的流程调试成功。(虽然还有一些问题至今尚未搞清)
在这里写这篇文章,第一方面是给自己一个总结,第二方面是感觉OpenCV立体视觉方面的资料还是相当零散和不完整,新手入门需要花很长时间才能摸索出来,第三方面,也是自己在过程中有些问题仍旧迷迷糊糊,希望可以抛砖引玉。
1. 摄像头
我用的摄像头是淘宝上买的三维摄像头,两个USB Camera加一个可调节的支架。实物照片如下
1.1 三维摄像头实物图
双USB摄像头的OpenCV驱动可以参考以下链接
http://www.opencv.org.cn/index.php/使用DirectShow采集图像
将上面代码复制到自己的工程之后还需要对工程或者编译环境做一下设置
VC6下的详尽设置可以见代码的注释(修改工程的属性)
VS2008中的设置也可以参照代码注释中VC++2005的设置(修改编译环境)
2. 标定
由于OpenCV中cvStereoCalibrate总是会得到很夸张的结果(见下文5.1问题描述),所以最后还是决定用Bouguet的Matlab标定工具箱立体标定,再将标定的结果读入OpenCV,来进行后续图像校准和匹配。
Matlab标定工具箱的参考链接如下:
http://www.vision.caltech.edu/bouguetj/calib_doc/
上面有详细的使用步骤,用起来相当的方便。
以下是我个人用Matlab工具箱进行立体标定的步骤,供参考,如果需要更详细步骤的话还是参照上面的链接
把Matlab工具箱的文件copy到对应目录下,把所要标定的棋盘图也放到.m文件所在的目录下,然后在Matlab命令行窗口中打入calib_gui,选择Standard之后便出现以下窗口
2.1. calilb_gui面板
我们先对右摄像头的标定,所以先把从右摄像头上采集到的棋盘图复制到工具箱目录下。
点击Image names, 命令行窗口会提示你输入图片的basename以及图片的格式(比如你图片文件名是right1, right2, …, right10,basename就是right),然后Matlab会自动帮你读入这些图片,如下图所示,可以看到,读入了10幅右摄像头的棋盘图。
采集棋盘图的时候要注意,尽量让棋盘占据尽可能多的画面,这样可以得到更多有关摄像头畸变方面的信息
2.2. 图像basename读入
2.3. 读入的棋盘图
然后再回到主控制界面,点击Extract grid corners,提取每幅图的角点
2.4. calib_gui面板
点击完后,命令行会出现如下提示,主要是让你输入棋盘角点搜索窗口的大小。窗口定的大一点的话提取角点会比较方便点(即便点得偏离了也能找到),但也要注意不能大过一个方格的大小。剩下的两个选项,只要回车选用默认设置就可以了
2.5. 选择窗口大小
然后就开始了角点的提取工作,按一定顺序分别提取棋盘的最边上的角点,程序会自动帮你找到所有对应的角点
2.6. 提取角点
2.7. 提取角点2
在提取第一幅图的时候命令行窗口可能会提示你输入方格大小,这里输入你方格的实际大小就行,比如我方格是27mm,就输入27。这步事实上相当关键,它定义了空间的尺度,如果要对物体进行测量的话,这步是必须的。
按相同的方法提取完10幅图后,点击Calibration,开始摄像头标定
2.8. calib_gui面板
经过多次迭代后,程序会最终得到摄像头的内外参数,如下图所示(图中符号由于字体关系没有完全显示,中间的问号是表示误差的加减号)
2.9. Calibration迭代过程及结果
可以通过面板上的Show Extrinsic查看一下标定结果,可以验证一下标定外参数的结果
2.10. 外部参数图示
验证标定结果无误之后,就点击面板上的Save按钮,程序会把标定结果放在一个叫Calib_Result.mat中,为了方便后续立体标定,把这个文件名改为Calib_Result_right.mat。
左摄像头标定的方法与右摄像头相同,生成的Calib_Result.mat之后,将其改名为Calib_Result_left.mat就可以了
左右摄像头都标定完成之后,就可以开始立体标定了。
在Matlab命令行中键入stereo_gui启动立体标定面板,如下图所示
2.11. stereo_gui面板
点击Load left and right calibration files并在命令行中选择默认的文件名(Calib_Result_left.mat和Calib_Result_right.mat)之后就可以开始Run stereo calibration了,run之后的结果如下图所示,左右摄像头的参数都做了修正,并且也求出了两个摄像头之间的旋转和平移关系向量(om和T)
2.12. 立体标定结果
在面板上点击Show Extrinsics of stereo rig,可以看到如下图所示的双摄像头关系图,可以看到,两个摄像头基本是前向平行的
2.13. 双摄像头与定标棋盘间的位置关系
得到了立体标定参数之后,就可以把参数放入xml文件,然后用cvLoad读入OpenCV了。具体的方法可以参照Learning OpenCV第11章的例子,上面就是用cvSave保存标定结果,然后再用cvLoad把之前的标定结果读入矩阵的
2.14. xml文件示例
这里需要注意的是Matlab标定结果中的om向量,这个向量是旋转矩阵通过Rodrigues变换之后得出的结果,如果要在cvStereoRectify中使用的话,需要首先将这个向量用cvRodrigues转换成旋转矩阵。关于Rodrigues变换,Learning OpenCV的第11章也有说明。
2.15. 旋转矩阵的Rodrigues形式表示
3. 立体校准和匹配
有了标定参数,校准的过程就很简单了。
我使用的是OpenCV中的cvStereoRectify,得出校准参数之后用cvRemap来校准输入的左右图像。这部分的代码参考的是Learning OpenCV 十二章的例子。
校准之后,就可以立体匹配了。立体匹配OpenCV里面有两种方法,一种是Block Matching,一种是Graph Cut。Block Matching用的是SAD方法,速度比较快,但效果一般。Graph Cut可以参考Kolmogrov03的那篇博士论文,效果不错,但是运行速度实在是慢到不能忍。所以还是选择BM。
以下是我用BM进行立体匹配的参数设置
- BMState = cvCreateStereoBMState(CV_STEREO_BM_BASIC,0);
- assert(BMState != 0);
- BMState->preFilterSize=13;
- BMState->preFilterCap=13;
- BMState->SADWindowSize=19;
- BMState->minDisparity=0;
- BMState->numberOfDisparities=unitDisparity*16;
- BMState->textureThreshold=10;
- BMState->uniquenessRatio=20;
- BMState->speckleWindowSize=13;
其中minDisparity这个参数我设置为0是由于我的两个摄像头是前向平行放置,相同的物体在左图中一定比在右图中偏右,如下图3.1所示。所以没有必要设置回搜的参数。
如果为了追求更大的双目重合区域而将两个摄像头向内偏转的话,这个参数是需要考虑的。
3.1. 校正后的左右视图
另外需要提的参数是uniquenessRatio,实验下来,我感觉这个参数对于最后的匹配结果是有很大的影响。uniquenessRatio主要可以防止误匹配,其主要作用从下面三幅图的disparity效果比对就可以看出。在立体匹配中,我们宁愿区域无法匹配,也不要误匹配。如果有误匹配的话,碰到障碍检测这种应用,就会很麻烦。
3.2. UniquenessRatio为0时的匹配图,可以看到大片的误匹配区域
3.3. UniquenessRatio为10时的disparity map, 可以看到误匹配被大量减少了, 但还是有噪点
3.4. UniquenessRatio为20时的disparity map, 可以看到误匹配基本被去除了, 点云干净了很多
关于cvFindStereoCorrespondenceBM这个函数的源代码,曾经做过比较详细的研究,过一段时间也会把之前写的代码注释整理一下,发篇博文。
4. 实际距离的测量
在用cvFindStereoCorrespondenceBM得出disparity map之后,还需要通过cvReprojectImageTo3D这个函数将单通道Disparity Map转换成三通道的实际坐标矩阵。
具体的数学原理可以参考下面这个公式(from chenyusiyuan http://blog.csdn.net/chenyusiyuan/archive/2009/12/25/5072597.aspx,实际深度的一些问题这篇博文中也有提到)
4.1 距离转换公式
但是在实际操作过程中,用cvReprojectImageTo3D得到的数据并未如实际所想,生成深度矩阵所定义的世界坐标系我就一直没弄清楚。这在下面的例子中会详细说明,希望这方面的专家能帮忙解答一下:
图4.2是测量时的实际场景图,场景中主要测量的三个物体就是最前面的利乐包装盒、中间的纸杯、和最远的塑料瓶。
4.2. 实际场景中三个待测物体的位置
图4.3是校准后的左右图和匹配出来的disparity map,disparity窗口中是实际的点云,object窗口是给disparity map加了个阈值之后得到的二值图,主要是为了分割前景和背景。可以看到要测的三个物体基本被正确地分割出来了
4.3. 双目摄像头得到的disparity map
图4.4是在disparity窗口中选取一个点后然后在实际坐标矩阵中得到的对应三维信息,在这里,我在三个物体的点云上各选一个点来代表一个物体实际的坐标信息。(这里通过鼠标获取一点坐标信息的方法参考的是opencv sample里的watershed.cpp)
4.4. 对应点的三维坐标
在这里可以看到,(265, 156)也就是利乐包装盒的坐标是(13, 12, -157),(137, 142)纸杯的坐标是(77, 30, -312),(95, 115)塑料瓶的坐标是(144, 63, -482)。
补充一下:为了方便显示,所以视差图出来之后进行了一个0-255的normalize,所以value值的前一个是normalize之后点的灰度值,后一个是normalize之前点的实际视差图。
由cvFindStereoCorrespondenceBM算法的源代码:
目前我还是不是很清楚立体坐标系原点和尺度,但是从这三个点的z坐标可以大致看出这三个物体的距离差大概是1:2:3,基本与实际场景中物体的位置一致。因此,可以通过这种方法确定出物体的大致距离信息。
但是,如果就从摄像头参数本身来测量距离的话,就不是很明白了,还求这方面的大牛解答。
5. 一些问题
5.1 关于StereoCalibrate
OpenCV自带的cvStereoCalibrate感觉不怎么好用,用这个函数求出的内参外参和旋转平移矩阵进行校准,往往无法达到行对准,有时甚至会出现比较可怕的畸变。在看了piao的http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4603帖子之后,也曾经尝试过现用cvCalibrateCamera2单独标定(左右各20幅图),得出的结果基本和Matlab单独标定的相同,然后再在cvStereoCalibrate中将参数设成CV_CALIB_USE_INTRINSIC_GUESS,用来细化内参数和畸变参数,结果得出的标定结果就又走样了。
不知道有谁在这方面有过成功经验的,可以出来分享一下。毕竟用Matlab工具箱还是麻烦了些。
5.2 Translation向量以及立体匹配得出的世界坐标系
Learning OpenCV中对于Translation和Rotation的图示是这样的
5.1. Learning OpenCV中的图示
可是在实验过程中发现,如果将Translation向量按尺度缩放,对于StereoRectify之后的左右视图不会有变化,比如将T = [ -226.73817 -0.62302 8.93984 ] ,变成T = [ -22.673817 -0.062302 0.893984 ],在OpenCV中显示的结果不会有任何变化。而且我如果修改其中的一个参量的话,左右视图发生的变化也不是图5.1中所示的那种变化(比如把x缩小,那么视图发生的变化不是往x轴方向的平移)。
因此又回到了老问题,这里这些坐标的尺度究竟是什么?通过ReprojectTo3D那个函数得到的三维坐标又是以哪个点为原点,那三个方向为x,y,z轴的?
补充: 对这个问题的解答来自于和maxwellsdemon的讨论
他的解释如下:rotation是两者的旋转角度的关系,但是你要把它矫正平行,也是需要translation matrix的。你可以设想,两个看似已经平行了的摄像头,但是深度上放置的有差距,那么在矫正的时候会议translation matrix所对应的角度或者直线为基准,二者旋转一个小角度,使得完全平行。
PPS:摄像头网址 http://www.hytekautomation.com.cn/BNE001.aspx?productId=20
//******************************************************************************************************************************************************************************************
101楼 HiGoodBoy 2016-03-17 17:51发表 [回复]
博主,您好,我想请问一下只知道两幅影像的投影矩阵的情况下,如何进行极线校正。采用stereorectify函数么?其中的cameramatrix,r,T参数都通过投影矩阵分解得到,但是畸变参数怎么得到呢?还望指点
100楼 wyx_123456 2016-01-18 20:35发表 [回复]
博主,标定完以后怎么判断标定结果好坏与否?
99楼 qq_33504386 2016-01-04 11:28发表 [回复]
感谢楼主分享,学了不少,我们也是做三维扫描方案开发的,浙大系,在杭州。现公司努力壮大研发团队,欢迎有兴趣的三维重建算法、三维点云后处理人才加入:QQ 2088190951
98楼 Jefferyhxm 2015-12-02 07:06发表 [回复]
博主,看了你的文章,我还是有些疑惑。在使用matlab toolbox计算得到左右相机的内参数和外参数以后,如何利用opencv来通过两个图像中的点坐标计算三维空间坐标呢?
97楼 _ALittleMore_ 2015-11-16 09:43发表 [回复]
博主,最近一个项目中要用到立体匹配,要看懂cvFindStereoCorrespondenceBM这个的源码,看到“关于cvFindStereoCorrespondenceBM这个函数的源代码,曾经做过比较详细的研究,过一段时间也会把之前写的代码注释整理一下,发篇博文”心中一热,去找博主的博文发现没有,看评论才发现博主后来没写了,刚接触图像处理和opencv不久,看这函数的源码实在是觉得看不懂,博主,该怎么去看呢?求助求助!
96楼 jiullll 2015-08-06 19:14发表 [回复]
mind就是sad得出的视差是指哪个数值呢
95楼 jiullll 2015-08-06 17:44发表 [回复]
请问一下BM参数中的unitDisparity是什么呢
94楼 见贤思齐焉 2015-07-02 09:51发表 [回复]
感谢楼主分享,但关于Matlab标定的结果,小弟有点看不明白,关于fc或cc参数,Matlab标定结果均有两个值。
即
fc=[827.16255 826.98935]?[8.66335 8.5461]
cc=[341.20701,218.32537]?[16.91587,12.22932]
前者应该是焦距和像主点的像素坐标吧,那后者是什么呢?是物理坐标么?
还望楼主解答~~谢谢了。
93楼 baidu_27903689 2015-05-24 20:34发表 [回复]
讲的很好 学了很多
92楼 Cason_wang 2015-04-03 14:57发表 [回复]
你好,请教一下,我利用MATLAB toolbox分别标定两个摄像头,得到摄像头的内外参数。那我现在要做的事是,直接利用两个摄像头采集,各采集一帧进行标定,然后做图像拼接处理,这种思路对吗?
91楼 放放风 2015-01-18 21:12发表 [回复]
lz,我想请教下为什么我用reprojectimageto3d得出来的坐标值很离谱呢?
Re: fox7xjw 2015-01-29 14:53发表 [回复]
回复u010119009:reprojectimageto3d出来的坐标要乘以16之后才有点靠谱。。
Re: sunlightli1216 2015-08-28 21:36发表 [回复]
回复fox7xjw: cvReprojectImageTo3D得到的是什么?怎么把Z坐标换算成距离呢?希望解答,不胜感激
90楼 fox7xjw 2015-01-17 15:20发表 [回复]
我想请问下博主,matlab的stereo_gui里面有一个Rectify the calibration images,好像是把所有棋盘格图像做了校正,之后又获得了一组标定参数;
我想问的是博主用到opencv中的参数是哪一组?还有这个Rectify the calibration images可不可以校正匹配要用的那一组真实场景图像对呢?
谢谢~
89楼 Joey_Tang 2014-10-14 16:16发表 [回复]
博主的三维摄像头在哪里买的啊?!能给出链接吗?!
88楼 司令 2014-07-16 03:26发表 [回复]
不错啊,看着博主的这个博客搞定了!非常感谢!
那个Matlab toolbox不是一般的强大,我需要的各种变换还有PnP都有相应的函数,太牛逼了!
87楼 shiter 2014-06-22 22:42发表 [回复]
同样想买摄像头的飘过。。。
86楼 liuhyluguan 2014-05-12 12:35发表 [回复]
博主你好,拜读了你的文章使我受益匪浅,但有一点不明,“把参数放入xml文件”这一步如何实现,有具体的实现代码或说明吗,wzyryan@163.com,恳请指导
Re: yu88888jie 2015-12-22 20:48发表 [回复]
回复liuhyluguan:就是你找一个xml文件 按照他那个格式把数据填进去就可以了。 xml文件找不到的话可以下载opencv十二章的源码,在里面把那个摄像头矩阵什么的保存为xml就可以了 十一章的代码里有说怎么保存。
Re: zlllou 2014-12-04 21:14发表 [回复]
回复liuhyluguan:请问你们解决了吗
85楼 montgomerry 2014-05-04 22:20发表 [回复]
看完你的博文受益良多,有个地方不太清楚我想问下,matlab里的reprojection error怎么看?看不懂,可以跟你说下吗?
84楼 nangnima 2014-04-16 15:03发表 [回复]
博主,不知道你还能不能看到我的评论,您提供的网址我找不到这种摄像头啊,求博主给个链接,感激不尽。
83楼 Raby_GYL 2013-12-11 21:18发表 [回复]
时间真快呀,三年过去了~我现在才学习到这部分~明年C++版本Learning OpenCV书籍出来了,不晓得对这部分有什么补充和改进~
82楼 qingqingzjin 2013-11-14 15:08发表 [回复]
相当好的文章,核你受用。不过楼主,你提供的两个链接:http://www.hytekautomation.com.cn/BNE001.aspx?productId=20
和http://item.taobao.com/item.htm?id=4271696156
都已经失效了,现在我很想做这个方面的研究,所以麻烦你提供下卖这个相机的联系方式吧,非常的感谢!
我的QQ:2768676042
email:qingqingzjin@126.com
麻烦LZ!
Re: 诺坎普10号 2014-05-08 20:05发表 [回复]
回复haorenka2010:请问你买到摄像头了嘛?
Re: qingqingzjin 2014-08-11 20:25发表 [回复]
回复liangtingfengyileng:没有,不过我们买了一款国外的整套设备和软件
81楼 CarsonGP 2013-08-30 15:46发表 [回复]
楼主,我已经拜读了你的文章好几遍了,我的目前已经做好了单目的标定,用的是opencv,我想问下matlab标定的效果咋样?
80楼 thunder60 2013-08-07 02:22发表 [回复]
博主您好,请问matlab的标定结果怎么引用给openCV, xml文件的结构应该是怎样的?或者,openCV所要用的cvMat结构的参数矩阵是怎样的?
79楼 mihu_1234 2013-06-24 21:18发表 [回复]
楼主你好 我用单目标定的时候 SHOW EXTRINSIC 里面的Z轴方向的距离 和我的实际距离有差距 相差100左右 能否给我解答一下 多谢!!
78楼 gugumumu2010 2013-04-22 11:17发表 [回复]
你好,不知道您还会不会回复我,实在是卡住了,我用cvStereoRectify函数校正两幅图片(我的图片是MFC单文档对话框里的两个图片控件打开的),调试总是该函数的CV_CALIB_ZERO_DISPARITY参数出错,请问使用这个函数的时候对图片有要求吗?这个函数好像没用到图片啊。我用的是vc6.0+opencv1.1。还有cvRemap这个函数的输入输出图片格式是哪个,我的图片控件打开后是IplImage类型的,要进行转换吗?期待您的回复哦。
Re: gugumumu2010 2013-04-22 16:30发表 [回复]
回复gugumumu2010:是不是vc6.0不能用opencv1.1呀。我要疯了。
77楼 u010147016 2013-04-18 23:01发表 [回复]
USB Camera 两个摄像头的配件淘宝上没看到呀,能给个链接么
76楼 chy258143826 2013-03-19 12:14发表 [回复]
引用“mailang2008”的评论:
您好,我按您的方法在校正的时候遇到一个问题,提示cvStereoRectify函数Formats o...
我也碰到了相似的问题,同求解答
75楼 chy258143826 2013-03-19 11:50发表 [回复]
前辈在吗?????现在求助ing。。。。。。
74楼 just_rookie 2013-02-28 15:53发表 [回复]
这个帖子对于菜鸟来说太具有指导性了!!
73楼 lsyyoyo 2013-02-22 21:02发表 [回复]
楼主,双目视觉的这个过程,包括在vc或者vs中对opencv的配置,这些个校正、BM等的匹配函数,在PC机上可以实现。如果在DSP中,请问楼主你知道这些函数、这个过程cvStereoRectify()校正,cvInitUndistortRectifyMap()和cvRemap()极线对准,cvFindStereoCorrespondenceBM()立体匹配还有吗。还是就不一样了?
72楼 chenruying 2013-01-07 12:43发表 [回复]
你好,博主,
我现在在一个机器人竞赛小组中,担任程序设计,但我的高度始终有问题。。
可以向博主请教一下代码么
我的邮箱 784255948@qq.com 或 reneechen1993@gmail.com
O(∩_∩)O谢谢
71楼 s001133 2013-01-04 15:12发表 [回复]
前輩..你能教一下OpenCV那邊的程序嗎?或者可以分享一下你的源代碼嗎?~~謝謝?
70楼 feifeiniao123 2012-12-24 15:42发表 [回复]
前辈,您好,很好的文章,前辈能不能共享一下用cvStereoRectify 这个函数实现校正的代码,我现在处于初学阶段,恳请前辈不吝赐教……我的邮箱yffeng@yeah.net。多谢您了
Re: richmanrain 2012-12-26 11:56发表 [回复]
回复feifeiniao123:同求,到这步就不是很清楚了,感谢了,邮箱richmanrain@163.com
69楼 kaiseu 2012-12-14 18:50发表 [回复]
在matlab下标定,用OPencv校准、匹配,remap得到的校正图明显不在一条水平线上(一上一下),matlab下标定的误差显示很小了,可能是什么原因啊?望指正!
68楼 yl2135315 2012-10-31 08:54发表 [回复]
楼主你好,我目前也在弄这个三维测距,现在我能够求出视差图。不过用cvReprojectImageTo3D(CvArr * disparityImage, CvArr * result3DImage, CvMat * Q)。这个函数求出深度图的时候,求出的结果很奇怪。result3DImage求出来的点。Z通道也就是深度很多点都是同一个结果。也就是景深一样。并且大得惊人。还是个负数。不知道这些个原因楼主遇到过没有。如果不介意希望可以发一份代码到我邮箱。yanglong227@126.com。不尽感激。
Re: hx_ywzq 2015-11-19 14:49发表 [回复]
回复yl2135315:我也有这个问题请问你解决了吗?
67楼 lsyyoyo 2012-10-25 15:02发表 [回复]
嗯,博客里写文时截的这些图片,我咋粘不上去
66楼 hit2038 2012-10-17 21:02发表 [回复]
楼主你好,我一直在研究你这篇博文,我想知道“在disparity窗口中选取一个点后然后在实际坐标矩阵中得到的对应三维信息”这一步是如何实现的?能把代码给我发一下吗,272310401@qq.com 谢谢。
65楼 chgm_456D 2012-10-05 15:36发表 [回复]
博主,你好!非常有幸拜读你的文章,非常好,感谢你的分享。现在我有个问题想问一下:
图4.2 和4.3中 的物体的 那个框框,是程序自己检测的,还是手动画上去的?非常感谢!
Re: scyscyao 2012-10-17 16:14发表 [回复]
回复chgm_456D:用opencv里面的一个函数画上去的,好像是cvRectangle还是什么
64楼 allanpk716 2012-09-14 12:02发表 [回复]
我只想问问,博主你之前买的三维摄像头,我看淘宝没得卖了,找了半天,不知道还有什么地方能找到得到不?不然就得买家用摄像头然后弄个固定架了
Re: scyscyao 2012-10-17 16:19发表 [回复]
回复allanpk716:好像市面上双目摄像头不少吧 刚刚淘宝搜了下立体摄像头 就有很多此类产品
Re: scyscyao 2012-10-17 16:17发表 [回复]
回复allanpk716:刚刚试了一下博文最后的链接 好像失效了。。。估计是那家公司倒闭了。。。是家小型创业公司
63楼 lsyyoyo 2012-08-26 09:53发表 [回复]
想问一下博主,你的图片是怎么显示的。我写博客的时候,截的这个图片怎么没法显示呢?
Re: scyscyao 2012-10-17 16:19发表 [回复]
回复lsyyoyo:博客里的图片?还是opencv显示的图片?
62楼 qqbb1987 2012-08-02 13:01发表 [回复]
“value值的前一个是normalize之后点的灰度值,后一个是normalize之前点的实际视差图。”这话有问题吧。实际视差怎么y方向还有值,经过前向校正之后,只有x方向有视差值。还有这个y值是怎么得到的呢?想了好久没搞清楚。。。
Re: scyscyao 2012-10-17 16:25发表 [回复]
回复qqbb1987:抱歉这里可能说不太清楚 这里的value是指point is xx,xx value is xx,xx的value 跟x y 好像没有关系
61楼 qqbb1987 2012-08-02 12:51发表 [回复]
这个帖子我每天看四五遍,有些问题一直没搞清楚。希望能有志同道合一起探讨。请假QQ:532382142。附言:csdn立体视觉。
60楼 sunanger_wang 2012-07-13 14:32发表 [回复]
楼主太好了,谢谢
59楼 xfortius 2012-07-03 17:24发表 [回复]
赞。。原来没有仔细阅读,现在飙泪中啊。。多多学习。。
58楼 cbib_cat 2012-03-31 17:08发表 [回复]
LZ你好!
“关于cvFindStereoCorrespondenceBM这个函数的源代码,曾经做过比较详细的研究,过一段时间也会把之前写的代码注释整理一下,发篇博文”
我们目前在看这个算法,想参考LZ的博文。
Re: scyscyao 2012-10-17 16:22发表 [回复]
回复cbib_cat:哎 当年毕设时候一腔热情啊,后来没写。。。。不过那个算法写得真的很高效,直接操控内存地址来增加效率。。。。而且 其实现在研究这个算法的意义不太大了吧。。。很多新算法又出来了。。比如graph cut相关的,研究这些算法比较有前景
57楼 lizhao0211 2012-02-27 16:22发表 [回复]
您好 我也在做三维重建的项目,能把您得到点的三维信息的程序给我发下吗?想参考一下。谢谢
wangshuo1987sure@gmai.com
Re: zlllou 2014-12-04 21:19发表 [回复]
回复lizhao0211:你们的标定怎么解决的,大神,帮帮忙,我们现在卡在标定这里了,得到结果了,但是不知道怎么把MATLAB的结果导入opencv,邮箱619258732@qq.com
56楼 shihaos 2012-02-25 23:45发表 [回复]
博主,你好,急切想知道一些问题,我在利用cvReprojectImageTo3D函数输出的矩阵数据读出三个坐标时是较小的数值,2.09323等,物体实际距离约为35cm,想请问这是什么原因吗?博主的三维坐标输出后是否经过什么处理(乘以16外)
55楼 jixiangbeijing 2012-02-24 23:11发表 [回复]
楼主您好,
“得到了立体标定参数之后,就可以把参数放入xml文件”这句话能不能讲的再清楚点,我就是这个点过不去。万分感谢!
Re: yu88888jie 2015-12-22 20:49发表 [回复]
回复jixiangbeijing:就是你找一个xml文件 按照他那个格式把数据填进去就可以了。 xml文件找不到的话可以下载opencv十二章的源码,在里面把那个摄像头矩阵什么的保存为xml就可以了 十一章的代码里有说怎么保存。
Re: leizishenlan 2013-04-21 16:05发表 [回复]
回复jixiangbeijing:你好,你现在研究出来了“如何利用matlab摄像头标定得出的参数转化为xml文件”,自己也卡在了这里,特想你请教一下
Re: chy258143826 2013-03-19 12:00发表 [回复]
回复jixiangbeijing:您也是这个点过不去啊。/。。。。我也是啊。。半天得不到正确的xml文件。程序提醒数据结构不对,烦躁死了。
Re: leizishenlan 2013-04-21 16:06发表 [回复]
回复chy258143826:你好,你现在研究出来了“如何利用matlab摄像头标定得出的参数转化为xml文件”,自己也卡在了这里,特想你请教一下
Re: zlllou 2014-12-04 21:20发表 [回复]
回复leizishenlan:你们解决了吗,我也卡在这里了
54楼 budong000ni 2012-02-12 12:54发表 [回复]
LZ的摄像头是两个单独的拼起来的吗?分享一下,想做毕业设计
53楼 冰水冰 2011-12-24 21:50发表 [回复]
不知博主能否发我一份 shilylucky@qq.com,做学习用,谢谢
52楼 qi_lanfeng 2011-12-07 11:16发表 [回复]
你好,请问楼主还在吗?
我有个问题想跟你请教一下关于cvStereoRectify里面的R和T参数的问题。我的内外参数都已经得到,于是我用R=R2*R1t
T=T2-R*T1,但是最后得到的结果却不对,请问应该如何修改
此外有的时候矫正之后不是行对准而是列对准,这个时候一般如何处理比较好?再次旋转??
51楼 feira 2011-11-20 13:43发表 [回复]
还有,你三维摄像头从哪个店买的,给个地址吧
50楼 feira 2011-11-20 11:33发表 [回复]
你好,openCV中,利用 cvFindFundametalMat 获得基础矩阵F,然后使用 cvComputeCorrespondEpiLines计算对应点在另一幅图像中的对应极线。那么,调用cvFindFundametalMat时,输入图片是校正好的吗?计算极线时,也输入校正好的图片吗?还有,好多人说校正好的图片,匹配时,只需要在同一行找就行了,那是不是就不用计算极线了?
49楼 gankeliang 2011-09-23 22:16发表 [回复]
你好,请问按照你图中标记出几个物体,怎么实现的呢?还有就是我测的距离貌似不怎么准确?貌似是一半这样子。cvReprojectImageTo3D得到的坐标不是很准。但是摄像头的Tx的距离是相当准的。
48楼 gankeliang 2011-08-24 09:49发表 [回复]
你好,谢谢你的文章,请问我也是做三维测距的,然后标定都完成了,得到摄像头的一系列参数,然后再匹配的时候我采用的BM的方法,当我自己载入自己的标定参数的时候,匹配视差图确什么都没有,是一片漆黑的。拿别人的标定结果载入,发觉有那么点点视差。会不会是我的标定参数错误呢?一直有点不懂?请问能指导下我原因吗?我的邮箱283299176@qq.com,期待您的指导,可以把你的建议发邮箱或则回复给我嘛?谢谢了。这个问题一直纠结好几天了,还是解决不了。谢谢
47楼 huxingfu34072 2011-08-03 15:19发表 [回复]
请问matlab工具箱里面测距文件stereo_triangulation.m中ccd图像坐标到左相机坐标是怎么变换的,那代码写的好像跟说明文件不一样啊,谢谢!!!
46楼 sunnywish 2011-07-15 10:15发表 [回复]
用这个方法标定 不能得到本征矩阵和基础矩阵啊
45楼 zjl1980 2011-06-13 13:33发表 [回复]
沈程杳,您好,您能不能在百忙之中给我发一份BM算法的程序,我学习一下,前面的标定都会,可是到如何读入xml文件,如何使用其进行立体匹配的这些后面具体的东西就不会了,谢谢您了。我的邮箱是feng198086@sina.com
44楼 gold2011 2011-05-28 17:23发表 [回复]
不错[e01]
43楼 gofi 2011-05-07 14:19发表 [回复]
你好,我想问下,得到的MAT格式文件如何转换为XML格式
42楼 wanghs2419 2011-05-05 22:50发表 [回复]
楼主你好,读了你的文章真的是受益匪浅. 我也正在做双目视觉,刚刚开始,还有很多不懂的地方. 如果可以的话,楼主能不能发一份从opencv读入xml文件开始,到双目摄像头得到disparity map的程序代码. 仅供我学习使用.万分感谢! wanghs2419@hotmail.com
谢谢!
41楼 rongtian_ye 2011-04-20 14:03发表 [回复]
请问,用cvReprojectImageTo3D得到的数据用什么方法可以输出来看?[e07]
40楼 rongtian_ye 2011-04-01 11:11发表 [回复]
看了楼主写的,对用matlab得出的参数和后续的校准、匹配之间的衔接还不是很清楚,xml文件是自己创建的吗?放在哪里?程序要作何修改呢?
Re: feng533 2011-04-11 10:08发表 [回复]
回复 rongtian_ye:您好,我也在做这方面的研究,遇到的问题和你一样,不知道你解决没呢?希望和你探讨下,我的邮箱:jian329089094@163.com
Re: rongtian_ye 2011-04-20 14:06发表 [回复]
回复 feng533:我后来就没有用matlab了,欢迎探讨,lihao_scut@163.com