当前位置: 首页 > news >正文

解析图漾相机录制的bag视频文件

文章目录

  • 前言
  • 1.PercipioViewer软件操作步骤
    • 1.1 加载录制的bag文件
    • 1.2 设置视频播放速度
  • 2.C++代码解析bag文件
    • 2.1 运行编译后的Demo
  • 3.常见问题FAQ
    • 3.1 编译过程中报错

前言

Percipio Viewer 软件支持录制相机采集图像时的视频。录制视频过程中,支持调整部分参数,不支持关闭/开启数据流。

前提条件:
根据录制内容,开启对应数据流。

1.PercipioViewer软件操作步骤

1.1 加载录制的bag文件

1.2 设置视频播放速度


主要有0.2X,0.5X,1X,1.5X和2X五种速度可以设置。

2.C++代码解析bag文件

具体解析bag文件的代码,可从如下链接下载:

git clone git@gitee.com:jet_zou/percipio_viewer_stream_decode.git

详细的代码如下:

/* * @Description: * @Author: zxy * @Date: 2023-09-08 09:07:05 * @LastEditors: zxy * @LastEditTime: 2024-04-16 18:27:04 */#include"utils.hpp"#definePERCIPIO_DPETH_RENDER_ENABLE#ifdefPERCIPIO_DPETH_RENDER_ENABLE#include"DepthRender.hpp"#endif#pragmapack(1)structStreamSize{int32_tm_width;int32_tm_height;};structStreamInfo{floatf_sacle_unit;StreamSize depthSize;StreamSize colorSize;StreamSize irLeftSize;StreamSize irRightSize;int32_tReserved[10];};structRecordInfo{uint32_trecord_info_version;TY_DEVICE_BASE_INFO dev_info;int32_tdepthStreaming;int32_tcolorStreaming;int32_tlIrStreaming;int32_trIrStreaming;int32_tallComps;//TY_CAMERA_CALIB_INFO depth_calib_info;TY_CAMERA_CALIB_INFO color_calib_info;chartycam_version[32];uint64_trecord_duration_start;uint64_trecord_duration_stop;};#pragmapack()#defineIMAGE_HEADER_SIZE(4096)staticintGetFileSize(constchar*file_name,uint64_t*file_byte_size){FILE*fp;if(!(fp=fopen(file_name,"rb"))){return(-1);}#ifdefined(_WIN32)||defined(_WIN64)#if_MSC_VER>=1400if(_fseeki64(fp,(uint64_t)(0),SEEK_END)){fclose(fp);return(-1);}*file_byte_size=_ftelli64(fp);#else#errorVisual Studio version is less than8.0(VS2005)!#endif#elseif(fseeko(fp,(uint64_t)(0),SEEK_END)){fclose(fp);return(-1);}*file_byte_size=ftello(fp);#endiffclose(fp);return0;}staticinlineintparseImage(constTY_IMAGE_DATA&image,cv::Mat*pDepth,cv::Mat*pLeftIR,cv::Mat*pRightIR,cv::Mat*pColor){if(pDepth&&image.componentID==TY_COMPONENT_DEPTH_CAM){if(image.pixelFormat==TY_PIXEL_FORMAT_XYZ48)*pDepth=cv::Mat(image.height,image.width,CV_16SC3,image.buffer).clone();else*pDepth=cv::Mat(image.height,image.width,CV_16U,image.buffer).clone();}elseif(pLeftIR&&image.componentID==TY_COMPONENT_IR_CAM_LEFT)parseIrFrame(&image,pLeftIR);elseif(pRightIR&&image.componentID==TY_COMPONENT_IR_CAM_RIGHT)parseIrFrame(&image,pRightIR);elseif(pColor&&image.componentID==TY_COMPONENT_RGB_CAM)parseColorFrame(&image,pColor);elsereturn-1;return0;}intmain(intargc,char*argv[]){if(argc!=2){printf("Need to specify a file!\n");return-1;}uint64_tfile_length;interror_code=GetFileSize(argv[1],&file_length);if(error_code<0){printf("Could not get file size!\n");return-1;}FILE*fp=fopen(argv[1],"rb");if(fp==NULL){printf("Failed to open file!\n");return-1;}std::vector<char>header_buffer(IMAGE_HEADER_SIZE);size_t cnt=fread(&header_buffer[0],1,IMAGE_HEADER_SIZE,fp);if(cnt<IMAGE_HEADER_SIZE){printf("File format error!\n");fclose(fp);return-1;}RecordInfo*pBagInfo=(RecordInfo*)&header_buffer[0];StreamInfo*pStreamInfo=(StreamInfo*)(&header_buffer[0]+sizeof(RecordInfo));printf("tycam version : %s\n",pBagInfo->tycam_version);printf("deice sn : %s\n",pBagInfo->dev_info.id);booldepthStreaming=pBagInfo->depthStreaming;boolcolorStreaming=pBagInfo->colorStreaming;boollIrStreaming=pBagInfo->lIrStreaming;boolrIrStreaming=pBagInfo->rIrStreaming;boolcomponent=pBagInfo->allComps;int32_tstream_cnt_per_frame=0;//stream_sizeif(depthStreaming)stream_cnt_per_frame++;if(colorStreaming)stream_cnt_per_frame++;if(lIrStreaming)stream_cnt_per_frame++;if(rIrStreaming)stream_cnt_per_frame++;uint64_trecord_duration=pBagInfo->record_duration_stop-pBagInfo->record_duration_start;std::vector<char>stream_header(sizeof(int32_t)*5);uint64_tstream_length=file_length-IMAGE_HEADER_SIZE;uint32_tframe_size=0;for(int32_ti=0;i<stream_cnt_per_frame;i++){cnt=fread(&stream_header[0],sizeof(int32_t)*5,1,fp);frame_size+=((int32_t*)(&stream_header[0]))[4];fseek(fp,((int32_t*)(&stream_header[0]))[4],SEEK_CUR);}uint32_tplayback_frame_rate,playback_total_frames;uint64_tplayback_duration=record_duration*1000*1000;if(record_duration>1000){playback_frame_rate=static_cast<uint32_t>((stream_length/(frame_size+sizeof(int32_t)*5*stream_cnt_per_frame))/(record_duration/1000));playback_total_frames=static_cast<uint32_t>(stream_length/(frame_size+sizeof(int32_t)*5*stream_cnt_per_frame));}else{playback_frame_rate=1;playback_total_frames=1;}fseek(fp,IMAGE_HEADER_SIZE,SEEK_SET);#ifdefPERCIPIO_DPETH_RENDER_ENABLEDepthRender depthViewer;#endifuint64_tstart_time=0;uint64_tend_time=0;TY_IMAGE_DATA image;std::vector<char>framebuffer[4];while(true){start_time=getSystemTime();if(feof(fp)){printf("Repeat!\n");fseek(fp,IMAGE_HEADER_SIZE,SEEK_SET);}fread(&stream_header[0],sizeof(int32_t)*5,1,fp);image.componentID=((int32_t*)(&stream_header[0]))[0];image.width=((int32_t*)(&stream_header[0]))[1];image.height=((int32_t*)(&stream_header[0]))[2];image.pixelFormat=((int32_t*)(&stream_header[0]))[3];image.size=((int32_t*)(&stream_header[0]))[4];if(image.componentID==TY_COMPONENT_DEPTH_CAM){if(framebuffer[0].size()<image.size)framebuffer[0].resize(image.size);fread(&framebuffer[0][0],image.size,1,fp);image.buffer=&framebuffer[0][0];}elseif(image.componentID==TY_COMPONENT_RGB_CAM){if(framebuffer[1].size()<image.size)framebuffer[1].resize(image.size);fread(&framebuffer[1][0],image.size,1,fp);image.buffer=&framebuffer[1][0];}elseif(image.componentID==TY_COMPONENT_IR_CAM_LEFT){if(framebuffer[2].size()<image.size)framebuffer[2].resize(image.size);fread(&framebuffer[2][0],image.size,1,fp);image.buffer=&framebuffer[2][0];}elseif(image.componentID==TY_COMPONENT_IR_CAM_RIGHT){if(framebuffer[3].size()<image.size)framebuffer[3].resize(image.size);fread(&framebuffer[3][0],image.size,1,fp);image.buffer=&framebuffer[3][0];}else{printf("Invalid component id!\n");exit(-1);}cv::Mat depth,leftIR,rightIR,color;parseImage(image,&depth,&leftIR,&rightIR,&color);if(!depth.empty()){#ifdefPERCIPIO_DPETH_RENDER_ENABLEcv::Mat dep_render=depthViewer.Compute(depth);if(!dep_render.empty())cv::imshow("depth",dep_render);#elsecv::imshow("depth",depth*15);#endif}if(!leftIR.empty())cv::imshow("leftIR",leftIR);if(!rightIR.empty())cv::imshow("rightIR",rightIR);if(!color.empty())cv::imshow("color",color);intkey=cv::waitKey(1);if((key&0xff)=='q')break;end_time=getSystemTime();floatdelt=((playback_duration/(uint64_t)playback_total_frames)/(1000*1000)-(end_time-start_time))/(stream_cnt_per_frame);if(delt>0)MSleep(static_cast<uint32_t>(delt));}fclose(fp);printf("Main done!\n");return0;}

