ONI文件生成与读取

之前一直不知道如何实时保存RGB-D数据,每次都写入PCD文件不现实,对于30fps的,每秒就有30个PCD文件,硬盘速度绝逼跟不上。保存color和depth视频吧,总觉得不方便,而且depth压缩与解压缩会有精度损失。

后来老外提醒我:

/OpenNI2/Source/Tools/NiViewer    press s to record oni file

感觉很方便,于是自己参考了《openni cookbook》,开始罗代码了。没有解释,有 问题自己看那本书吧。

生成含有RBG-D的ONI文件:

#include <OpenNI.h>
#include <stdio.h>
using namespace openni;
char ReadLastCharOfLine()
{
	int newChar = 0;
	int lastChar;

	fflush(stdout);

	do
	{
		lastChar = newChar;
		newChar = getchar();
	}while ((newChar != '\n')&& (newChar != EOF));

	return (char)lastChar;
}
bool HandleStatus(Status status)
{
	if (status == STATUS_OK)
		return true;
	printf("ERROR: #%d, %s", status,OpenNI::getExtendedError());
	ReadLastCharOfLine();
	return false;
}

int main()
{
	Status status = STATUS_OK;
	printf("Scanning machine for devices and loading " "modules/drivers ...\r\n");
    status = OpenNI::initialize();
    if (!HandleStatus(status))
		return 1;
    printf("Completed.\r\n");
	Device device;
	printf("Opening first device ...\r\n");

	status = device.open(ANY_DEVICE);
	if (!HandleStatus(status))
		return 1;
	printf("%s Opened, Completed.\r\n",
	device.getDeviceInfo().getName());
	printf("Checking if stream is supported ...\r\n");
	if (!device.hasSensor(SENSOR_DEPTH))
	{
		printf("Stream not supported by this device.\r\n");
		return 1;
	}
	printf("Asking device to create a depth stream ...\r\n");

	VideoStream depthSensor;
	VideoStream colorSensor;

	status = depthSensor.create(device, SENSOR_DEPTH);
	if (!HandleStatus(status))
		return 1;

	status = colorSensor.create(device, SENSOR_COLOR);
	if (!HandleStatus(status))
		return 1;
	printf("Starting stream ...\r\n");

	status = depthSensor.start();
	if (!HandleStatus(status))
		return 1;
	status = colorSensor.start();
	if (!HandleStatus(status))
		return 1;
	printf("Done.\r\n");
	printf("Creating a recorder ...\r\n");

	Recorder recorder;
	status = recorder.create("sample.oni");
	if (!HandleStatus(status))
		return 1;
	printf("Done.\r\n");
	printf("Attaching to depth sensor ...\r\n");
	status = recorder.attach(depthSensor);
	if (!HandleStatus(status))
		return 1;
        status = recorder.attach(colorSensor);
	if (!HandleStatus(status))
		return 1;
	printf("Done.\r\n");
	printf("Starting recorder ...\r\n");
	status = recorder.start();
	if (!HandleStatus(status))
		return 1;
	printf("Done. Now recording ...\r\n");

	ReadLastCharOfLine();
	recorder.destroy();
	depthSensor.destroy();
	colorSensor.destroy();
	device.close();
	OpenNI::shutdown();
	return 0;
}

读取上述ONI文件的RGB信息,并保存到PNG文件【代码是转载的,如果要读取深度信息,再加个 openni::SENSOR_DEPTH分支就行了】

#include <iostream>
#include <OpenNI.h>
#include <opencv2/photo.hpp>
#include <opencv2/highgui.hpp>  

using namespace std;  

