在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通道相关推荐

  1. java xml转html_如何在Java中将XML文档转换成HTML文档.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp网页设计/UI 如何在Java中将XML文档转换成HTML文档. ...

  2. 利用matlab将.mat格式文件转换成wav文件

    利用matlab将.mat格式文件转换成wav文件 clc; clear all; clear all;filenames = dir('f16.mat') n = numel(filenames)f ...

  3. OpenCV入门: Mat数据类型及其转换,访问

    1. 总结 先贴上我总结的Opencv的数据类型, 主要是针对不同Mat类型进行新建,修改和访问时使用, 更详细的数据访问见下文: 2. CV_8UC3解说 新建一个CV_8UC3型的cv::Mat, ...

  4. 利用OpenCV把一幅彩色图像转换成灰度图

    图像灰度化的目的是为了简化矩阵,提高运算速度. 彩色图像中的每个像素颜色由R.G.B三个分量来决定,而每个分量的取值范围都在0-255之间,这样对计算机来说,彩色图像的一个像素点就会有256*256* ...

  5. matlab将.mat数据文件转换成.dat/.txt数据文件

    //把矩阵 matrix 保存成任意后缀的文件 //转换成 .txt 举例:mat2txt( 'filename.txt', data ); //转换成 .corr 举例:mat2txt( 'file ...

  6. matlab中将mat数据文件转成excel文件

    最近处理光伏数据全是m文件,暂时还没找到python里可以简单调用的方法,用matlab处理了一下,可以转换成Excel文件,非常方便! 1.首先把你需要转换的mat数据文件导入到工作区,默认命名da ...

  7. Intel Realsense D435 opencv 为什么将color图转换成灰度图后,再与depth图水平堆叠,其结果一片黑色?(数据未map到0-255)

    相关代码 # -*- coding: utf-8 -*- """ @File : obstacle_detection.py @Time : 2019/12/11 10: ...

  8. 10进制转16进制 java_Java中将10进制转换成16进制

    import java.util.Scanner; public class Decimal2HexConversion { public static void main(String[] args ...

  9. server sql 将出生日期转为年龄_SQL中将用户的出生年月转换成对应的年龄

    今天有处理一个根据民警的出生年月信息来推算出他的年龄的需求,目前我的所有SQL操作都是在PGSQL中执行的,至于SQL是否适用其他的数据库无法进行保证,但思路基本上时这样处理,希望大家可以尝试或在我文 ...

最新文章

  1. 一文看懂全球半导体格局
  2. Divan and Kostomuksha (easy version) dp,gcd(2100)
  3. redis常用命令_Redis的简介以及基本常用命令
  4. Cygwin使用指南
  5. 马化腾,你就把微信卖给运营商得了
  6. 二阶偏微分方程组 龙格库塔法_数值方法(MATLAB版)(原书第3版)[Numerical Methods Using MATLAB,Third Edition]pdf...
  7. url、href、src 详解
  8. 我为啥不想用Python
  9. [Git] 撤销操作
  10. git 基础用法梳理
  11. delphi 获取驱动盘的卷标 号
  12. Postgresql 创建主键并设置自动递增的三种方法
  13. LINUX 使用ssh客户端
  14. UTF-8转码GBK
  15. 被骂“没前途”,那个996的程序员做错了什么?
  16. 《Real-Time Rendering 4th Edition》全文翻译 - 第6章 纹理化(下)6.7 ~ 6.9
  17. 计算机网络 UDP协议与TCP协议首部
  18. 浅谈电商行业标签与人群(上)
  19. 3DsMax2015-2019-2021 安装 NumPy
  20. centos7 扩容完成后执行 xfs_growfs /dev/centos/root

热门文章

  1. VC界面库Xtreme Toolkit Pro全新发布v22.1——支持VS 2022主题
  2. html5 视差地图,高性能的视差动画
  3. VMware Workstation 17.0 Pro Unlocker OEM BIOS for Windows
  4. [附源码]Python计算机毕业设计SSM即刻实时预约排队系统(程序+LW)
  5. 人生有很多捷径可以走,我却偏偏说不
  6. 3-7 慕课和掘金小册的学习
  7. SQL建表语句(建立学生_课程数据库)
  8. 离散实验偏序关系满足实验报告C语言,离散数学实验三
  9. 泛型default(T)应用
  10. PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.10 计算工资