深度图压缩之-高低8位拆分保存

 使用kinect相机保存数据,为了减少保存的数据集量,对图像进行压缩。将彩色图像直接压缩成.mp4格式,此时图像上的一些高频信息会被损失掉。

为了能够让深度图有比较高的保真度,减少深度图上高频信息的损失,我们将16位的深度图,分成高8位和第8位,将低8位保存成mp4视频的形式

将高8位直接保存成单通道的深度图。

下面的函数实现了将一幅CV_16UC1类型的深度图拆分成高8位和低8位,并且将低8位的数据写入三通道的图像中,便于压缩为mp4格式。

int depth2HighLow(cv::Mat Full_Depth, cv::Mat &High_Depth, cv::Mat &Low_Depth)
{if (Full_Depth.type() != CV_16UC1){std::cout << "the input depth must be CV_16UC1" << std::endl;return false;}uint16_t* Pdepth = Full_Depth.ptr<uint16_t>(0);uchar* Phigh = High_Depth.data;uchar* Plow = Low_Depth.data;for (int i = 0; i < Full_Depth.cols*Full_Depth.rows; i++){*Phigh = (*Pdepth) >> 8;Phigh++;*Plow = (*Pdepth) & 0xff;Plow++;*Plow = (*Pdepth) & 0xff;Plow++;*Plow = (*Pdepth) & 0xff;Plow++;Pdepth++;}return true;
}

我们在使用深度图时,需要将高8位和第8位再组合到一起。

void Gray2uint16(cv::Mat High,cv::Mat low,cv::Mat &Depth)
{uint16_t *Pdepth=Depth.ptr<uint16_t>(0);uchar *Phigh=High.data;uchar *Plow=low.data;for (size_t i = 0; i < High.cols*High.rows; i++){*Pdepth=uint16_t((uint16_t(*Phigh)<<8)+(*Plow));Pdepth++;Phigh++;Plow++;}}

 下面是关于读取视频的相关代码

