前几天做人体行为识别的师姐在网上下载了一个以.oni格式保存的数据集,师姐让我帮忙将.oni格式的数据读出并保存为图片序列,以便能用OpenCV/matlab进行处理弄了两三天,终于能完整的将oni文件中的视频数据一帧不少的读出来了,现在将我的方法分享一下。

之前没有接触过OpenNI,这次用到OpenNI是从零开始学的,到今天我也只学了不到4天,有错误的地方还请指教。

首先说一下我对OpenNI2的认识,开始也用过OpenNI1.5但是发现太难,结构不如OpenNI2这种C++风格的清晰,因此,在最初接触了OpenNI几个小时后我就果断的选择了使用OpenNI2,而且OpenNI2的配置也相对比较简单,我用的版本是OpenNI-Windows-x86-2.2,系统是Win7+VS2010。(我的配置是按照这个方法进行的)

由于我仅仅用OpenNI2读取oni格式的数据并保存,下面就只谈与之相关的。(其他的我也不懂)

目前能查到的将oni格式文件中的视频流中每一帧视频都读出来的方法有两种:

一、设置循环。首先读取视频流中的总帧数,然后用这个总帧数设置循环次数每一次读取一帧并保存。

二、设置事件。为视频流添加一个事件,每当视频流更新则读取当前帧并保存。

这两种方法我都用过但是都会出现同样的问题,那就是丢帧,即不能按顺序的一帧不落的将所有帧都读出,究其原因可能是我的电脑太慢了,在视频流下一帧更新之前不能将当前帧读取并保存。

几经挣扎我终于找到的能一帧不落的读完所有帧,那就是要在设置循环的方法中设置视频流的速度,将视频流的速度设置为-1,即只有程序在进行读取视频流的时候视频流才更新,其他时间视频流是不动作的。

另外,程序中的图片显示以及保存都是用的OpenCV,关于OpenCV,网上的资料很多我就不做过多的介绍了,如果有需要还可以用OpenCV将oni文件保存为.avi的视频。

下面在程序以及注释中进行详细的解释

#include <iostream>
#include <OpenNI.h>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>using namespace std;int main()
{//定义oni文件中视频的总帧数以及得到的图片的保存目录int total = 0;char* imagefile = "D:\\data\\data1";//初始化OpenNI环境openni::OpenNI::initialize();//声明设备并打开oni文件openni::Device fromonifile;fromonifile.open("D:\\USER28_CAL11\\qw\\S13_C11_U26_D3.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中图片的模式是BGRcv::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();//关闭OpenNIopenni::OpenNI::shutdown();return 0;
}

程序运行的截图(数据集是从网上下载的,不要在意视频上那个人,我也不认识)

如果想要读深度数据那么将30和32行的SENSOR_COLOR改成SENSOR_DEPTH

当然由于在OpenNI中的深度数据到OpenCV中要用CV_16UC1来保存并且要想较好的显示还需要下面的转换

const cv::Mat mImageDepth( frame.getHeight(), frame.getWidth(), CV_16UC1, (void*)frame.getData());           int iMaxDepth = stream.getMaxPixelValue();cv::Mat mScaledDepth;mImageDepth.convertTo( mScaledDepth, CV_8U, 255.0 / iMaxDepth );

以上,就是我的一些经验,不免有疏漏,请多多包含。

参考:

http://www.cnblogs.com/yemeishu/archive/2013/01/11/2856859.html

http://blog.csdn.net/chenxin_130/article/details/8580636

http://www.dotblogs.com.tw/v6610688/archive/2014/03/02/openni_oni_format_file_to_avi_opencv.aspx#feedback

