OpenNI2关于不能显示depth image问题
来源:互联网 发布:易语言微信机器人源码 编辑:程序博客网 时间:2024/05/23 13:45
我们都知道OpenNI2与OpenCV可以通过Kinect获取深度与彩色图像。
但区别是OpenCV更强大满足需求更多,但是只能一帧一帧的保存。
而OpenNI2有一个videostream对象可以以视频类型保存数据。
因为我需要以视频类型保存数据,所以我选择OpenNI2来获取深度和彩色图像。
问题:
根据小斤(Kinect开发教程八:OpenNI2显示深度、彩色及融合图像)教程的代码:
<span style="font-family:Microsoft YaHei;">/*************************OpenNI2 Deep, Color and Fusion ImageAuthor: Xin Chen, 2013.2Blog: http://blog.csdn.net/chenxin_130*************************/#include <stdlib.h>#include <iostream>#include <string>#include "OpenNI.h"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"using namespace std;using namespace cv;using namespace openni;void CheckOpenNIError( Status result, string status ){ if( result != STATUS_OK ) cerr << status << " Error: " << OpenNI::getExtendedError() << endl;}int main( int argc, char** argv ){Status result = STATUS_OK; //OpenNI2 imageVideoFrameRef oniDepthImg; VideoFrameRef oniColorImg;//OpenCV imagecv::Mat cvDepthImg;cv::Mat cvBGRImg;cv::Mat cvFusionImg;cv::namedWindow("depth");cv::namedWindow("image");cv::namedWindow("fusion");char key=0;//【1】// initialize OpenNI2 result = OpenNI::initialize();CheckOpenNIError( result, "initialize context" ); // open device Device device; result = device.open( openni::ANY_DEVICE );//【2】// create depth stream VideoStream oniDepthStream; result = oniDepthStream.create( device, openni::SENSOR_DEPTH );//【3】// set depth video mode VideoMode modeDepth; modeDepth.setResolution( 640, 480 ); modeDepth.setFps( 30 ); modeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM ); oniDepthStream.setVideoMode(modeDepth);// start depth stream result = oniDepthStream.start(); // create color stream VideoStream oniColorStream; result = oniColorStream.create( device, openni::SENSOR_COLOR );// set color video modeVideoMode modeColor; modeColor.setResolution( 640, 480 ); modeColor.setFps( 30 ); modeColor.setPixelFormat( PIXEL_FORMAT_RGB888 ); oniColorStream.setVideoMode( modeColor);//【4】// set depth and color imge registration modeif( device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR ) ){device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );}// start color stream result = oniColorStream.start(); while( key!=27 ) { // read frameif( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK ){// convert data into OpenCV typecv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() );cv::cvtColor( cvRGBImg, cvBGRImg, CV_RGB2BGR );cv::imshow( "image", cvBGRImg );} if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK ){cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() );cvRawImg16U.convertTo( cvDepthImg, CV_8U, 255.0/(oniDepthStream.getMaxPixelValue()));//【5】// convert depth image GRAY to BGRcv::cvtColor(cvDepthImg,cvFusionImg,CV_GRAY2BGR);cv::imshow( "depth", cvDepthImg );}//【6】cv::addWeighted(cvBGRImg,0.5,cvFusionImg,0.5,0,cvFusionImg);cv::imshow( "fusion", cvFusionImg );key = cv::waitKey(20);}//cv destroycv::destroyWindow("depth");cv::destroyWindow("image");cv::destroyWindow("fusion"); //OpenNI2 destroy oniDepthStream.destroy(); oniColorStream.destroy(); device.close(); OpenNI::shutdown();return 0;}</span>运行结果:
可以看到程序没有报错,但是却没有depth image。
解决办法:
在查阅了很多资料后,在stack overflow上我看到了一个问题:Change resolution on openni2 not working
运行了代码之后:(OniSampleUtilities.h就在OpenNI2安装目录下,例如我的路径是:F:\Program Files (x86)\OpenNI2\Samples\SimpleViewer
)
看到他的问题是:
我猜想是不是只运行512*424以内的格式,所以640*480便不可执行,于是我把小斤的代码中640*480全部改为320*240,运行:
显示depth图像成功!
具体的原因我也并不是很清楚,也许是OpenNI2的一个BUG吧~科科~
0 0
- OpenNI2关于不能显示depth image问题
- Kinect2的安装以及关于OpenNI2遇到的问题(OpenNI2显示no devices found)
- 关于手机不能显示全部Logcat问题
- 关于PopuWindow不能显示的问题
- 关于facebook分享不能显示图片链接问题
- 关于小程序image图片不显示的问题
- Web image标签 有些JPG格式照片不能显示问题 解释及解决
- UIBUtton title image 不能同时显示
- 关于DataGrid自动分页的不能显示的问题
- 关于"显示所有文件和文件夹"不能修改的问题
- 关于JTable不能显示表头的问题(个人小结)
- 关于linux中面板不能完整显示的问题
- 关于透明桌面相框图片不能显示的问题
- 关于引用母板页图片不能显示的问题
- 关于ItemizedOverlay不能显示地标图片的问题
- 关于<input type="text">不能显示空格的问题
- 关于windbg不能正确显示KeServiceDescriptorTableShadow的问题
- 关于自定义TitleBar不能完全显示的问题
- Drawable系列(一)——BitmapDrawable的属性和使用介绍
- 大型程序的结构(二)【配置选项config.py】
- EditPlus更改背景颜色
- Java中的Random()函数
- 最大公约数和最小公倍数
- OpenNI2关于不能显示depth image问题
- Qt加载QSS文件
- QML简单动画Behavior代替复杂代码
- 解决/usr/bin/ld: cannot find -lxxx
- java五子棋(命令行)
- Codevs1322 单词矩阵
- 做一个虚表与myBatis连用的例子
- andorid studio之GsonFormat插件的使用
- Android 七种进度条的样式