0x01

第一次使用SDK写代码,有很多不懂的地方,在设备来之前把文档看了一下,大概明白了点,东平西凑大概写了点,但是当把设备连接上去进行测试的时候就出现了各种问题,用RealSenseCamera进行开发的人还比较少,只有论坛上的一些零星的讨论,并且用C#进行开发的人还是占多数,毕竟和Unity3D结合起来还是比较有趣的。文档里写了入门的教程,但是因为和我的使用场景不太一样,其中又有些奇葩的地方,文档里又没有说明,对编程又不是很熟悉,导致到后来才大概猜到了一点,理解了一点,在这里写下来给大家一个参考。

0x02



我们这次采用的设备是intel RealSense Camera R200,它有RGB摄像头以及两个IR摄像头,通过与IR Laser Projector的结合可以得到场景的深度信息。SDK中还有很多内置的面部识别和手势识别等函数。但是我们并不需要用到那些,我只想获取它的左右两个红外摄像头采集到的图片。

0x03

首先遇到的问题的就是visual studio 2013配置的问题,本来它很贴心的提供了直接导入Property Sheet一键式的配置,可是我试了两次都失败了,而且传到github上以后发现其他人下载下来就没办法打开我的Solution了(里面出现我的配置文件的具体路径),于是还是进行了手动的配置。其实手动配置也挺好的,下次遇到其他的时候需要配置就可以自己动手了。原来配置opencv的时候就是各种不懂,别人怎么说我就怎么做,虽然最后可以写代码了,但是下次遇到这些问题又要把博客翻出来看看是怎么回事了。

本来按部就班按照他的指导手册一步一步来就可以了,可是各种报错。

Create Session

The SDK core is represented by two interfaces:

  • PXCSessionmanages all of the modules of the SDK
  • PXCSenseManagerorganizes a pipeline by starting,stopping,and pausing the operations of its varies modalities.
PXCSenseManager *psm=0;
psm = PXCSenseManager::CreateInstance();
if (!psm)
{
wprintf_s(L"Unable to create the PXCSenseManager\n");
return 1;// select the color stream of size 640x480 and depth stream of size 640x480
}
psm->EnableStream(PXCCapture::STREAM_TYPE_LEFT, 640, 480);
psm->EnableStream(PXCCapture::STREAM_TYPE_RIGHT, 640, 480);
psm -> Init()
}

然后初始化的时候就报错了,前面的配置没有问题。我就看了一下它的例子,然后把其中一段拷贝了出来

// Select the color and depth streams
PXCVideoModule::DataDesc ddesc={};
ddesc.deviceInfo.streams=PXCCapture::STREAM_TYPE_RIGHT |PXCCapture::STREAM_TYPE_LEFT;
sm->EnableStreams(&ddesc);

然后初始化没有问题,我当时就可想不通为什么这么来就行,用EnableStream就是不行呢,明明官方文档里没有提到这个问题啊。各种不理解,困惑了很长世间,导致我下面也没办法写下去。

0x04

后来在论坛里看到了这段代码

// Get the raw 16bit data from the infrared image
PXCMImage.ImageData irImageData;
irImageSource.AcquireAccess(PXCMImage.Access.ACCESS_READ,PXCMImage.PixelFormat.PIXEL_FORMAT_Y16,out irImageData);
irImageData.ToUShortArray(0, irData);
// despite the ir camera being 628 pixels wide, the raw bytes are stored with a "pitch" of 640
// in the case of 16bit data, the pitch is returned as 1280
int pitch = irImageData.pitches[0]/2;
int width = irImageSource.info.width;
int height = irImageSource.info.height;
for(int y = 0; y < height; y++){
for(int x = 0; x < width; x++){
int iA = (height-y-1) * pitch + x;
int iB = (y * width + x) * 4;
byte intensity = (byte)(irData[iA]/4);// raw pixels range between 0-1024
imgData[iB] = intensity;
imgData[iB+1] = intensity;
imgData[iB+2] = intensity;
imgData[iB+3] = 255; // Alpha
}
}

仔细琢磨了以后我发现自己对于PXCMImage::ImageData里面的pichespanels并不理解。重新看了文档以后我的理解是这样的:PXCMImage::ImageData里面存储的数据是在内存的某段空间,这段空间的首地址(类似于数组名)就放在panels[0]里。而piches(间距)表示的则是这段内存空间的宽度

但是还是不明白,为什么我上面的初始化会失败。我们后来还曾经尝试过用Github上面的一段代码把读取到的图像中的信息放到cv::Mat的格式里(长和宽设置为640×480)。它会提示超出了内存范围。尝试了各种断点之后发现,设备的信息返回的图像的大小是很诡异的628×468,当把图像大小设置为这个数字的时候按照教程来就不会出现无法初始化的问题了,看来问题出在这个图像的大小上。