int main()
{
    //定义oni文件中视频的总帧数以及得到的图片的保存目录
    int total = 0;
    char* imagefile = "/home/jst/Data";  

    //初始化OpenNI环境
    openni::OpenNI::initialize();  

    //声明设备并打开oni文件
    openni::Device fromonifile;
    fromonifile.open("sample.oni");  

    //声明控制对象,这对视频流的控制起到了关键作用
    openni::PlaybackControl* pController = fromonifile.getPlaybackControl();  

    //声明视频流对象以及帧对象
    openni::VideoStream streamColor;
    openni::VideoFrameRef frameColor;  

    //验证是否有彩色传感器(是否有彩色视频)和建立与设备想关联的视频流
    if(fromonifile.hasSensor(openni::SENSOR_COLOR))
    {
        if(streamColor.create( fromonifile, openni::SENSOR_COLOR ) == openni::STATUS_OK )
        {
            cout<<"建立视频流成功"<<endl;
        }
        else
        {
            cerr<<"ERROR: 建立视频流没有成功"<<endl;
            system("pause");
            return -1;
        }
    }
    else
    {
        cerr << "ERROR: 该设备没有彩色传感器" << endl;
        system("pause");
        return -1;
    }  

    //建立显示窗口
    cv::namedWindow("Image");  

    //获取总的视频帧数并将该设备的速度设为-1以便能留出足够的时间对每一帧进行处理、显示和保存
    total = pController->getNumberOfFrames(streamColor);
    pController->setSpeed(-1);  

    //开启视频流
    streamColor.start();
    for (int i = 1;i <= total; ++ i)
    {
        //读取视频流的当前帧
        streamColor.readFrame(&frameColor);  

        cout<<"当前正在读的帧数是:"<<frameColor.getFrameIndex()<<endl;
        cout<<"当前的循环次数是:  "<<i<<endl;  

        //将帧保存到Mat中并且将其转换到BGR模式,因为在OpenCV中图片的模式是BGR
        cv::Mat rgbImg(frameColor.getHeight(), frameColor.getWidth(), CV_8UC3, (void*)frameColor.getData());
        cv::Mat bgrImg;
        cvtColor(rgbImg, bgrImg, CV_RGB2BGR);  

        //将每一帧按顺序帧保存到图片目录下
        char imagefullname[255];
        char imagenum[50];
        sprintf(imagenum,"/%03d.png",i);
        strcpy(imagefullname,imagefile);
        strcat(imagefullname,imagenum);
        cv::imwrite(imagefullname,bgrImg);  

        //显示当前帧
        cv::imshow("Image",bgrImg);
        if (cv::waitKey(30) == 27)
        {
            break;
        }
    }  

    //销毁显示窗口
    cv::destroyWindow("Image");   

    //关闭视频流
    streamColor.destroy();  

    //关闭设备
    fromonifile.close();  

    //关闭OpenNI
    openni::OpenNI::shutdown();  

    return 0;
}
时间: 2024-10-21 20:15:14

ONI文件生成与读取的相关文章

ae-关于AE读取点流水文件生成shp点图层效率的问题,

问题描述 关于AE读取点流水文件生成shp点图层效率的问题, 由于我的kclswj.fmb中的点大概有12万条,这样循环执行起来特别慢,我初学AE开发,请问有没有高手可以给我指点一下,不胜感激.

Extjs读取xml文件生成动态表格和表单

最近开发项目,需要动态读取xml文件,生成Extjs界面,xml文件通过前台页面的按钮事件传进来,可以在网上查找[javascript 弹出子窗口]的相关文章</a> 获取弹出窗口url后的参数方法: // 获取url后的参数值 function getQueryStringValue(name) { var url = window.location.search; if (url.indexOf('?') < 0) { return null } var index = url.in

Extjs读取xml文件生成动态表格和表单(续)

很多人向我要[Extjs读取xml文件生成动态表格和表单]一文的源代码,故花了些时间将源代码整理出来,并重新编写此文,分享当时的技术思路. 需要的文件有: 1.html文件,此处以SASC.search.MtrUse.html为例 2.Extjs相关文件,见SASC.search.MtrUse.html文件中的引用 3.工具类,DomUtils.js 4.核心js类:SASC.extjs.search.MtrUse.js 5.java代码 详细html和js代码见相关文件,这里先描述思路. 首先

