一、简要介绍

关于realsense的介绍,网上很多,这里不再赘述,sdk及相关文档可参考realsense SDK,也可参考开发人员专区

运行代码之前,要确保你已经安装好了realsense的DCM和SDK,官网有教程,具体请参考DCM和SDK安装步骤

二、代码

  1. #include <pxcsensemanager.h>
  2. #include <pxcsession.h>
  3. #include "util_render.h"
  4. #include <iostream>
  5. #include <string>
  6. #include <stdio.h>
  7. #include <opencv2\opencv.hpp>
  8. #include <windows.h>
  9. #define WIDTH 640
  10. #define HEIGHT 480
  11. using namespace cv;
  12. using namespace std;
  13. int main(int argc, char** argv)
  14. {
  15. UtilRender *renderColor = new UtilRender(L"COLOR_STREAM");
  16. UtilRender *renderDepth = new UtilRender(L"DEPTH_STREAM");
  17. PXCSenseManager *psm = 0;
  18. psm = PXCSenseManager::CreateInstance();
  19. if (!psm)
  20. {
  21. wprintf_s(L"Unabel to create the PXCSenseManager\n");
  22. return 1;
  23. }
  24. pxcStatus sts;
  25. psm->EnableStream(PXCCapture::STREAM_TYPE_COLOR, WIDTH, HEIGHT);
  26. psm->EnableStream(PXCCapture::STREAM_TYPE_DEPTH, WIDTH, HEIGHT);
  27. sts = psm->Init();
  28. if (sts != PXC_STATUS_NO_ERROR)
  29. {
  30. wprintf_s(L"Unabel to Initializes the pipeline\n");
  31. return 2;
  32. }
  33. PXCImage *colorIm, *depthIm;
  34. PXCImage::ImageData depth_data,color_data;
  35. PXCImage::ImageInfo depth_info,color_info;
  36. while (psm->AcquireFrame(true) >= PXC_STATUS_NO_ERROR)
  37. {
  38. if (psm->AcquireFrame(true) < PXC_STATUS_NO_ERROR) break;
  39. PXCCapture::Sample *sample = psm->QuerySample();
  40. colorIm = sample->color;
  41. depthIm = sample->depth;
  42. if (colorIm->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24, &color_data) < PXC_STATUS_NO_ERROR)
  43. wprintf_s(L"未正常获取彩色图\n");
  44. if (depthIm->AcquireAccess(PXCImage::ACCESS_READ, &depth_data) < PXC_STATUS_NO_ERROR)
  45. wprintf_s(L"未正常获取深度图\n");
  46. depth_info = sample->depth->QueryInfo();
  47. color_info = sample->color->QueryInfo();
  48. Mat depth(Size(depth_info.width, depth_info.height), CV_16UC1, (void*)depth_data.planes[0], depth_data.pitches[0] / sizeof(uchar));
  49. Mat color(Size(color_info.width, color_info.height), CV_8UC3, (void*)color_data.planes[0], color_data.pitches[0] / sizeof(uchar));
  50. depthIm->ReleaseAccess(&depth_data);
  51. colorIm->ReleaseAccess(&color_data);
  52. if (!renderColor->RenderFrame(colorIm)) break;
  53. if (!renderDepth->RenderFrame(depthIm)) break;
  54. psm->ReleaseFrame();
  55. imshow("color", color);
  56. waitKey(1);
  57. //CV_16UC1的图片在imshow时会除以256,将最远探测距离设为z,那么imshow时可以乘以255*256/z,此处乘以15
  58. imshow("depth", depth * 15);
  59. waitKey(1);
  60. }
  61. psm->Release();
  62. system("pause");
  63. }
