文章目录
- 背景
- 实际效果
- 查找资料
- 资料1
- 资料2
- 解决方案
- 最终结果
背景
目前在做的项目用到两个摄像头,一个是热成像摄像头、另一个是普通的rgb摄像头。
一开始的目标是让他们像素级重合,使得点击rgb图像时,即可知道其像素对应的温度。但是在尝试的过程中,发现基本不可能。因为由于纵深、遮挡、透视变形、视差等问题,两个摄像头拍摄到的东西可能会很不一样,对不上。
但是应该可以参考opencv的双目标定,做出横向对齐的效果。【opencv/samples/cpp/stereo_calib.cpp】
实际效果
但是尝试了直接用这个方法来操作,发现出来的效果简直毫无效果,画面随意飞,有时整个画面黑屏,看不到任何东西。
查找资料
然后不断地找资料,发现很早之前就有人尝试了类似的想法了。
资料1
【stereoCalibrate for different cameras (rgb and infrared)】
这个人有一组照片,里面有rgb照片以及与其对应的ir照片,他放在这里,可以从这里下载(需要梯子)【rgb+ir】。
他的需求也是实现两个相机画面的极平面、极线对齐。直接用了stereoCalibrate出来的效果不好。
他提出这个问题之后,有个人【BConic,之前好像是叫AldurDisciple】回答了他。说可以尝试一下先独立地对每个相机进行标定,得到相机内参,然后再设置参数 CALIB_USE_INTRINSIC_GUESS + CALIB_FIX_INTRINSIC 去使用stereoCalibrate,应该能够取得较好的效果。
从后续来看,提出问题的人【DmT021】反馈基本解决了问题。
资料2
从另外一篇问答【Big reprojection error while using OpenCV cvStereoCalibrate to calibrate a pair of cameras with different resolution】来看,这种先独立标定再联合求解的方法应该是可行的。
解决方案
先独立地对每个相机进行标定,然后再联合使用stereoCalibrate进行标定。
在进行标定之前,先对图像进行剪裁、缩放,使他们具有同样的尺寸。(上面的资料好像说不用同样尺寸也行,暂时不清楚他们是如何使用的)
在使用stereoCalibrate时,注意参数为CALIB_USE_INTRINSIC_GUESS + CALIB_FIX_INTRINSIC 。
最终结果
一般,但是咬咬牙应该也可以用。
两个图像都旋转且裁剪了很多。有可能是我的样本的问题,后面采集多一些不同角度的再来标定试试。
参考:
【基于OpenCV的双目测距系统实现】
【双目相机标定以及立体测距原理及OpenCV实现】