Realsense Camera SDK 开发手记(一)
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里面的piches和panels并不理解。重新看了文档以后我的理解是这样的: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 开发手记(一)的更多相关文章
- Kinect for Windows SDK开发入门(一):开发环境配置
		
[译]Kinect for Windows SDK开发入门(一):开发环境配置 前几天无意中看到微软发布了Kinect for windows sensor,进去看了一下Kinect应用的例子,发现K ...
 - Kinect for Windows SDK开发入门(15):进阶指引 下
		
Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...
 - 【转】Android Camera 相机开发详解
		
在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...
 - 《Android原生整合虹软SDK开发uniapp插件》
		
1.项目背景 应公司要求,需要开发一套类似人脸打卡功能的app,但是因为我们公司没有很强的原生android开发者,所以根据现状选择了第三方跨平台的uniapp,想必目前大多人都了解这个平台了,我也就 ...
 - Kinect for Windows SDK开发学习相关资源
		
Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...
 - 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
		
Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...
 - 高拍仪拍照SDK开发(良田影像S300L|S500L)
		
高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...
 - TortoiseSVN安装以及淘宝 TAE SDK 开发环境的搭建
		
一.TortoiseSVN 的下载和安装 1.进入TortoiseSVN 官网下载地址http://tortoisesvn.net/downloads.html,根据自己的操作系统位数下载相应最新版本 ...
 - SDK开发断点失效
		
做SDK开发,一般会创建一个静态库工程,然后添加一个app的Target 可是,Xcode7创建的工程,app的Target中断点有效,能断住,为什么静态库的Target中的断点断不住呀. 断点断住发 ...
 
随机推荐
- 正则表达式引擎:nfa的转换规则。
			
正则表达式引擎:nfa的转换规则. 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多 ...
 - squid和varnish的小结
			
squid和varnish的小结 http://blog.haohtml.com/ 上周初步接触linux下的这2个反向缓存软件,都实验了一下,貌似squid还是比较顺利的,varnish则碰 ...
 - java ArrayList的序列化分析
			
一.绪论 所谓的JAVA序列化与反序列化,序列化就是将JAVA 对象以一种的形式保持,比如存放到硬盘,或是用于传输.反序列化是序列化的一个逆过程. JAVA规定被序列化的对象必须实现java.io.S ...
 - Windows平台下的node.js安装
			
Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应 ...
 - 结构-行为-样式-angularJs笔记
			
0.关于Ng-app 通过ngApp指令来引导Angularjs应用是一种简洁的方式 ,适合大多数情况.在高级开发中,例如使用脚本装载应用,您也可以使用Bootstrap手动引导AngularJs ...
 - TypeScript开发ReactNative之fetch函数的提示问题
			
使用TypeScript开发ReactNative时,发现在类中调用 fetch 函数时IDE可能会提示找不到,无法加载,特别是当类中存在同名的 fetch 成员方法时更是郁闷了,虽然程序是可以执行的 ...
 - selenium自动化过程中遇到的小问题(未完待续)
			
1.chrome浏览器调用不起来 代码没出错的情况下,检查下chrome浏览器的版本与chromedriver.exe的版本是否匹配;下面的表格是根据网上及官网整理的chromedriver与chro ...
 - Head First设计模式——策略设计模式
			
策略设计模式 说在前面的话 入软件一年啦,平心而论,总算不限于只会钻研些基础的语言语法了,数据结构和算法也恶补的差不多了.所以~趁着现在一边实习一边啃<Head First设计模式>的功夫 ...
 - 觉得VR头显太笨重?轻便的VR“神器”来了
			
一直以来需要搭配手机才能使用的VRBOX(VR眼镜盒子)都被大家诟病携带不便.比较笨重.不透气等等问题.大家也一直期待能够有轻便的搭配手机的VR设备出现,最好是可以随身携带的.另外一方面,作为手机最常 ...
 - spring mvc @ResponseStatus 注解 注释返回中文乱码的问题
			
前言 前文中讲到,使用@ResponseStatus注解,可以修饰一个异常类,在发生异常的时候返回指定的错误码和消息,在返回的 reason中包含中文的时候,就会出现中文乱码的问题 现象 reason ...