从RealSense中提取完整的深度和彩色图像,并存在opencv中的Mat里

这几天,简单的学习了如何调用别人函数,使用别人的代码,从开始的手足无措,到现在的胸有成竹(盲目的自信),想把这些总结起来,形成宝贵的经验教训,和大家分享。

1.使用别人的代码,可是要珍惜那几行人类的注释啊!
2.看完注释,了解了大概情况,从重点地方下手,找到最核心的代码,概括的了解写代码各自的意义(不必急需了解每一行代码的意义,抓住重点,节约时间)
3.对于不懂的函数但意义重大的函数,F12查看定义(对于vs),或者搜索开发者文档API。
4.如果碰到困难,饶了很多弯路,不要硬着头皮继续,这时候可能是思维的陷阱,休息一下,做点别的事情,再回过头来想,K.O.

有几个比较坑的地方
1.imshow必须碰到waitkey()才输出图像
2.深度信息,每个pixel是16位unsigned short类型,而竟然储存在8位byte的数组(指针)里,不知道为何这样做,我最后的处理方法是压缩到8位unsigned char中
3.彩色图像,默认是1080*1920的图像,但是,格式竟然是YUY2的,what ghost,还需要自己改成RGB格式的

直接分享源代码:

#include 
#include 
#include "util_render.h"
#include 
#include 
#include 
#include 
using namespace cv;
using namespace std;
int main()
{
    UtilRender *renderColor = new UtilRender(L"COLOR_STREAM");
    UtilRender *renderDepth = new UtilRender(L"DEPTH_STREAM");

    PXCSenseManager *psm = PXCSenseManager::CreateInstance();
    if (!psm)
    {
        wprintf_s(L"Unabel to create the PXCSenseManager\n");
        return 1;
    }


    psm->EnableStream(PXCCapture::STREAM_TYPE_COLOR);
    psm->EnableStream(PXCCapture::STREAM_TYPE_DEPTH);

    if (psm->Init() != PXC_STATUS_NO_ERROR)
    {
        wprintf_s(L"Unable to Init the PXCSenseManager\n");
        return 2;
    }

    PXCImage *colorIm, *depthIm;
    PXCImage::ImageData depth_data;
    PXCImage::ImageData color_data;
    PXCImage::ImageInfo depth_information;
    PXCImage::ImageInfo color_information;

    Mat img = Mat(480, 640, CV_8UC1);

    while (waitKey(1))
    {
        if (psm->AcquireFrame(true) < PXC_STATUS_NO_ERROR) break;

        PXCCapture::Sample *sample = psm->QuerySample();

        colorIm = sample->color;
        depthIm = sample->depth;

        colorIm->AcquireAccess(PXCImage::ACCESS_READ,PXCImage :: PIXEL_FORMAT_RGB24, &color_data);
        depthIm->AcquireAccess(PXCImage::ACCESS_READ, &depth_data);
        depth_information = sample->depth->QueryInfo();
        color_information = sample->color->QueryInfo();

        ushort *dpixels = (ushort*)depth_data.planes[0];
        for (int y = 0; y < depth_information.height; y++)
            for (int x = 0; x < depth_information.width; x++)
            {
                uchar d = dpixels[y * depth_information.width + x];
                img.at(y, x) = min((int)((double)d / 600 * 255), 255);
            }
        Mat color_img = Mat(color_information.height, color_information.width, CV_8UC3);
        uchar * dp = (uchar*)color_data.planes[0];
        int cnt = 0;
        for (int y = 0; y < color_information.height; y++)
            for (int x = 0; x < color_information.width; x++)
            {
                color_img.at(y, x)[0] = dp[cnt++];
                color_img.at(y, x)[1] = dp[cnt++];
                color_img.at(y, x)[2] = dp[cnt++];
            }
        namedWindow("a", 0);
        imshow("a", color_img);

        //imwrite("100.jpg", img);
        depthIm->ReleaseAccess(&depth_data);
        colorIm->ReleaseAccess(&color_data);

        //if (!renderColor->RenderFrame(sample->color)) break;
        //if (!renderDepth->RenderFrame(sample->depth)) break;

        psm->ReleaseFrame();
        cv::imshow("ok", img);
        /*Mat cur;
        medianBlur(img, cur, 5);
        cv::imshow("ok1", cur);*/
    }
    psm->Release();
}

参考I_will_____大神的代码

你可能感兴趣的:(从RealSense中提取完整的深度和彩色图像,并存在opencv中的Mat里)