Bumblebee相机图像分离

关于灰点公司Bumblebee相机图像分离

由于实验室工作需要,需要使用灰点公司Bumblebee xb3三目立体视觉照相机获取三张图像,过程中发现获取图像没有想象中那么简单,费了不少的功夫,在这里和大家分享一下,其实该工作是两年前完成的,之所以不发是因为没有闲余时间,有地方不对还望指正!

首先来介绍一下灰点,Point Grey Research公司于1997年1月成立,是专业的机械视觉、工业成像和计算机视觉硬件生产研发企业,产品线覆盖全景视觉,全景摄像,立体视觉系统多个领域,主要产品型号有:(来自互动百科总结)

Point Grey增强现实图像采集设备FMVU
Point Grey增强现实图像采集设备FFMV
Ladybug3全景视觉系统
Bumblebee3立体视觉系统
Bumblebee2立体视觉系统

本次要用到的就是Bumblebee3系列xb3,如下图所示:

Bumblebee 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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值