RealSense 开发(一):深度图像获取

RealSense 开发(一):深度图像获取

安装与配置VS工程

新建VS工程,项目属性
C++附加目录添加:
$(RSSDK_DIR)/include;$(RSSDK_DIR)/sample/common/include;
链接器附加库目录添加:
$(RSSDK_DIR)/lib/$(PlatformName);
$(RSSDK_DIR)/sample/common/lib/$(PlatformName)/$(PlatformToolset);

Release模式附加依赖项添加:
libpxc.lib
libpxcutils.lib

Debug模式附加依赖项添加:
libpxc_d.lib;
libpxcutils_d.lib;

至此,配置完成

代码

添加main.cpp,内容如下:

#include "stdio.h"
#include "pxcsensemanager.h"
#include "pxcsession.h"
#include "util_render.h"
#include "opencv2/opencv.hpp"
#include <math.h>
using namespace std;
using namespace cv;

//灰度图转伪彩图
void f_gray2color(Mat gray_mat,Mat color_mat)
{
    uchar* p=nullptr;
    Vec3b* q=nullptr;
    int height=gray_mat.rows;
    int width=gray_mat.cols;
    for(int i=0;i<height;i++)
    {
        for(int j=0;j<width;j++)
        {
            p=gray_mat.ptr<uchar>(i);
            q=color_mat.ptr<Vec3b>(i);
            if(p[j]==0)
            {q[j][0]=0;q[j][1]=0;q[j][2]=0;}
            else
            {
                q[j][0]=255-p[j];
                q[j][1]=128-abs(128-p[j]);
                q[j][2]=p[j];
            }
        }
    }
    return;
}
int main()
{ 
    //Mat image = imread("1.jpg");
    //namedWindow("pic_viewer", CV_WINDOW_NORMAL);
    //setWindowProperty("pic_viewer", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
    //imshow("pic_viewer", image);
    //waitKey(1000); //每隔1秒显示  
    //destroyAllWindows();


    UtilRender   *renderDepth=new UtilRender(L"DEPTH_STREAM");
    Mat framepic(480,640,CV_16UC1);//深度帧
    Mat preFramePic(480,640,CV_16UC1);//深度帧
    int frameCount = 0;

    PXCSenseManager *sm=PXCSenseManager::CreateInstance();

    PXCVideoModule::DataDesc desc={};
    desc.deviceInfo.streams = PXCCapture::STREAM_TYPE_COLOR | PXCCapture::STREAM_TYPE_DEPTH;

    //sm->EnableStream(PXCCapture::STREAM_TYPE_DEPTH,640,480);
    sm->EnableStreams(&desc);

    pxcStatus sts=sm->Init();
    if (sts<PXC_STATUS_NO_ERROR) {
        wprintf_s(L"Failed to locate any video stream(s)\n");
        sm->Release();
        return sts;
    }
    if(sm->AcquireFrame(true)<PXC_STATUS_NO_ERROR)
        cout<<"未正常打开"<<endl;
    PXCCapture::Sample *sample;
    PXCImage *depthpic;

    PXCImage:: ImageData depthImageData;
    PXCImage:: ImageData colorImageData;
    PXCImage::ImageInfo dinfo;

    while (sm->AcquireFrame(true)>=PXC_STATUS_NO_ERROR) 
    {

        sample=sm->QuerySample();
        depthpic=sample->depth;


        if (depthpic->AcquireAccess(PXCImage::ACCESS_READ,&depthImageData)<PXC_STATUS_NO_ERROR)
            cout<<"未正常获取深度图像"<<endl;

        dinfo=depthpic->QueryInfo();

        ushort* dpixels=(ushort*)depthImageData.planes[0];
        int dpitch=depthImageData.pitches[0]/sizeof(ushort);


        for (int y=0;y<(int)dinfo.height;y++)
        {
            ushort* p=framepic.ptr<ushort>(y);
            for(int x=0;x<(int)dinfo.width;x++)
            {
                ushort d=dpixels[y*dpitch+x];
                p[x]=d;
                //距离在0.2m1.2m之间
                //if (d>0)
                //  p[x]=255-0.255*(d-200);
                //else
                //  p[x]=0;    
            }
        }


        //Mat output;

        //framepic.convertTo(output,CV_8UC1,1);
        Mat color(480,640,CV_8UC3,Scalar(255,255,255));
        //f_gray2color(output,color);
        if (frameCount>1)
        {
            for (int y=0;y<(int)dinfo.height;y++)
            {
                ushort* p=framepic.ptr<ushort>(y);
                ushort* pp=preFramePic.ptr<ushort>(y);
                Vec3b *q= color.ptr<Vec3b>(y);
                for(int x=0;x<(int)dinfo.width;x++)
                {
                    if (abs(p[x]-pp[x])>10)//p[x]!=0 && pp[x]!=0 &&
                    {
                        //printf("%d\n",p[x]);
                        q[x][0]=0;
                        q[x][1]=0;
                        q[x][2]=255;
                    }
                }
            }
        }


        //imshow("depth picture",output);waitKey(1);
        //imwrite("dd.png",output);

        framepic.copyTo(preFramePic);

        frameCount++;
        depthpic->ReleaseAccess(&depthImageData);
        if(!renderDepth->RenderFrame(depthpic)) break;

        imshow("伪彩图",color);
        waitKey(1);

        sm->ReleaseFrame();
    }
    sm->Release();
}
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhnows

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值