news 2026/6/26 11:20:12

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
解析图漾相机录制的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路径

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 4:21:17

transformer架构优化案例:gpt-oss-20b的轻量化实践

Transformer架构优化案例&#xff1a;GPT-OSS-20B的轻量化实践 在消费级笔记本上运行一个参数量超过200亿的语言模型&#xff0c;听起来像是天方夜谭。然而&#xff0c;随着稀疏激活、结构化训练和高效推理技术的融合突破&#xff0c;这一设想正逐步成为现实。GPT-OSS-20B 就是…

作者头像 李华
网站建设 2026/6/23 23:59:04

Mem Reduct终极内存优化指南:从卡顿到极速的完美蜕变

Mem Reduct终极内存优化指南&#xff1a;从卡顿到极速的完美蜕变 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 还在…

作者头像 李华
网站建设 2026/6/24 22:21:26

DouYinBot:三步轻松实现抖音无水印视频下载与内容解析

DouYinBot&#xff1a;三步轻松实现抖音无水印视频下载与内容解析 【免费下载链接】DouYinBot 抖音无水印下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 你是否曾经想要保存抖音上的精彩视频&#xff0c;却被烦人的水印困扰&#xff1f;DouYinBot作为一款…

作者头像 李华
网站建设 2026/6/24 20:42:02

动态规划-背包问题

问题描述&#xff1a;0-1背包问题 输入&#xff1a; 一个背包&#xff0c;容量为 W。 n 个物品&#xff0c;每个物品有重量 w[i] 和价值 v[i]。 目标&#xff1a;在不超过背包容量的前提下&#xff0c;选择物品使得总价值最大。 限制&#xff1a;每个物品只能选 0 次&#xff0…

作者头像 李华
网站建设 2026/6/25 3:34:12

ZonyLrcToolsX 终极歌词下载工具:让每首歌都有完美歌词陪伴

ZonyLrcToolsX 终极歌词下载工具&#xff1a;让每首歌都有完美歌词陪伴 【免费下载链接】ZonyLrcToolsX ZonyLrcToolsX 是一个能够方便地下载歌词的小软件。 项目地址: https://gitcode.com/gh_mirrors/zo/ZonyLrcToolsX 还在为音乐播放器里缺少歌词而烦恼吗&#xff1f…

作者头像 李华
网站建设 2026/6/25 21:38:31

基于 Qt6 Multimedia 的实时音频 RTP 传输方案报告

基于 Qt6 Multimedia 的实时音频 RTP 传输方案报告 日期&#xff1a; 2025年12月15日 主题&#xff1a; 音频采集、编码、RTP打包发送及接收、解码、播放的实现 环境&#xff1a; Qt 6.x (C), Network Module, Multimedia Module1. 概述 本报告旨在阐述如何使用 Qt6 的多媒体和…

作者头像 李华