int main ( int argc, char** argv )
{std::string dataset_folder = std::string(argv[3]);std::string depth_color_video = dataset_folder + "/" + "color_depth.mp4";std::string high_depth_images = dataset_folder + "/" + "color_depth/";cv::VideoCapture cap(depth_color_video);if(!cap.isOpened()){std::cout<<"opencv mp4 file failed"<<std::endl;return false;}bool have_data = true;int framenum = 0;while(have_data){cv::Mat ImgRead;cap>>ImgRead;if(ImgRead.empty()){std::cout<<"read finished"<<std::endl;have_data = false;continue;}cv::Mat Color_img, Low_depth;cv::Rect rgb_rect(0, 0, ImgRead.cols/2, ImgRead.rows);cv::Rect low_depth_rect(ImgRead.cols/2, 0, ImgRead.cols/2, ImgRead.rows);ImgRead(rgb_rect).copyTo(Color_img);ImgRead(low_depth_rect).copyTo(Low_depth);// cv::imshow("Color_img", Color_img);// cv::imshow("low_depth", Low_depth);// cv::waitKey(2);//read the high depth imagesstd::string HighPath = high_depth_images + "/" + std::to_string(framenum) + ".png";cv::Mat High_depth = cv::imread(HighPath, cv::IMREAD_UNCHANGED);std::cout<<"frame name: "<<HighPath<<std::endl;// cv::imshow("high_depth", High_depth);// cv::waitKey(2);cv::Mat Low_gray;//the type of Low_depth is 8UC3, we change it into 8UC1cv::cvtColor(Low_depth, Low_gray, cv::COLOR_BGR2GRAY);cv::Mat full_depth_gray(Low_gray.size(), CV_16UC1);Gray2uint16(High_depth, Low_gray, full_depth_gray);// cv::imshow("full_depth", full_depth_gray);// cv::waitKey(2);framenum++;}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 一个超简单的makefile

2019独角兽企业重金招聘Python工程师标准>>> makefile 自动化变量&#xff1a; $ : 规则的目标文件名 例如&#xff1a;main:main.o test.o g -Wall -g main.o test.o -o main 可以写成&#xff1a; main:main.o test.o g -Wall -g main.o test.o -o $ $< : …

poj2480(利用欧拉函数的积性求解)

题目链接: http://poj.org/problem?id2480 题意&#xff1a;∑gcd(i, N) 1<i <N&#xff0c;就这个公式&#xff0c;给你一个n&#xff0c;让你求sumgcd(1,n)gcd(2,n)gcd(3,n)…………gcd(n-1,n)gcd(n,n),&#xff08;1<n<2^31&#xff09;是多少&#xff1f; 放…

跨域问题

一、为什么会有跨域问题&#xff1f; 是因为浏览器的同源策略是对ajax请求进行阻拦了&#xff0c;但是不是所有的请求都给做跨域&#xff0c;像是一般的href属性&#xff0c;a标签什么的都不拦截。 二、解决跨域问题的两种方式 JSONPCORS 三、JSONP 先简单来说一下JSONP&#x…

PAT A1052

这个需要注意的是相关的string转整数或者double的函数&#xff1b;详见这个链接blog #include <iostream> #include <string> using namespace std; bool isPrime(int n) {if (n 0 || n 1) return false;for (int i 2; i * i < n; i)if (n % i 0) return fa…

php审计学习:xdcms2.0.8注入

注入点Fields: 注册页面会引用如下方法: $fields 变量是从 $fields$_POST[fields]; 这里获取&#xff0c; 在代码里没有过滤。 打印 fields 数据查看: 从代码上看 $field_sql.",{$k}{$f_value}"; 最终会变成: ,truename111111,email12345 因为 $field_sql 最终会引入…

windows下安装python和Python-opencv

背景&#xff1a;目前基于python的图像处理和机器视觉的研究还挺多&#xff0c;最近不是在研究目标检测和目标跟踪的算法&#xff0c;由于检测和跟踪的环境比较简单所以从不带学习的跟踪方法&#xff0c;在搜索资料时搜到这个网站&#xff0c;是对opencv中的目标跟踪算法的一个…

捋一捋js面向对象的继承问题

说到面向对象这个破玩意&#xff0c;曾经一度我都处于很懵逼的状态&#xff0c;那么面向对象究竟是什么呢&#xff1f;其实说白了&#xff0c;所谓面向对象&#xff0c;就是基于类这个概念&#xff0c;来实现封装、继承和多态的一种编程思想罢了。今天我们就来说一下这其中继承…

java8简单入门

1、介绍 本片文章会从一下几个知识点进行介绍&#xff1a; 函数式接口 FunctionalInterfaceLambda 表达式函数引用 Function ReferenceStream看了几篇关于 java8 入门的例子&#xff0c;其中引入了许多令人期待已久的特性&#xff08;虽然我没有过这样的体会&#xff09;&#…

玩转带外触发的单目相机之一

背景&#xff1a;去年开始研究vins,但是只是用了普通的相机&#xff0c;然后将IMU和相机粘在一起&#xff0c;然后就是联合标定相机和IMU。VINS使用的相机是带有外触发的&#xff0c;还进行了相机和IMU的硬件时间同步。当时我特别想买个带外触发的相机&#xff0c;一直没找到资…

基于django的视频点播网站开发-step11-后台用户管理功能...

用户管理功能&#xff0c;包含用户添加、列表展示、编辑、删除四大功能。下面我们一一揭晓。 用户添加 我们先实现用户添加功能&#xff0c;我们现在urls.py下添加相关的路由 path(user_add/, views.UserAddView.as_view(), nameuser_add), path(user_list/, views.UserListVie…

BZOJ 1070 拆点 费用流

1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5860 Solved: 2487[Submit][Status][Discuss]Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员&#xff0c;不同的技术人员对不同 的车进行维修所用的时间是不…

分布式之数据库和缓存双写一致性方案解析

先做一个说明&#xff0c;从理论上来说&#xff0c;给缓存设置过期时间&#xff0c;是保证最终一致性的解决方案。这种方案下&#xff0c;我们可以对存入缓存的数据设置过期时间&#xff0c;所有的写操作以数据库为准&#xff0c;对缓存操作只是尽最大努力即可。也就是说如果数…

使用python从csv文件中读入两列拟合直线

背景&#xff1a;要判断跟踪算法在控制目标物走直线的情况下跟踪的轨迹是否为直线&#xff0c;我保存下来跟踪算法跟踪到的目标的中心点在图像上的像素位置&#xff0c;然后拟合出穿过这些点的直线&#xff0c;然后计算这些点距离直线的平均距离来判断跟踪的精度。&#xff08;…

window document

1 打开一个新窗口 var newDocwindow.open("text/html","replace");var txt"<html><body>Learning about the DOM is FUN!</body></html>";newDoc.document.write(txt);newDoc.close(); //该方法将关闭 open() 方法打开…

‘(‘:illegal token on right side of ‘::‘

背景&#xff1a;想整理升级一下代码&#xff0c;添加了两个类&#xff0c;再一编译代码&#xff0c;出现了好多这样的错误提示“(:illegal token on right side of ::”&#xff0c;我很纳闷这是啥问题&#xff0c;我就使用“注释法”来定位出错的位置&#xff0c;我发现把所有…

mysql-数据库操作

doc界面操作mysql:<br/> 以phpstudy为例 登录数据库&#xff1a;进入phpstudy/mysql/bin下&#xff0c;mysql -u用户名 -p密码 选择数据库&#xff1a;use 数据库名; 设置编码格式&#xff1a;set names gbk; 查看表结构或字段信息&#xff1a;desc 表名; 建立数据库&…

虹软免费人脸识别SDK注册指南

2019独角兽企业重金招聘Python工程师标准>>> 成为开发者三步完成账号的基本注册与认证&#xff1a; STEP1:点击注册虹软AI开放平台右上角注册选项&#xff0c;完成注册流程。 STEP2:首次使用&#xff0c;登录后进入开发者中心&#xff0c;点击账号管理完成企业或者个…

Mybatis使用statementType=STATEMENT实现动态传入表名或字段名

mybatis中使用statementType"STATEMENT"实现动态传入字段名时一直报语句错误&#xff0c;但实际上语句并没有毛病&#xff0c;爬了一天坑才找到问题&#xff0c;记录一下。 整条语句中里所有传入的值都要使用${xxx},不能使用#{xxx}。 <select id"listMap&quo…

C++中的类加多线程代码修炼

背景&#xff1a;现在在做一个目标跟踪的项目&#xff0c;需要实时的从工业相机中获取图像&#xff0c;然后再跟踪图像上的目标物&#xff0c;由于起初为了测试跟踪算法&#xff0c;就把“从相机获取图像”和“跟踪处理”都放在了主线程中&#xff0c;在实际测试时&#xff0c;…

Activity Monitor 闪退 无法进入睡眠

Activity Monitor 闪退 & 无法进入睡眠 情况描述 黑苹果主机突然无法进入睡眠。 考虑到可能是后台程序阻碍了系统正常进入睡眠&#xff0c; 于是想要通过Activity Monitor查看系统的活动情况&#xff0c;然而&#xff0c;Activity Monitor闪退。 重新开机&#xff0c;快速…