#include <pxcsensemanager.h>
#include <pxcsession.h>
#include "util_render.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <opencv2\opencv.hpp>
#include <windows.h> #define WIDTH 640
#define HEIGHT 480 using namespace cv;
using namespace std; int main(int argc, char** argv)
{
UtilRender *renderColor = new UtilRender(L"COLOR_STREAM");
UtilRender *renderDepth = new UtilRender(L"DEPTH_STREAM"); PXCSenseManager *psm = 0;
psm = PXCSenseManager::CreateInstance();
if (!psm)
{
wprintf_s(L"Unabel to create the PXCSenseManager\n");
return 1;
}
pxcStatus sts; psm->EnableStream(PXCCapture::STREAM_TYPE_COLOR, WIDTH, HEIGHT); psm->EnableStream(PXCCapture::STREAM_TYPE_DEPTH, WIDTH, HEIGHT); sts = psm->Init();
if (sts != PXC_STATUS_NO_ERROR)
{
wprintf_s(L"Unabel to Initializes the pipeline\n");
return 2;
} PXCImage *colorIm, *depthIm;
PXCImage::ImageData depth_data,color_data;
PXCImage::ImageInfo depth_info,color_info;
while (psm->AcquireFrame(true) >= PXC_STATUS_NO_ERROR) {
if (psm->AcquireFrame(true) < PXC_STATUS_NO_ERROR) break; PXCCapture::Sample *sample = psm->QuerySample(); colorIm = sample->color;
depthIm = sample->depth; if (colorIm->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::PIXEL_FORMAT_RGB24, &color_data) < PXC_STATUS_NO_ERROR)
wprintf_s(L"未正常获取彩色图\n");
if (depthIm->AcquireAccess(PXCImage::ACCESS_READ, &depth_data) < PXC_STATUS_NO_ERROR)
wprintf_s(L"未正常获取深度图\n"); depth_info = sample->depth->QueryInfo();
color_info = sample->color->QueryInfo(); Mat depth(Size(depth_info.width, depth_info.height), CV_16UC1, (void*)depth_data.planes[0], depth_data.pitches[0] / sizeof(uchar));
Mat color(Size(color_info.width, color_info.height), CV_8UC3, (void*)color_data.planes[0], color_data.pitches[0] / sizeof(uchar)); depthIm->ReleaseAccess(&depth_data);
colorIm->ReleaseAccess(&color_data); if (!renderColor->RenderFrame(colorIm)) break;
if (!renderDepth->RenderFrame(depthIm)) break; psm->ReleaseFrame(); imshow("color", color);
waitKey(1);
//CV_16UC1的图片在imshow时会除以256,将最远探测距离设为z,那么imshow时可以乘以255*256/z,此处乘以15
imshow("depth", depth * 15);
waitKey(1); }
psm->Release();
system("pause");
}

三、相关解释

新建项目,写入源代码,生成解决方案之前,记得要在项目的属性管理器右键项目,选择添加现有属性表,选择C:\Program Files (x86)\Intel\RSSDK\props目录下的一个官方配置好的属性表(前提是DCM和SDK的安装路径是默认路径,没有自行修改);另外因为我们还要进行cv::Mat类型的转化,所以也要导入opencv的属性表。

运行之后,可以看到4个窗口,COLOR_STREAM和DEPTH_STREAM为分别realsense提取到的彩色视频流和深度视频流;color和depth分别为我们转化为opencv中mat类型之后的彩色和深度视频流。

目前实现pxcimage到mat类型转化的方法有好几种,大体类似,主要是对PXCImage::ImageData中的plane和pitch的理解,博主理解为plane[0]为该sdk中图片数据的首地址,pitches可参考http://www.cnblogs.com/gamedes/p/4541765.html。