使用OpenNI2读取oni格式的文件,并将其中的彩色视频,深度视频显示并保存相关推荐

  1. ajax读取文件数据,Ajax 实现读取 properties 格式资源文件数据

    Ajax 的核心是 JavaScript 对象 XmlHttpRequest.该对象在 Internet Explorer 5 中首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpRequ ...

  2. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...

    原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...

  3. python读取.pkl格式的文件

    运行代码工具jupyter notebook 读取文件放在运行目录下 #读取.pkl格式的文件 #读取.pkl格式的文件 import pickle path='test_keys.pkl' f=op ...

  4. 怎么样用Python 读取oni 格式文件?

    怎么样用Python 读取oni 文件? 什么是oni 文件? Python读取方法 python 代码示例 什么是oni 文件? oni 文件是openni 的存储文件. Python读取方法 先安 ...

  5. Android 读取csv格式数据文件

    前言 什么是csv文件呢?百度百科上说 CSV是逗号分隔值文件格式,也有说是电子表格的,既然是电子表格,那么就可以用Excel打开,那为什么要在Android中来读取这个.csv格式的文件呢?因为现在 ...

  6. dcm格式的文件里有什么,哪些对于深度学习模型训练有用

    DCM格式的文件通常包含医学图像,如X射线.CT或MRI扫描.这些图像可以用来辅助医生诊断疾病,并且对于深度学习模型训练也非常有用.在医学图像分析方面,深度学习模型可以用来做图像分割.疾病诊断.肿瘤检 ...

  7. Pandas直接读取arff格式的文件,这种需求还是头一次碰到!

    作者/小小明 来源/快学Python 常规arff文件读取 之前有位群友遇到了arff格式的数据,却不知道怎么读取: 然后我让这位群友把文件发我,给我分析一下,我用文件编辑器打开后,发现格式如下: 只 ...

  8. 编码引出的问题_FileReader读取GBK格式的文件

    编码引出的问题 在IDEA中,使用FileReader 读取项目中的文本文件.由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题.但是,当读取Windows系统中创建的文本文件时,由于Wi ...

  9. r导入excel数据 linux,R语言中使用rio读取xlsx格式Excel文件|多个sheet表格|tidyverse rbind XLConnect readxl...

    前言 有时候数据格式是xlsx的,内部含有多个sheet表格,如果直接转换成csv的话非常费时.如果想批量处理文件(或者装个逼),这样就需要用到R了. 多种方案 使用rio包一次性读取到data li ...

最新文章

  1. zabbix 2.0.6监控cisco交换机 2950 2960s 3560G
  2. 登录页面test记录
  3. xslt 标签取集合第一条数据_1+x证书Web前端开发中级理论考试(试卷1)
  4. python通信编程_python 通信编程
  5. WinCE6.0 R3 安装记
  6. differential forms
  7. oracle工程师考试题,信息安全工程师考试练习试题及答案(三)
  8. Visual Studio 2013中因Browser Link引起的Javascript错误
  9. python使用临时文件
  10. 机器学习视频推荐-绝对的通俗易懂(线性回归,逻辑回归,朴素贝叶斯分类器,K-近邻,SVM,决策树,随机森林,XGboost,k-means聚类)
  11. 如何在30天内拿下软考初级程序员?
  12. 文件下载测试的测试点
  13. 【数字IC验证快速入门】4、熟悉数字IC验证中常用的Linux基本操作
  14. linux的grub是什么意思,grub是什么意思
  15. beta函数与置信度估计
  16. matlab中的颜色设置颜色,matlabpcolor设置颜色
  17. 2022年R2移动式压力容器充装考试模拟100题及在线模拟考试
  18. EWS Java API 的基本使用
  19. 人民币升值破七 香港物价上涨发工资改用人民币
  20. c# U盘禁用---守护进程(插入,拔出,卸载等操作)

热门文章

  1. 量化交易软件有哪些重要对象?
  2. 为什么那些月薪过万的外卖骑手都慢慢离职了
  3. mat opencv 修改roi_OpenCV Android:在新Mat中定义并保存ROI(OpenCV Android: Define and save ROI in new Mat)...
  4. 基于OpenCV的彩色图像色彩增强代码(C++代码)
  5. UART(一)——起始位,停止位,奇偶校验位,数据位等概念
  6. Elmo canopen 之 控制字 0x6040
  7. 青岛市初中计算机考试成绩查询,2021年青岛市初中学业水平考试成绩查询入口http://edu.qingdao....
  8. 解决:FTP协议路径在资源管理器打开,总是默认跳转到某个浏览器打开
  9. MulVal工具的安装以及配置
  10. 广东联通UNT400G_S905L3_XR819双内存_当贝桌面-线刷固件包