2.1 运行编译后的Demo

使用Cmake-gui界面,编译完成后,使用VisualStudio软件生成解决方案后,生成对应的.exe文件,之后使用如下命令,即可解析.bag文件。

.\ decode test.exe.\bag名字

3.常见问题FAQ

3.1 编译过程中报错

在使用Cmake进行编译时,需要引入Opencv路径

http://www.cnnetsun.cn/news/71589.html

相关文章:

  • Monorepo架构下管理多个FLUX.1-dev模型实例的最佳实践
  • 收藏!大模型时代,产品经理如何突破成长天花板?
  • 在Windows环境下部署Seed-Coder-8B-Base的详细步骤
  • C语言中的面向对象思想
  • 微信视频号直播弹幕抓取技术实现与架构解析
  • 火山引擎AI大模型平台迁移至Qwen3-VL-30B的成本效益分析
  • Linux挂载核心:一文搞懂fstab的作用与配置实战
  • Beyond Compare软件功能扩展技术配置指南
  • Miniconda如何帮助你节省大模型训练前的环境准备时间?
  • docker run启动Qwen3-32B容器的常用参数详解
  • 实习面试题-JavaScript 面试题
  • 解决‘此扩展程序不再受支持’问题:FLUX.1-dev开发环境兼容性优化方案
  • 火山引擎AI大模型生态中FLUX.1-dev的独特定位分析
  • 抖音直播回放永久保存指南:告别内容丢失的烦恼
  • Bypass Paywalls Clean完整使用教程:快速解锁全网付费内容
  • 国产CAD实现铸造与热处理工艺的标准化控制
  • 微PE官网同款推荐!HunyuanVideo-Foley模型运行环境快速搭建工具包
  • LeetCode Hot 100 - 盛水最多的容器解题思路详解
  • Windows驱动管理革命:Driver Store Explorer全面实战指南
  • Get-cookies.txt-LOCALLY:本地Cookie导出终极指南,隐私安全无忧
  • 云原生API网关认证终极指南:5步搞定Hydra+APISIX高可用集成
  • 文件哈希值批量修改新方案:告别传统计算的效率革命
  • Beyond Compare 5完整使用指南:三步实现免费授权
  • ComfyUI-Manager终极指南:一键配置AI绘画管理平台
  • 如何快速获取网盘文件真实下载地址?2025年最实用的网盘直链工具推荐
  • Redis过期键管理终极技巧:AnotherRedisDesktopManager可视化监控实战
  • 知识星球内容数字化归档:从信息流到结构化知识库的技术实践
  • NatTypeTester终极指南:3分钟快速诊断网络NAT类型,彻底解决游戏卡顿和视频会议延迟问题
  • Tsuru容器平台架构深度解析:企业级PaaS部署实战指南
  • GHelper终极指南:7步解锁华硕ROG笔记本隐藏性能