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. VS 2012 单元测试简单配置

    写算法时大多依靠简单输入验证,经常遇到小范围输入正常,大范围或特殊情况输入结果错误的问题.所以写程序之前最好先想好几个特殊用例来测试,以验证算法是否正确.单元测试就是个不错的工具,而VS 2012提供 ...

  2. listView 分页加载数据

    Android应用 开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页 的形式来展示数据,个人觉得这样会有 ...

  3. 横瓜先生关于如何利用MYSQL数据库设计CMS系统处理100亿级TB规模的数据量

    遥执乾坤(44758121)  18:21:23 mysql据说只能使用一个索引,我这里几乎所有字段都有索引. 但每个字段就算用索引,也需要扫描至少100w以上记录. 横瓜(601069289)  1 ...

  4. 使用php完成常见的"文件上传"功能

    文件上传现在都是很常见的了,可以上传文件,上传头像等,不同的浏览器"文件上传"有不同的效果 先看下火狐浏览器的效果是这样的: 再看下IE浏览器是这样的: 还有很多其他的浏览器,就不 ...

  5. CI Weekly #11 | 微服务场景下的自动化测试与持续部署

    又一周过去了,最近我们的工程师正在搞一个"大事情" --「[flow.ci](http://flow.ci/?utm_source=bokeyuan&utm_medium= ...

  6. C++中的异常

    一,异常的推演 1.函数与异常 平时我们在函数中出现异常情况时通常通过return终止函数并返回一个值,然后在函数上层来获取值并判断是什么异常情况.因为函数是栈结构的,所以return的时候是通过栈结 ...

  7. Scrapy框架安装配置小结

    Windows 平台: 系统是 Win7 Python  2.7.7版本 官网文档:http://doc.scrapy.org/en/latest/intro/install.html 1.安装Pyt ...

  8. Amazon才推众包物流,“京东众包”已红绿上阵,“达达”还手握10万配送大军

    据外媒消息,Amazon正在开发一款App,想让大家都来为他家送包裹. Amazon的设想是,在市区招募实体零售商,租用空间或者按包裹向其支付费用.这项服务在内部代号为“On My Way”,目前还在 ...

  9. DB2表是否存在

    select count(1) from syscat.tables where tabname='T1';

  10. Redis客户端API操作 Jedis详解

    redis是一个著名的key-value存储系统,也是nosql中的最常见的一种.其实,个人认为,redis最强大的地方不在于其存储,而在于其强大的缓存作用. 我们可以把它想象成一个巨大的(多借点集群 ...