于是搜索了一下SDK的文档,关于红外成像的大小的,发现是这样的



返回的并没有640×480这个选项。到这里就恍然大悟了。

首先为什么初始化失败:我把图像的大小设置成了640×480,虽然能够启动数据流,但是初始化就出问题了,而后面提到的那种设置方式是采用了默认的大小。

第二,为什么后面会出现超出内存空间的错误,是因为虽然他的piches是640,但是在红外的情况下,实际上只在前面的628位上存储有图像的数据,后面的索引自然是失效的。但是如果要把图像的信息传输完全就要把循环结构中的int iA = (height-y-1) * pitch + x;使用pich而不是628

0x05

写了这么几段,也不知道有没有把问题说清楚,第一次写这样子的所谓技术博客还是没什么经验,但是我相信会越写越好的,下次用_visio_画图把问题说的更清楚。

Realsense Camera SDK 开发手记(一)的更多相关文章

  1. Kinect for Windows SDK开发入门(一):开发环境配置

    [译]Kinect for Windows SDK开发入门(一):开发环境配置 前几天无意中看到微软发布了Kinect for windows sensor,进去看了一下Kinect应用的例子,发现K ...

  2. Kinect for Windows SDK开发入门(15):进阶指引 下

    Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...

  3. 【转】Android Camera 相机开发详解

    在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...

  4. 《Android原生整合虹软SDK开发uniapp插件》

    1.项目背景 应公司要求,需要开发一套类似人脸打卡功能的app,但是因为我们公司没有很强的原生android开发者,所以根据现状选择了第三方跨平台的uniapp,想必目前大多人都了解这个平台了,我也就 ...

  5. Kinect for Windows SDK开发学习相关资源

    Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...

  6. 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  7. 高拍仪拍照SDK开发(良田影像S300L|S500L)

    高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...

  8. TortoiseSVN安装以及淘宝 TAE SDK 开发环境的搭建

    一.TortoiseSVN 的下载和安装 1.进入TortoiseSVN 官网下载地址http://tortoisesvn.net/downloads.html,根据自己的操作系统位数下载相应最新版本 ...

  9. SDK开发断点失效

    做SDK开发,一般会创建一个静态库工程,然后添加一个app的Target 可是,Xcode7创建的工程,app的Target中断点有效,能断住,为什么静态库的Target中的断点断不住呀. 断点断住发 ...

随机推荐

  1. [转载]expect spawn、linux expect 用法小记

    原文地址:expect spawn.linux expect 用法小记作者:悟世 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写 ...

  2. Solr之NamedList 简单介绍与实例解析

    大家都知道,Solr是一个基于Lucene高可配置的搜索服务器,大部分参数值以及相关优化等等都可以在solrconfig.xml中配置,那么就需要一个能够很快的进行解析和读取配置文件内容的数据结构,为 ...

  3. window与linux互相拷贝文件

    借助 PSCP 命令可以实现文件的互拷: 1.下载pscp.exe 文件 (我的资源文件中有) http://download.csdn.net/detail/trassion/5689189 2.如 ...

  4. ffmpeg利用libav库把yuv视频流转换为TS串流

    今天到月末了,才发我这个月的第一篇文章,因为这个月前三周一直在看ffmpeg的libavcodec和libavformat两个库源码.实验室要做一个“小传大”的软件,就是android手机或平板电脑的 ...

  5. kubernetes源码阅读及编译

    kubernetes源码阅读 工欲善其事,必先利其器.在阅读kubernetes源码时,我也先后使用过多个IDE,最终还是停留在IDEA上. 我惯用的是pycharm(IDEA的python IDE版 ...

  6. Windows平台下安装Eclipse插件,开发Hadoop应用

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  7. html5新标签布局应用指南

    html5中为了便于设计者的网站布局新添加了一些标签,本文主要讲解这些标签的实际应用方法. 大多数前端的朋友在设计网站时主要应用<div>标签构造盒子进行布局,这是种非常高效的方法,可以将 ...

  8. 无线网卡连接internet,有线网卡向另一台电脑分享网络(笔记本当有线路由器)

    有一台笔记本和一台台式机,都放在卧室内 笔记本能用无线网卡连接到客厅的路由器,台式机没有配备无线网卡,不能上网 要从客厅的路由器那边拉一条网线到卧室内连接台式机显然很蠢,在卧室内购置一台中继路由器也不 ...

  9. app外包开发注意事项大全『最新』

    随着移动互联网的高速发展,很多互联网创业公司或传统向互联网转型的公司都急需发开一款app软件,多数公司会选择让外包公司来开发.问题来了,App外包市场鱼龙混杂,我们要如何在这里面选择一个靠谱的公司,这 ...

  10. 国内下载比较快的Maven仓库镜像

    #收集的比较快的maven仓库 http://maven.wso2.org/nexus/content/groups/public/ http://jcenter.bintray.com/http:/ ...