关于灰点公司Bumblebee相机图像分离
由于实验室工作需要,需要使用灰点公司Bumblebee xb3三目立体视觉照相机获取三张图像,过程中发现获取图像没有想象中那么简单,费了不少的功夫,在这里和大家分享一下,其实该工作是两年前完成的,之所以不发是因为没有闲余时间,有地方不对还望指正!
首先来介绍一下灰点,Point Grey Research公司于1997年1月成立,是专业的机械视觉、工业成像和计算机视觉硬件生产研发企业,产品线覆盖全景视觉,全景摄像,立体视觉系统多个领域,主要产品型号有:(来自互动百科总结)
Point Grey增强现实图像采集设备FMVU
Point Grey增强现实图像采集设备FFMV
Ladybug3全景视觉系统
Bumblebee3立体视觉系统
Bumblebee2立体视觉系统
本次要用到的就是Bumblebee3系列xb3,如下图所示:
这款相机有两个1394b接口提供高速的图像传输,官方在软件方面提供了两个SDK开发包(产品更新到现在好像是一个了),FlyCap2Viewer和triclops,前一个主要实现图像获取、参数设定等基本功能,后者则可用于深度信息获取等计算机视觉开发,但我通过Demo获取的视差图总是差强人意,怀疑是参数问题(其实灰点公司在算法方面也不是很强。。呵呵),于是尝试使用opencv进行立体匹配获取视差图,但在第一步图像获取阶段就卡住不动了。。。。刚开始使用官方Document中方法获取到的图象类似这样的:(不好意思,这里找不到原来的图了,只能从别处扣一张)
三个视图分别被存在了RED, GREEN, BLUE通道里面,因此只需要将三个通道进行分离,分离后效果是这样的:
过程比较曲折,这里就分享一下存储方式和分离方法吧:
这里我们要用到官方的FlyCapture2和opencv两个SDK,大概如下:
1. 使用官方SDK初始化相机,代码如下:
error = busMgr.GetNumOfCameras( &numCameras);
PGRGuid guid;
if(numCameras == 0)
{
printf("error in GetNumOfCameras");
system("pause");
return 0;
}
error = busMgr.GetCameraFromIndex(0, &guid);
if (error != PGRERROR_OK)
{
printf( "error in GetCameraFromIndex");
system("pause");
return -1;
}
Camera cam;
error = cam.Connect(&guid);
if (error != PGRERROR_OK)
{
printf( "error in Connect");
system("pause");
return -1;
}
error = cam.StartCapture();
if (error != PGRERROR_OK)
{
printf( "error in startcapture");
system("pause");
return -1;
}
Property shutter(SHUTTER);
error = cam.GetProperty(&shutter);
if (error != PGRERROR_OK)
{
printf( "error in getproperty");
system("pause");
return -1;
}
shutter.absValue = (double)0.2;
shutter.absControl = true;
shutter.onePush = false;
shutter.onOff = true;
shutter.present = true;
error = cam.SetProperty(&shutter);
if (error != PGRERROR_OK)
{
printf( "error in setproperty");
system("pause");
return -1;
}
每一个函数均返回一个error类,便于判断问题,还是很方便的。
2. 使用opencv读取图像并分离:
unsigned char* data = convertedImage.GetData();
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
leftdata[i*cols+j]=*data;
++data;
centerdata[i*cols+j]=*data;
++data;
rightdata[i*cols+j]=*data;
++data;
}
}
最后得感谢一下这一篇博文给我的帮助:http://www.cnblogs.com/grandyang/p/4105725.html