【问题标题】:Convert a PXCImage into an OpenCV Mat将 PXCImage 转换为 OpenCV Mat
【发布时间】:2015-12-13 02:00:47
【问题描述】:

我正在开发英特尔的 RealSense SDK。出于信号处理的目的,我必须将其转换为 OpenCV 格式。

你有做这种转换的函数吗?

【问题讨论】:

    标签: c++ opencv realsense


    【解决方案1】:

    这里是转换(有些情况没有管理,但可以随意调整):

    void ConvertPXCImageToOpenCVMat(PXCImage *inImg, Mat *outImg) {
        int cvDataType;
        int cvDataWidth;
    
    
        PXCImage::ImageData data;
        inImg->AcquireAccess(PXCImage::ACCESS_READ, &data);
        PXCImage::ImageInfo imgInfo = inImg->QueryInfo();
    
        switch (data.format) {
            /* STREAM_TYPE_COLOR */
            case PXCImage::PIXEL_FORMAT_YUY2: /* YUY2 image  */
            case PXCImage::PIXEL_FORMAT_NV12: /* NV12 image */
                throw(0); // Not implemented
            case PXCImage::PIXEL_FORMAT_RGB32: /* BGRA layout on a little-endian machine */
                cvDataType = CV_8UC4;
                cvDataWidth = 4;
                break;
            case PXCImage::PIXEL_FORMAT_RGB24: /* BGR layout on a little-endian machine */
                cvDataType = CV_8UC3;
                cvDataWidth = 3;
                break;
            case PXCImage::PIXEL_FORMAT_Y8:  /* 8-Bit Gray Image, or IR 8-bit */
                cvDataType = CV_8U;
                cvDataWidth = 1;
                break;
    
            /* STREAM_TYPE_DEPTH */
            case PXCImage::PIXEL_FORMAT_DEPTH: /* 16-bit unsigned integer with precision mm. */
            case PXCImage::PIXEL_FORMAT_DEPTH_RAW: /* 16-bit unsigned integer with device specific precision (call device->QueryDepthUnit()) */
                cvDataType = CV_16U;
                cvDataWidth = 2;
                break;
            case PXCImage::PIXEL_FORMAT_DEPTH_F32: /* 32-bit float-point with precision mm. */
                cvDataType = CV_32F;
                cvDataWidth = 4;
                break;
    
            /* STREAM_TYPE_IR */
            case PXCImage::PIXEL_FORMAT_Y16:          /* 16-Bit Gray Image */
                cvDataType = CV_16U;
                cvDataWidth = 2;
                break;
            case PXCImage::PIXEL_FORMAT_Y8_IR_RELATIVE:    /* Relative IR Image */
                cvDataType = CV_8U;
                cvDataWidth = 1;
                break;
            }
    
        // suppose that no other planes
        if (data.planes[1] != NULL) throw(0); // not implemented
        // suppose that no sub pixel padding needed
        if (data.pitches[0] % cvDataWidth!=0) throw(0); // not implemented
    
        outImg->create(imgInfo.height, data.pitches[0] / cvDataWidth, cvDataType);
    
        memcpy(outImg->data, data.planes[0], imgInfo.height*imgInfo.width*cvDataWidth*sizeof(pxcBYTE));
    
        inImg->ReleaseAccess(&data);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 2017-02-19
      • 2018-11-28
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多