也看到论坛上有人专门写过pxcimage到mat类型的转化函数,函数代码如下:

  1. void ConvertPXCImageToOpenCVMat(PXCImage *inImg, Mat *outImg) {
  2. int cvDataType;
  3. int cvDataWidth;
  4. PXCImage::ImageData data;
  5. inImg->AcquireAccess(PXCImage::ACCESS_READ, &data);
  6. PXCImage::ImageInfo imgInfo = inImg->QueryInfo();
  7. switch (data.format) {
  8. /* STREAM_TYPE_COLOR */
  9. case PXCImage::PIXEL_FORMAT_YUY2: /* YUY2 image  */
  10. case PXCImage::PIXEL_FORMAT_NV12: /* NV12 image */
  11. throw(0); // Not implemented
  12. case PXCImage::PIXEL_FORMAT_RGB32: /* BGRA layout on a little-endian machine */
  13. cvDataType = CV_8UC4;
  14. cvDataWidth = 4;
  15. break;
  16. case PXCImage::PIXEL_FORMAT_RGB24: /* BGR layout on a little-endian machine */
  17. cvDataType = CV_8UC3;
  18. cvDataWidth = 3;
  19. break;
  20. case PXCImage::PIXEL_FORMAT_Y8:  /* 8-Bit Gray Image, or IR 8-bit */
  21. cvDataType = CV_8U;
  22. cvDataWidth = 1;
  23. break;
  24. /* STREAM_TYPE_DEPTH */
  25. case PXCImage::PIXEL_FORMAT_DEPTH: /* 16-bit unsigned integer with precision mm. */
  26. case PXCImage::PIXEL_FORMAT_DEPTH_RAW: /* 16-bit unsigned integer with device specific precision (call device->QueryDepthUnit()) */
  27. cvDataType = CV_16U;
  28. cvDataWidth = 2;
  29. break;
  30. case PXCImage::PIXEL_FORMAT_DEPTH_F32: /* 32-bit float-point with precision mm. */
  31. cvDataType = CV_32F;
  32. cvDataWidth = 4;
  33. break;
  34. /* STREAM_TYPE_IR */
  35. case PXCImage::PIXEL_FORMAT_Y16:          /* 16-Bit Gray Image */
  36. cvDataType = CV_16U;
  37. cvDataWidth = 2;
  38. break;
  39. case PXCImage::PIXEL_FORMAT_Y8_IR_RELATIVE:    /* Relative IR Image */
  40. cvDataType = CV_8U;
  41. cvDataWidth = 1;
  42. break;
  43. }
  44. // suppose that no other planes
  45. if (data.planes[1] != NULL) throw(0); // not implemented
  46. // suppose that no sub pixel padding needed
  47. if (data.pitches[0] % cvDataWidth!=0) throw(0); // not implemented
  48. outImg->create(imgInfo.height, data.pitches[0] / cvDataWidth, cvDataType);
  49. memcpy(outImg->data, data.planes[0], imgInfo.height*imgInfo.width*cvDataWidth*sizeof(pxcBYTE));
  50. inImg->ReleaseAccess(&data);
  51. }
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);
}

原则上传入pxcimage的指针,再通过case根据原图像类型选择要转化的图像类型是没有问题的,博主尝试过使用这个函数,但总会出现R1060的错误,似乎是指针非法使用。大家可以自行尝试一下,成功的小伙伴麻烦告知一下博主,让博主学习学习。

