PointGreyResearch是世界领先的致力于开发高级数字相机产品的公司。PointGrey产品涉及IEEE-1394相机、立体视觉相机和360度全景数字视频相机。其中二代和三代的大黄蜂立体相机(Bumblebee2 and Bumblebee XB3) 也算其中的明星产品。大黄蜂二代相机有左右两个相机可以同时拍摄,而三代更是丧心病狂般的用了三个摄像头,模仿二郎神吗?每个摄像头的分辨率是1280x960,一身土豪金的涂装让人爱不释手,真是越看越喜欢呀。
灰点公司的硬件做的棒的没话说,但是提供的SDK却让人不敢恭维。主要提供了两个SDK,分别是FlyCapture2和Tripclops。其中 FlyCapture2 是比较基本的SDK,主要提供通用的软件接口来从USB, GigE, FireWire等接口获取摄像机捕获的图像,和摄像机的一些基本配置。Tripclops 是一个计算机立体视觉库,可以提供实时的深度图像,让用户来精确的测量图片中每一个像素的距离,并去除了一些透镜畸变(lens distortions)和失调问题(misalignments),还提供了些简单三维重建代码,但是效果很不近人意。
在FlyCapture2 SDK给的Example中,有个名为SaveImageToAviEx的例子是用来保存摄像机捕获的图像集到一个avi文件中,这是一个通用的例子,对灰点公司的每个摄像机产品都通用。但是对于大黄蜂摄像机问题就来了,大黄蜂摄像机有两个或三个摄像头,而该例子保存出来的只有一个文件,对于XB3摄像机,三个镜头捕捉的图像缠绕在了一起,如下图所示:
而SDK中也没有相应的代码来把左中右三个视图分开,于是乎只能自己写代码来分开三个视图。在查阅了一些有关Bumblee XB3的资料后,发现其是利用 Format_7 像素格式设置来控制捕从几个摄像头来获图像的,如果把像素格式改为RGB8, 则获得是上图中三个视图交织在一起的效果,三个视图分别被存在了RED, GREEN, BLUE通道里面。具体设置可参见灰点公司的文章( Using Format_7 modes to control image capture from stereo cameras ).
摄像头捕获的图像是以Bayer Tile format格式存储的,每像素8位,之后可以通过色彩处理(color processing) 来增加的24位或32位的BGR彩图,不同的摄像机的型号决定着其图像传感器上的色彩滤波矩阵(color filter arrays)上的RED, GRREN, BLUE的排列顺序。(可参见 How to determine and interpret the Bayer Tile pixel format of a PGR camera )
最终分离的效果如下图所示:
下面大概说下实现过程吧,用到了OpenCV和FlyCapture2这两个SDK,用OpenCV的原因是因为FlyCapture2中读AVI的函数只能处理2GB以内的视频文件,OpenCV在处理图像视频方面很强大,又有很完备的类和函数可以直接用,而且网上的教程也很多,所以用其来读取AVI视频文件并处理,大概实现过程如下:
1,用OpenCV打开BumblebeeXB3捕获的avi文件,并且将每一帧取出来存到一个IplImage的指针变量中
2,我们需要把OpenCV的图片类型IplImage转为FlyCapture2中的图片类型Image,可以参见我之前的博客Conversion between OpenCV IplImage and FlyCapture2 Image 两种图像类的相互转化。
3. 我们的目标是将其保存为左中右三种avi视频文件,我们这里用FlyCapture2中提供的AVIRecorder类来实现保存avi的操作,该类使用方法可以参见Flycapture2 SDK中的例子SaveImageToAviEx,我们要做的就是写一个函数把一个重叠的Image类图片变量分开到left,center,right三个Image类图片变量
4. FlyCapture2中Image类中的数据是以unsigned char类型保存的,而且是按左中右分别存的,我们只需每三个拆分出来分别保存到新的Image变量中,可参见如下pseudo-code:
for i in rows: for j in cols: left[i*cols + j] = *data ++data center[i*cols + j] = *data ++data right[i*cols + j] = *data ++data
其中rows,cols,data分别是输入的重叠的Image类图片的高,宽和数据。left,center,right是新建的用来保存左中右图片中数据的unsigned char的变量,最后利用Image类中SetData函数将left,center和right赋给定义的Image类的左中右的图片里。
博主写了一个自动分割Bumblebee XB3为左中右三视图的软件,并支持图片和视频的录制,需要使用的可以在我的github上下载:
https://github.com/grandyang/StereoCapture/tree/master/QtStereoCapturePGR
(使用本软件需要安装Point Grey Research的FlyCapture SDK,下载地址为: https://www.ptgrey.com/flycapture-sdk)
有任何疑问或改进欢迎留言评论:)