首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从包含YUV420p帧的QByteArray创建一个合适的cv::Mat

,可以按照以下步骤进行:

  1. 首先,将QByteArray转换为cv::Mat所需的数据格式。YUV420p是一种常见的视频帧格式,其中Y表示亮度分量,U和V表示色度分量。YUV420p帧的数据存储方式是先存储所有的Y分量,然后是U分量,最后是V分量。因此,我们需要将QByteArray中的数据按照这个顺序提取出来。
  2. 创建一个cv::Mat对象,并设置其尺寸和数据类型。根据YUV420p的特点,我们可以计算出图像的宽度和高度。通常,Y分量的宽度和高度与图像的宽度和高度相同,而U和V分量的宽度和高度是Y分量的一半。根据YUV420p的数据类型,我们可以选择使用CV_8UC1(8位无符号整数,单通道)或CV_8UC3(8位无符号整数,三通道)作为cv::Mat的数据类型。
  3. 将提取的Y、U和V分量数据分别复制到cv::Mat的相应通道中。根据cv::Mat的数据类型,我们可以使用memcpy函数或者逐像素复制的方式将数据复制到cv::Mat中。

以下是一个示例代码,展示了如何从包含YUV420p帧的QByteArray创建一个合适的cv::Mat:

代码语言:cpp
复制
#include <opencv2/opencv.hpp>

cv::Mat createMatFromYUV420p(const QByteArray& yuvData, int width, int height)
{
    int uvWidth = width / 2;
    int uvHeight = height / 2;

    cv::Mat yuvMat(height + uvHeight, width, CV_8UC1);
    cv::Mat bgrMat(height, width, CV_8UC3);

    // 提取Y分量数据
    memcpy(yuvMat.data, yuvData.constData(), width * height);

    // 提取U分量数据
    memcpy(yuvMat.data + width * height, yuvData.constData() + width * height, uvWidth * uvHeight);

    // 提取V分量数据
    memcpy(yuvMat.data + width * height + uvWidth * uvHeight, yuvData.constData() + width * height + uvWidth * uvHeight, uvWidth * uvHeight);

    // 转换为BGR格式
    cv::cvtColor(yuvMat, bgrMat, cv::COLOR_YUV2BGR_I420);

    return bgrMat;
}

这个函数接受一个包含YUV420p帧数据的QByteArray对象,以及图像的宽度和高度作为参数。它返回一个转换后的BGR格式的cv::Mat对象。

在使用这个函数时,你需要确保提供的QByteArray对象包含足够的数据,以及正确的宽度和高度信息。另外,你可能需要在代码中包含OpenCV库的头文件,并链接OpenCV库。

这是一个基本的示例,你可以根据自己的需求进行修改和扩展。关于cv::Mat和YUV420p的更多详细信息,你可以参考OpenCV官方文档:cv::Mat文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

零学习OpenCV】图像保存&视频保存

包含图像格式 img:将要保存Mat类矩阵变量 params:保存图片格式属性设置标志 该函数用于将Mat类矩阵保存成图像文件,如果成功保存,则返回true,否则返回false。...,包含视频格式 int:压缩4字符编解码器代码,详细参数在表2-7给出。...framSize:视频尺寸 isColor:保存视频是否为彩色视频 代码清单2-33中第1行默认构造函数使用方法与VideoCapture()相同,都是创建一个用于保存视频数据流,后续通过open...第二种构造函数需要输入一个参数是需要保存视频文件名称,第二个函数是编解码器代码,可以设置编解码器选项在表中给出,如果赋值“-1”则会自动搜索合适编解码器,需要注意是其在OpenCV 4.0...该函数与VideoCapture()有很大相似之处,都可以通过isOpened()函数判断是否成功创建一个视频流,可以通过get()查看视频流中各种属性。

3K30

FFmpeg 播放器视频渲染优化

视频渲染优化 前文中,我们都是将解码视频通过 swscale 库转换为 RGBA 格式,然后在送给 OpenGL 渲染,而视频通常格式是 YUV420P/YUV420SP ,所以大部分情况下都需要...我们在前文一文掌握 YUV 图像基本处理中知道,YUV420P 格式图像在内存中有 3 个平面,YUV420SP (NV21、NV12)格式图像在内存中有 2 个平面,而 RGBA 格式图像只有一个平面...YUV420SP 有 2 个平面 所以,OpenGLRender 视频渲染器要兼容 YUV420P、 YUV420SP 以及 RGBA 格式,需要创建 3 个纹理存储待渲染数据,渲染 YUV420P...格式图像需要用到 3 个纹理,渲染 YUV420SP 格式图像只需用到 2 个纹理即可,而渲染 RGBA 格式图像只需一个纹理。...判断解码后视频格式,AVFrame 是解码后视频

3.1K30

增强现实入门实战,使用ArUco标记实现增强现实

