OpenCV中将Mat RGBA4通道转换成RGB3通道
在OpenCV中,有一种数据结构是Mat,我们一般会定义一个frame的变量,这个变量可以是4通道的,也可以说3通道的。
前不久在一个项目中遇到了这个问题,要求是用ZED相机来实时拍摄视频并实时显示。ZED相机中的Mat是4通道的,虽然也可以调用3通道的模式,但是调用3通道的模式有问题。如果将ZED中sl转化成OpenCV格式后的image_ocv直接转换成3通道模式的话,会导致预览窗口只有一帧画面卡死,不会连续采集图像。所以将ZED相机中的sl::Mat结构(image_zed)先变成OpenCV的Mat结构(image_ocv),然后赋值给OpenCV中的Mat(frame),然后再将frame转换成3通道的,就就可以实现实时采集视频了。
代码如图:
下图是OpenCV中的Mat,命名frame
下图是将ZED相机中sl的Mat,命名image_zed,然后转化成OpenCV格式的Mat:image_ocv
先将image_ocv转换成frame,然后将frame变成3通道。这样不会出问题,如果将image_ocv先转换成三通道,而后赋值给frame,会只显示一帧画面。
frame = image_ocv;//四通道->三通道cvtColor(frame, frame, COLOR_RGBA2RGB);
下面是部分代码:
// To share data between sl::Mat and cv::Mat, use slMat2cvMat()
// Only the headers and pointer to the sl::Mat are copied, not the data itselfsl::Mat image_zed(new_width, new_height, sl::MAT_TYPE::U8_C4);cv::Mat image_ocv = slMat2cvMat(image_zed);#ifndef HAVE_CUDA // If no cuda, use CPU memorysl::Mat depth_image_zed(new_width, new_height, sl::MAT_TYPE::U8_C4);cv::Mat depth_image_ocv = slMat2cvMat(depth_image_zed);
#elseMat depth_image_zed_gpu(new_width, new_height, MAT_TYPE::U8_C4, sl::MEM::GPU); // alloc sl::Mat to store GPU depth imagecv::cuda::GpuMat depth_image_ocv_gpu = slMat2cvMatGPU(depth_image_zed_gpu); // create an opencv GPU reference of the sl::Matcv::Mat depth_image_ocv; // cpu opencv mat for display purposes
#endifchar key = ' ';while (1) {// A new image is available if grab() returns SUCCESSif (zed.grab(runtime_parameters) == sl::ERROR_CODE::SUCCESS) {// Retrieve left imagezed.retrieveImage(image, sl::VIEW::LEFT);// Retrieve depth map. Depth is aligned on the left imagezed.retrieveMeasure(depth, sl::MEASURE::DEPTH);// Retrieve colored point cloud. Point cloud is aligned on the left image.zed.retrieveMeasure(point_cloud, sl::MEASURE::XYZRGBA);// Retrieve the left image, depth image in half-resolutionzed.retrieveImage(image_zed, sl::VIEW::LEFT, sl::MEM::CPU, new_image_size);
#ifndef HAVE_CUDA // retrieve CPU -> the ocv reference is therefore updatedzed.retrieveImage(depth_image_zed, sl::VIEW::DEPTH, sl::MEM::CPU, new_image_size);
#else// retrieve GPU -> the ocv reference is therefore updatedzed.retrieveImage(depth_image_zed_gpu, VIEW::DEPTH, MEM::GPU, new_image_size);
#endif// Retrieve the RGBA point cloud in half-resolution// To learn how to manipulate and display point clouds, see Depth Sensing samplezed.retrieveMeasure(point_cloud, sl::MEASURE::XYZRGBA, sl::MEM::CPU, new_image_size);//显示相机信息if (display_map){cv::imshow("Image", image_ocv);//cv::waitKey(30);}#ifdef HAVE_CUDA// download the Ocv GPU data from Device to Host to be displayeddepth_image_ocv_gpu.download(depth_image_ocv);
#endifif (display_depth){cv::imshow("Depth", depth_image_ocv);//cv::waitKey(30);}frame = image_ocv;//四通道->三通道cvtColor(frame, frame, COLOR_RGBA2RGB);
OpenCV中将Mat RGBA4通道转换成RGB3通道相关推荐
- java xml转html_如何在Java中将XML文档转换成HTML文档.pdf
您所在位置:网站首页 > 海量文档  > 计算机 > 网页设计/UI 如何在Java中将XML文档转换成HTML文档. ...
- 利用matlab将.mat格式文件转换成wav文件
利用matlab将.mat格式文件转换成wav文件 clc; clear all; clear all;filenames = dir('f16.mat') n = numel(filenames)f ...
- OpenCV入门: Mat数据类型及其转换,访问
1. 总结 先贴上我总结的Opencv的数据类型, 主要是针对不同Mat类型进行新建,修改和访问时使用, 更详细的数据访问见下文: 2. CV_8UC3解说 新建一个CV_8UC3型的cv::Mat, ...
- 利用OpenCV把一幅彩色图像转换成灰度图
图像灰度化的目的是为了简化矩阵,提高运算速度. 彩色图像中的每个像素颜色由R.G.B三个分量来决定,而每个分量的取值范围都在0-255之间,这样对计算机来说,彩色图像的一个像素点就会有256*256* ...
- matlab将.mat数据文件转换成.dat/.txt数据文件
//把矩阵 matrix 保存成任意后缀的文件 //转换成 .txt 举例:mat2txt( 'filename.txt', data ); //转换成 .corr 举例:mat2txt( 'file ...
- matlab中将mat数据文件转成excel文件
最近处理光伏数据全是m文件,暂时还没找到python里可以简单调用的方法,用matlab处理了一下,可以转换成Excel文件,非常方便! 1.首先把你需要转换的mat数据文件导入到工作区,默认命名da ...
- Intel Realsense D435 opencv 为什么将color图转换成灰度图后,再与depth图水平堆叠,其结果一片黑色?(数据未map到0-255)
相关代码 # -*- coding: utf-8 -*- """ @File : obstacle_detection.py @Time : 2019/12/11 10: ...
- 10进制转16进制 java_Java中将10进制转换成16进制
import java.util.Scanner; public class Decimal2HexConversion { public static void main(String[] args ...
- server sql 将出生日期转为年龄_SQL中将用户的出生年月转换成对应的年龄
今天有处理一个根据民警的出生年月信息来推算出他的年龄的需求,目前我的所有SQL操作都是在PGSQL中执行的,至于SQL是否适用其他的数据库无法进行保证,但思路基本上时这样处理,希望大家可以尝试或在我文 ...
最新文章
- 一文看懂全球半导体格局
- Divan and Kostomuksha (easy version) dp,gcd(2100)
- redis常用命令_Redis的简介以及基本常用命令
- Cygwin使用指南
- 马化腾,你就把微信卖给运营商得了
- 二阶偏微分方程组 龙格库塔法_数值方法(MATLAB版)(原书第3版)[Numerical Methods Using MATLAB,Third Edition]pdf...
- url、href、src 详解
- 我为啥不想用Python
- [Git] 撤销操作
- git 基础用法梳理
- delphi 获取驱动盘的卷标 号
- Postgresql 创建主键并设置自动递增的三种方法
- LINUX 使用ssh客户端
- UTF-8转码GBK
- 被骂“没前途”,那个996的程序员做错了什么?
- 《Real-Time Rendering 4th Edition》全文翻译 - 第6章 纹理化(下)6.7 ~ 6.9
- 计算机网络 UDP协议与TCP协议首部
- 浅谈电商行业标签与人群(上)
- 3DsMax2015-2019-2021 安装 NumPy
- centos7 扩容完成后执行 xfs_growfs /dev/centos/root
热门文章
- VC界面库Xtreme Toolkit Pro全新发布v22.1——支持VS 2022主题
- html5 视差地图,高性能的视差动画
- VMware Workstation 17.0 Pro Unlocker OEM BIOS for Windows
- [附源码]Python计算机毕业设计SSM即刻实时预约排队系统(程序+LW)
- 人生有很多捷径可以走,我却偏偏说不
- 3-7 慕课和掘金小册的学习
- SQL建表语句(建立学生_课程数据库)
- 离散实验偏序关系满足实验报告C语言,离散数学实验三
- 泛型default(T)应用
- PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.10 计算工资