ajax读文件-ajax读取wav文件生成文件流上传到服务器

问题描述 ajax读取wav文件生成文件流上传到服务器 正在着手做一个类似于QQ的语音短信息发送的功能,但是使用html5开发 但是是录音文件,要就录音后发送,无法使用input file 考虑到直接传文件流,但是没用过 求用过的指导一下 解决方案 file控件需要人工选择文件,选择后可以通过file.files属性获取到2进制数据里,结合html5的formdata就可以用ajax上传了 参考:http://www.coding123.net/article/20121128/html5-aj

php生成与读取excel文件_php实例

在网站中经常会生成表格,CSV和Excel都是常用的报表格式,CSV相对来说比较简单,如果大家有疑问我会相继发布一些CSV的实例,这里主要介绍用PHP来生成和读取Excel文件. 要执行下面的函数,首先要引入一个类库:PHPExcel,PHPExcel是一个强大的PHP类库,用来读写不同的文件格式,比如说Excel 2007,PDF格式,HTML格式等等,这个类库是建立在Microsoft's OpenXML和PHP 的基础上的,对Excel提供的强大的支持,比如设置工作薄,字体样式,图片以及边

PHPExcel生成和读取Excel文件实例程序

在网站的管理后台经常会使用到报表的生成和读取,CSV和Excel都是常用的报表格式,CSV相对来说比较简单,如果大家有疑问我会相继发布一些CSV的实例,这里主要介绍用PHP 来生成和读取Excel文件. 要执行下面的函数,首先要引入一个类库:PHPExcel,PHPExcel是一个强大的PHP类库,用来读写不同的文件格式,比如说Excel 2007,PDF格式,HTML格式等等,这个类库是建立在Microsoft's OpenXML和PHP 的基础上的,对Excel提供的强大的支持,比如设置工作

PHP文件生成的图片无法使用CDN缓存的解决方法

  这篇文章主要介绍了PHP文件生成的图片无法使用CDN缓存的解决方法,这里的PHP生成图片是指src地址是一个PHP文件的图片,如果不做CDN,服务器的压力会非常大,本文就讲解了如何加进CDN的方法,需要的朋友可以参考下 今天发现线上有个问题,线上一个图片域名,在前端已经加了CDN缓存,不落缓存,则用PHP动态实现图片缩放,但经PHP处理过的图片输出后,每次都要从后端读取,后端服务器压力瞬间增加,经分析,PHP中没有作304的处理, HTTP的原理是这样的,每次请求到服务器后,服务端检测有没有

asp-ASP环境,又如何实现对WEB SERVER的生成与读取并且修改MSSQL的数据库

问题描述 ASP环境,又如何实现对WEB SERVER的生成与读取并且修改MSSQL的数据库 将通过VFP9的WEB服务生成的WSDL等三个文件,存取也没问题了,那在服务器上是ASP环境,又如何实现对WEB SERVER的生成与读取并且修改SQLSERVER2000的数据库,是不是只有这样才实现了客户端VFP程序与服务器上SQLSERVER2000数据以中间层的方式,完成对接! 解决方案 asp不适于写ws,直接asp程序发布到iis,asp更新数据库不就行了,干嘛用asp写ws. 解决方案二:

文件 提取 字-文件按字读取存储引发的一点问题

问题描述 文件按字读取存储引发的一点问题 问题比较复杂: 1.我需要将二进制文件提取出来,加密后存入另一文件 2.由于原始文件按字节(fgetc)提取加密后会变成很大的数(>255),因此不能用fputc来存加密后的数据,这就不可避免的用到putwc.但是putwc会使加密文件变大(由char变成了wchar),而我又想保持源文件大小. 3.我想到了按字提取fgetwc.按字存储fputwc,但是按字提取不能很好解决文件结尾的判定,如果源文件只有"abc"三个字符,那么按字提取只