ArUco标记尺寸可以任意更改,为了成功检测可根据对象大小和场景选择合适尺寸。在实际使用中,如果标记尺寸太小,可能无法检测到它,这时可以选择更换较大尺寸标记,或者将相机离标记更近一些。...每个词典中所有的Aruco标记均包含相同数量块或位(例如4×4、5×5、6×6或7×7),且每个词典中Aruco标记数量固定(例如50、100、250或1000)。...调用getPredefinedDictionary函数加载包含250个标记字典,其中每个标记都是6×6位二进制模式。具体代码在下面给出。...为此,我们将打印ArUco标记,并粘贴到图像区域四个角落,如下图所示,然后采集视频,并按顺序分别处理视频每一。 ? 对于每图像,首先检测标记。上图中用绿色线条绘制了检测到ArUco标记。...该标记一个角点有一个红色小圆圈,可以通过顺时针移动标记来访问第二,第三和第四点。 之后我们应用单应性变换将新图像放置到视频中相框位置。其过程与结果如下所示。 ?

2.5K40

opencv学习—VideoCapture 类基础知识「建议收藏」

要想获取视频需要先创建一个VideoCapture对象,VideoCapture对象创建方式有以下三种: cop 【方式一】是文件(.MPG或.AVI格式)中读取视频,对象创建以后,OpenCV将会打开文件并做好准备读取它...Users/DADA/DATA/gogo.avi"); // 视频文件读取 【方式二】是摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问摄像机,及其与操作系统握手方式...【方式三】先创建一个捕获对象,然后通过成员函数open()来设定打开信息,操作如下。...); //当前视频 cv::Mat frame; //每一之间延时 //与视频帧率相对应 int delay = 1000/...::read(Mat& image) 功能:该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频这是一个最方便函数对于读取视频文件或者捕获数据解码和返回刚刚捕获

2.3K50

Qt5 和 OpenCV4 计算机视觉项目:1~5

因此,OpenCV 使用Mat类表示图像。 实际上,Mat类是一个 N 维数组,可用于存储具有任何给定数据类型单个或多个数据通道,并且它包含许多以多种方式创建,修改或操纵它成员和方法。 。...例如,我们可以创建一个实例,该实例宽度(列)为800,高度(行)为600,其中三个通道包含 8 位无符号int值,如下所示: Mat mat(600, 800, CV_8UC3); 此构造器第三个参数是该矩阵...在循环中,我们VideoCapture实例读取图像到Mat实例。 随着循环进行,将从网络摄像头读取连续图像并将它们组成视频。 在视频处理方面,这些连续图像中一个通常称为。...然后,我们声明一个名称为frameCapture信号,该信号将指向Mat对象指针作为其唯一参数。 每次网络摄像头捕获时,都会发出此信号。 如果您对此信号感兴趣,可以将一个插槽连接到它。...然后,就像本节开始时给出示例一样,我们使用相机索引创建VideoCapture类实例,并创建Mat实例以保存捕获。 之后是无限循环。 在循环中,我们捕获一并检查它是否为空。

5.6K10

Android将camera获取到YuvData在jni中转化为Mat方法

数据 if ( mCanny == NULL ) { mCanny = new Mat(height, width, CV_8UC1); } Mat mGray(height, width,...CV_8UC1, (unsigned char *)pNV21FrameData); //构建灰度图时构造函数 Mat mResult(height, width, CV_8UC4, (unsigned...yuv格式,再将yuv转化为BGR彩色图像,构造yuv时构造函数和直接构造灰度图有些不同,在YUV420中一个像素对应一个Y,一个2*2小方块对应一个UV,对于所有YUV420图像,它们Y值排列是完全相同...YUV420sp与YUV420p数据格式它们UV排列在原理上是完全不同。420p它是先把U存放完后,再存放V,也就是说UV它们是连续。而420sp它是UV、UV这样交替存放。...(yuv, pBuf, 0); return 0; } 以上这篇Android将camera获取到YuvData在jni中转化为Mat方法就是小编分享给大家全部内容了,希望能给大家一个参考。

92930

【实战】使用ArUco标记实现增强现实

ArUco标记尺寸可以任意更改,为了成功检测可根据对象大小和场景选择合适尺寸。在实际使用中,如果标记尺寸太小,可能无法检测到它,这时可以选择更换较大尺寸标记,或者将相机离标记更近一些。...每个词典中所有的Aruco标记均包含相同数量块或位(例如4×4、5×5、6×6或7×7),且每个词典中Aruco标记数量固定(例如50、100、250或1000)。...调用getPredefinedDictionary函数加载包含250个标记字典,其中每个标记都是6×6位二进制模式。具体代码在下面给出。...为此,我们将打印ArUco标记,并粘贴到图像区域四个角落,如下图所示,然后采集视频,并按顺序分别处理视频每一。 ? 对于每图像,首先检测标记。上图中用绿色线条绘制了检测到ArUco标记。...该标记一个角点有一个红色小圆圈,可以通过顺时针移动标记来访问第二,第三和第四点。 之后我们应用单应性变换将新图像放置到视频中相框位置。其过程与结果如下所示。 ?

1.9K10

OpenCV2 计算机视觉应用编程秘籍:6~10

