0

没有官方的SDK,有人可以帮忙吗?如何在ubuntu(或其他linux env)中将realsense RGB帧转换为cv::Mat?

4

4 回答 4

1

如果您正在为 ubuntu 使用新的 librealsense SDK:那么创建一个新的 cv::Mat 实例就像相机的高度和宽度以及您获取的图像的尺寸一样简单。

cv::Mat vis = cv::Mat(1080,1920,CV_8UC3);

之后剩下的唯一步骤是将流给出的数据分配给矩阵的 vis.data 属性

vis.data = (uchar*)reinterpret_cast<const uint8_t *>(dev->get_frame_data(rs::stream::color));`

(uchar*) 转换是将 uint8_t 格式转换为 cv::Mat 的本机格式。

因为 Realsense 流以 BGR 的形式提供颜色,而 opencv 使用 RGB 来表示图像,所以最后一步是将矩阵转换为正确的格式:

cv::cvtColor(vis, vis, CV_BGR2RGB);
于 2016-06-24T16:35:17.923 回答
1

似乎您可以创建 3 个 cv::Mat 来表示图像 RGB + Depth + IR 的每个分量。因此,它应该类似于

cv::Mat frameColor = cv::Mat::zeros(resolutionColor.height, resolutionColor.width, CV_8UC3); cv::Mat frameDepth = cv::Mat::zeros(resolutionDepth.height, resolutionDepth.width, CV_32FC1); cv::Mat frameIR = cv::Mat::zeros(resolutionIR.height, resolutionIR.width, CV_8UC1);

检查此论坛 - > https://software.intel.com/en-us/forums/realsense/topic/538066并将 PXCImage 转换为 OpenCV Mat

于 2016-05-17T03:07:38.887 回答
0
/***
Returns the next frame if next frame is recorded
Returns the previous frame if next frame is not recorded
***/
void Converter::ConvertPXCImageToOpenCVMat(Intel::RealSense::Image *inImg, Intel::RealSense::ImageData data, cv::Mat *outImg) {
    auto cvDataType = 0;
    auto cvDataWidth = 0;

    auto imgInfo = inImg->QueryInfo();

    switch (data.format) {
        /* STREAM_TYPE_COLOR */
    case Intel::RealSense::Image::PIXEL_FORMAT_YUY2: /* YUY2 image  */
    case Intel::RealSense::Image::PIXEL_FORMAT_NV12: /* NV12 image */
        throw; // Not implemented
    case Intel::RealSense::Image::PIXEL_FORMAT_RGB32:  /* BGRA layout on a little-endian machine */
        cvDataType = CV_8UC4;
        cvDataWidth = 4;
        break;
    case Intel::RealSense::Image::PIXEL_FORMAT_RGB24:  /* BGR layout on a little-endian machine */
        cvDataType = CV_8UC3;
        cvDataWidth = 3;
        break;
    case Intel::RealSense::Image::PIXEL_FORMAT_Y8: /* 8-Bit Gray Image, or IR 8-bit */
        cvDataType = CV_8U;
        cvDataWidth = 1;
        break;
        /* STREAM_TYPE_DEPTH */
    case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH:  /* 16-bit unsigned integer with precision mm. */
    case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH_RAW: /* 16-bit unsigned integer with device specific precision (call device->QueryDepthUnit()) */
        cvDataType = CV_16U;
        cvDataWidth = 2;
        break;
    case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH_F32: /* 32-bit float-point with precision mm. */
        cvDataType = CV_32F;
        cvDataWidth = 4;
        break;
        /* STREAM_TYPE_IR */
    case Intel::RealSense::Image::PIXEL_FORMAT_Y16: /* 16-Bit Gray Image */
        cvDataType = CV_16U;
        cvDataWidth = 2;
        break;
    case Intel::RealSense::Image::PIXEL_FORMAT_Y8_IR_RELATIVE: /* Relative IR Image */
        cvDataType = CV_8U;
        cvDataWidth = 1;
        break;
    default: 
        break;
    }

    // suppose that no other planes
    if (data.planes[1] != nullptr) throw; // not implemented
                                          // suppose that no sub pixel padding needed
    if (data.pitches[0] % cvDataWidth != 0) throw; // not implemented

    outImg->create(imgInfo.height, data.pitches[0] / cvDataWidth, cvDataType);

    //memcpy(outImg->data, data.planes[0], imgInfo.height*imgInfo.width*cvDataWidth * sizeof(pxcBYTE));
    memcpy(outImg->data, data.planes[0], imgInfo.height*imgInfo.width*cvDataWidth * sizeof(uint8_t));
}
于 2017-06-14T01:03:13.253 回答
0

一旦你有了示例图像

PXCImage::ImageData c_image;
cv::Mat p_image;
PXCCapture::Sample *sample = sm->QuerySample();

            if (sample->color != NULL)
            {

                sample->color->AcquireAccess(PXCImage::ACCESS_READ_WRITE, PXCImage::PIXEL_FORMAT_RGB32, &c_image);
                PXCImage::ImageInfo inputInfo = sample->color->QueryInfo();
                cv::Mat img = cv::Mat(inputInfo.height, inputInfo.width, CV_8UC4, c_image.planes[0], c_image.pitches[0]);
                sample->color->ReleaseAccess(&c_image);


            }
于 2016-06-06T06:04:41.683 回答