我的AI之路(38)--使用深度相机之钜芯深度相机

      钜芯深度相机测距范围达100米左右,这点是一般深度相机所不能的。

      钜芯相机使用USB线供电,需要使用网线通过网络来访问相机内置程序获取到图像数据和视差数据,相机的地址固定为192.168.80.10,所以如果需要接入不同地址段的网内,需要买个USB转网口的转接器,将转接器的网口用网线与相机相连,转接器的USB线插到跑你的程序的板子上的USB3口,并且在你的板子上的操作系统里将转接器的网卡的地址设置为192.168.80.*,以保持和钜芯深度相机在同一网段。

      钜芯相机的驱动库和示例代码没有github项目,在购买相机后联系销售索取即可拿到一个包含有驱动库文件、头文件和示例代码文件的项目源码samplecode,samplecode里lib/pc/下是相机驱动的so库文件,include里面的moCameraDriver.h是你开发调用相机的API的代码时需要包含的头文件,source下面的sample.cpp既是示例代码又是工具代码,在Ubuntu16.04 LST下,安装opencv3和cmake后即可使用cmake编译这个文件,编译完后,在build目录里生成了一个samplecode二进制文件,将钜芯相机通过网线和USB转网口的转接器连到PC或者你的跑Ubuntu的板子的USB3口后,运行samplecode,即可弹出一个窗口看到相机的实时彩图图像和深度图像,按下数字键2,图像上会出现网格,并显示各网格里的深度数据,按下数字3,然后用鼠标点击图像,点击处显示深度数据。

     调用钜芯的API非常简单,在你的源码里包含进moCameraDriver.h这个头文件,然后使用里面的三个API:

     调用 moNewCameraDriver(int nMode, const char *pCameraPath, unsigned int nStartFrmNo, char bIsFlip)打开相机获得句柄,

     然后使用此句柄调用moGetBFBase(MO_CAM_DRIVER pHandle, float *fBFBase)获得相机的焦距 BFBase[0]和相机的基线BFBase[1],

     然后使用句柄循环调用 moGetNextFrameData(MO_CAM_DRIVER pHandle, int *pImgFrmNo, unsigned long long *pTime, void **ppGpsData, void **ppImuData, unsigned char **ppColorData, unsigned char **ppGreyData, unsigned char **ppDspData)获得相机的gps数据(无)、imu数据,彩色图数据、灰度图数据、视差数据,这里ppColorData、ppGreyData、ppDspData都是一维数组,在作为图像和对应的视差数据使用之前需要转换一下,例如:

     left =  cv::Mat::zeros(MO_CAMERA_IMAGE_HEIGHT, MO_CAMERA_IMAGE_WIDTH, CV_8UC3);

     memcpy(left.data, ppColorData, MO_CAMERA_IMAGE_WIDTH*MO_CAMERA_IMAGE_HEIGHT*3); 

    int dispDataArray[MO_CAMERA_IMAGE_HEIGHT][MO_CAMERA_IMAGE_WIDTH]; //disparity data array,默认图像大小1280x720

           int ix0 = 0,iy0 = 0;
           unsigned short *pDspDataHeader = (unsigned short*)ppDspData;
            for(int i = 0; i < MO_CAMERA_IMAGE_WIDTH*MO_CAMERA_IMAGE_HEIGHT; i++)
            {
                   unsigned int disp = 0;
                    if(*pDspDataHeader != 0){
                         disp = *pDspDataHeader;
                        //printf("Frame No:%d\n", *pDspDataHeader);
                     }
                    else 
                        disp=0;

                    pDspDataHeader++;
                   if(i < 1280){
                        ix0 = i;
                        iy0 = 0;
                   }else{
                       ix0 = i%1280;
                       iy0 = i/1280;
                    }
                  dispDataArray[iy0][ix0]=disp;    
              }

       钜芯相机的深度和视差的换算公式为 Z= 32*f/d = 32*BFBase[0]/dispDataArray[iy0][ix0],所以你还可以在上面的循环中直接将上面的数组里的视差数据换算为深度数据:

              dispDataArray[iy0][ix0] = 32*BFBase[0]/disp

然后使用彩色图像数据left.data去识别目标,然后从dispDataArray中获得目标位置对应的距离。

发布了61 篇原创文章 · 获赞 90 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/XCCCCZ/article/details/103796123