FireEyes双目软件本身具备视差计算的功能,并且会以伪彩色的形式显示出来。在视差算法选项中,一定要选SGBM项,它会比BM算法可靠很多。
配置完成后,点击视差显示,即可实时计算视差。当然,这些都是建立在有标定文件,且执行校正后的条件下的。在视差页面,滚动滚轮,可以无限放大缩小,方便观察。可惜的是,没有实时计算距离的功能,多少有些遗憾。希望后期软件可以迭代更新加上。
如果不想使用软件,那么我们可以借用opencv,自己配置一个视差计算的例程出来。代码如下:
self.matcher = cv2.StereoSGBM_create(
#minDisparity=config['sgbm_min_disp'],
numDisparities=config['sgbm_num_disp'],
blockSize=config['sgbm_block_size'],
P1=8 * 1 * config['sgbm_block_size'] * config['sgbm_block_size'],
P2=32 * 1 * config['sgbm_block_size'] * config['sgbm_block_size'],
#disp12MaxDiff=-1,
uniquenessRatio=10,
speckleWindowSize=100,
speckleRange=1 )
disparity = matcher.compute(left_rectified, right_rectified)
注意,numDisparities代表有多少个视差,常用的有64、128等,blocksize代表了匹配块的大小,一般取5、7、9、11、13等均可。这里面有P1和P2两个惩罚项,一般情况下,P2需要是P1的4~8倍为宜。uniquenessRatio代表相似度,如果为10,则代表相似度在90%以上,即表示附近有跟它太相似的,就认为视差不可靠,可置为0或-1。
配置完成后,直接调用compute计算就可以了。非常简单。
但是,这样得到的视差,是灰度图,看起来非常不直观,自己渲染的话,也不易选择到合适的渲染方式,那么该怎么办呢?
disparity[disparity < 0] = 0
image2_u8 = (disparity / 16*(256.0/num_disp)).astype(np.uint8)
dis_color = cv2.applyColorMap(image2_u8, 2)
如上所示,我们首先把视差里面小于0的(-1)都变成成,这是为了方便向uint8转换。
之后,调用applyColorMap,将其转换成伪彩色。至于乘以(256/num_disp)是为了归一化,让色彩空间更饱满,这个也非常重要。
执行上面的代码,我们就可以获得完美的深度彩色渲染图像了。
FireEyes 火眼 双目相机 USB摄像头模组 立体视觉 工业 U90/U140-淘宝网 (taobao.com)
软件及代码地址:
FireEyesGit/FireEyesUsbSoftware: stereo calibrate and match tools for FireEyes U90/140 (github.com)