注意,std::vector中包含输入点根据函数需要在cv::Mat中传输。 通常,线方程将用于某些属性计算中(在需要精确参数表示情况下,校准是一个很好例子)。...OpenCV 建立了一个易于使用框架,可以视频文件甚至 USB 摄像机执行提取。 此秘籍向您展示如何使用它。...操作步骤 基本上,要读取视频序列,您要做就是创建cv::VideoCapture类实例。 然后,您创建一个循环,该循环将提取并读取每个视频。...编写视频序列 在先前秘籍中,我们学习了如何读取视频文件并提取其。 此秘籍将向您展示如何编写并因此创建视频文件。...操作步骤 如果我们可以使用场景背景图像(即一个包含前景对象),那么通过一个简单图像差异就可以很容易地提取当前前景: // compute difference between current

1.1K30

使用Pytorch和OpenCV实现视频人脸替换

提取和对齐-构建数据集 在第一部分中,我们主要介绍face_extraction_tools.py文件中代码。 因为第一步是视频中提取,所以需要构建一个保存为JPEG图像函数。...然后使用OpenCV videoccapture类来创建一个对象来读取视频,然后逐保存为输出文件夹中JPEG文件。也可以根据frames_to_skip参数跳过。...构建这样一个工具最佳方法是创建一个FaceExtractor类,其中包含检测、提取和对齐方法。 对于检测部分,我们将使用带有OpenCVYuNet。...在第二部分创建未扭曲图像,这是模型应该扭曲图像中创建目标图像。使用噪声作为源坐标,并为目标图像定义一组目标坐标。...我们首先从视频中提取,然后中提取人脸并对齐它们以创建一个数据库。使用神经网络来学习如何在潜在空间中表示人脸以及如何重建人脸。遍历了目标视频,找到了人脸并替换,这就是这个项目的完整流程。

40630

使用计算机视觉实战项目精通 OpenCV:1~5

您可以使用 C++ 流运算符cv::VideoCapture对象捕获到cv::Mat对象中,从而抓住每个摄像机,就像控制台获取输入一样。...因此,与其分配两个单独图像并复制边缘遮罩像素,不如分配一个包含边框单个遮罩图像,并创建一个W x H额外cv::Mat标头(它只是引用了洪水填充遮罩中没有边界兴趣区域)。...cv::Mat类型可以返回子图像视图,即cv::Mat新实例,其中包含原始图像一部分。...例如,如果您有一个cv::Mat大小为400 x 400,则下面的代码段将从(10, 10)开始为5 x 5图像块创建一个子矩阵: cv::Mat src(400,400,CV_8UC1); cv::Rect...它是一个根对象,其中包含增强现实所需所有子组件,并在输入上执行所有处理例程。

2.1K10

JavaCV人脸识别三部曲之三:识别和预览

是OpenCV的人脸识别中非常重要两个概念,咱们先把这两个概念搞清楚,再去编码就非常容易了 假设,咱们用下面六张照片训练出包含两个类别的模型: 用一张新照片去训练好模型中做识别,如下图,识别结果有两部分内容...工程下: 编码:人脸识别服务 开始正式编码,今天咱们不会新建工程,而是继续使用《JavaCV摄像头实战之一:基础》中创建simple-grab-push工程 先定义一个Bean类PredictRlt.java...src) { return new Mat(src.rows(), src.cols(), CV_8UC1); } /** * 初始化操作,例如模型下载...转换器 * @param rawFrame 原始视频 * @param grabbedImage 原始视频对应mat * @param grayImage 存放灰度图片...:基础》创建simple-grab-push工程中已经准备好了父类AbstractCameraApplication,所以本篇继续使用该工程,创建子类实现那些抽象方法即可 编码前先回顾父类基础结构,

96230

C++ OpenCV摄像头及视频操作类​VideoCapture介绍

前言 前面的文章我们做了对图片一些处理,OpenCV里面还有对动态视频处理,通过动态视频图像每一生成Mat再对图像可以进行处理。...); VideoCapture::VideoCapture(int device); 功能:创建一个VideoCapture类实例,如果传入对应参数,可以直接打开视频文件或者要调用摄像头。...---- 5.VideoCapture::grab bool VideoCapture::grab(); 功能:视频文件或捕获设备中抓取下一个,假如调用成功返回true。...); 功能:解码并且返回刚刚抓取视频,假如没有视频被捕获(相机没有连接或者视频文件中没有更多)将返回false。...(Mat& image); 功能:该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频这是一个最方便函数对于读取视频文件或者捕获数据解码和返回刚刚捕获

4.3K30

海面漂浮物垃圾识别检测算法

图片但是这个方法有致命缺点,就是你并不知道要检测目标大小是什么规模,所以你要设置不同大小和比例窗口去滑动,而且还要选取合适步长。...解决思路之一就是减少要分类子区域,这就是R-CNN一个改进策略,海面漂浮物垃圾识别检测算法采用了selective search方法来找到最有可能包含目标的子区域(Region Proposal),...Mat frame; int i, j, c; // 读入新 capture >> frame; if(frame.empty())...); // 计算新一surf特征,并与前一surf特做匹配 // surf特征只在图像原始尺度上计算 if(bb_file)...H = temp; } //使用上述得到投影变换矩阵H对当前图像进行warp,从而消除相机造成运动 Mat H_inv = H.inv();

36841
领券