Realsense 提取彩色和深度视频流的更多相关文章

  1. Kinect SDK(1):读取彩色、深度、骨骼信息并用OpenCV显示

    Kinect SDK 读取彩色.深度.骨骼信息并用OpenCV显示 一.原理说明 对于原理相信大家都明白大致的情况,因此,在此只说比较特别的部分. 1.1 深度流数据: 深度数据流所提供的图像帧中,每 ...

  2. Kinect v1 (Microsoft Kinect for Windows v1 )彩色和深度图像对的采集步骤

    Kinect v1 (Microsoft Kinect for Windows v1 )彩色和深度图像对的采集步骤 一.在ubuntu下尝试 1. 在虚拟机VWware Workstation 12. ...

  3. opencv入门系列教学(七)改变颜色空间、提取彩色对象

    ​ 0.序言 之前的博客里我们介绍了opencv在图像上的基本操作,下面我们来进行稍微深入一点的介绍,从这里开始我们可以发现opencv库能给我们带来的更多更有趣的功能.从现在开始,我们将逐步深入了解 ...

  4. kinect 录制彩色和深度视频

    安装 KinectSDK-v1.8-Setup.exe OpenNI-Windows-x86-2.1.0.msi Qt工程 拷贝 Redist 下内容到 编译的exe所在目录 #include < ...

  5. RealSense R400系列深度相机的图像获取保存和格式转换

    关于RealSense的基础使用的博文用的库有点混杂,挺多博文都是早期maneger的那个库,对那个不是很了解,主要记录一下使用最新的函数库的基础使用. 相机型号:RealSense R435 使用函 ...

  6. js对flv提取h264、aac音视频流

    FLV提取里面的h264视频流 FLV和MP4支持的编码 流媒体和媒体文件的区别 流媒体是指将一连串的多媒体资料压缩后,经过互联网分段发送资料,在互联网上即时传输影音以供观赏的一种技术与过程,此技术使 ...

  7. 【计算机视觉】深度相机(九)--OpenNI API及中间件说明

    本文由官方文档翻译而来 总览 目的 OpenNI 2.0 API(应用程序编程接口)提供了访问PrimerSense的兼容深度传感器.这就使得一个应用程序能够初始化传感器和从设备接收深度(depth) ...

  8. 提取线条的lines_color、lines_facet、 lines_gauss算子

    Halcon中线条提取的算子主要有: lines_color(Image : Lines : Sigma, Low, High, ExtractWidth, CompleteJunctions : ) ...

  9. face recognition[翻译][深度人脸识别:综述]

    这里翻译下<Deep face recognition: a survey v4>. 1 引言 由于它的非侵入性和自然特征,人脸识别已经成为身份识别中重要的生物认证技术,也已经应用到许多领 ...

随机推荐

  1. UVA 1663 Purifying Machine (二分图匹配,最大流)

    题意: 给m个长度为n的模板串,模板串由0和1和*三种组成,且每串至多1个*,代表可0可1.模板串至多匹配2个串,即*号改成0和1,如果没有*号则只能匹配自己.问:模板串可以缩减为几个,同样可以匹配原 ...

  2. Android中ListView嵌套进ScrollView时高度很小的解决方案

    package com.example.test.util; import android.view.View; import android.view.ViewGroup; import andro ...

  3. [android]如何让TextView使用超链接

    找了很多网址,最后是这个有说到. 总的做法是: 1.(当然也可以从Res中获取.) tv.setText(Html.fromHtml("<a href=\"http://ww ...

  4. MySQL row模式binlog复制原理

    http://www.360doc.com/content/14/1107/14/12904276_423333021.shtml

  5. 《C++ primer》--第12章

    习题12.7 什么是封装?为什么封装是有用的? 解答: 封装是一种将低层次的元素组合起来形成新的.高层次实体的技术.例如,函数是封装的一种形式:函数所执行的细节行为被封装在函数本身这个更大的实体中:类 ...

  6. lightoj 1022

    直接算即可,特别要注意精度 #include<cstdio> #include<cmath> int main(){ int t, CASE(0); double r; sca ...

  7. mysql EF

    使用 mysql-installer-community-5.6.26.0.msi visual studio 2013 update 4版 Install-Package EntityFramewo ...

  8. SQL你必须知道的-函数及类型转换

    use MySchoolTwo    --ISNULL(expression,value) :如果 expression不为空则返回 expression ,否则返回 value.    select ...

  9. javascript AES加密 C#AES解密实现

    首先需要引入js类库 crypto-js(开源),地址:http://code.google.com/p/crypto-js 现在很多人无法打开这个地址不要紧,下面我们会将全部代码贴出来 需要引入 a ...

  10. bookhub -- 扁平化本地电子书管理与分享工具

    代码 github 地址:https://github.com/JackonYang/bookhub 初稿:    1. 关键功能点 扫描本地电子书(扩展名 pdf/epub 等),将不重复的复制到特 ...