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

将gstreamer YUV4:2:0 (I420)原始帧转换为OpenCV cv::Mat

将gstreamer YUV4:2:0 (I420)原始帧转换为OpenCV cv::Mat,可以通过以下步骤实现:

  1. 导入必要的库和头文件:
代码语言:txt
复制
#include <gst/gst.h>
#include <opencv2/opencv.hpp>
  1. 初始化GStreamer库:
代码语言:txt
复制
gst_init(NULL, NULL);
  1. 创建GStreamer的元素和管道:
代码语言:txt
复制
GstElement *pipeline = gst_pipeline_new("pipeline");
GstElement *source = gst_element_factory_make("appsrc", "source");
GstElement *filter = gst_element_factory_make("capsfilter", "filter");
GstElement *sink = gst_element_factory_make("appsink", "sink");
  1. 设置元素的属性:
代码语言:txt
复制
g_object_set(G_OBJECT(filter), "caps", gst_caps_new_simple("video/x-raw",
    "format", G_TYPE_STRING, "I420", NULL), NULL);
  1. 将元素添加到管道中:
代码语言:txt
复制
gst_bin_add_many(GST_BIN(pipeline), source, filter, sink, NULL);
  1. 连接元素之间的管道:
代码语言:txt
复制
gst_element_link_many(source, filter, sink, NULL);
  1. 创建OpenCV的cv::Mat对象:
代码语言:txt
复制
cv::Mat frame;
  1. 定义回调函数来处理从GStreamer接收到的帧数据:
代码语言:txt
复制
GstFlowReturn new_sample(GstElement *sink, cv::Mat *frame) {
    GstSample *sample = gst_app_sink_pull_sample(GST_APP_SINK(sink));
    GstBuffer *buffer = gst_sample_get_buffer(sample);
    GstMapInfo map;
    gst_buffer_map(buffer, &map, GST_MAP_READ);

    // 将YUV4:2:0帧数据转换为OpenCV的cv::Mat对象
    cv::Mat yuv(map.height * 3 / 2, map.width, CV_8UC1, map.data);
    cv::cvtColor(yuv, *frame, cv::COLOR_YUV2BGR_I420);

    gst_buffer_unmap(buffer, &map);
    gst_sample_unref(sample);

    return GST_FLOW_OK;
}
  1. 设置appsink的回调函数:
代码语言:txt
复制
g_signal_connect(sink, "new-sample", G_CALLBACK(new_sample), &frame);
  1. 启动管道:
代码语言:txt
复制
gst_element_set_state(pipeline, GST_STATE_PLAYING);
  1. 循环读取并处理帧数据:
代码语言:txt
复制
while (true) {
    // 在这里可以对frame进行进一步的处理,如图像处理、分析等

    // 检查是否有按键输入,如果有则退出循环
    if (cv::waitKey(1) != -1)
        break;
}

12. 停止管道并释放资源:
```cpp
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));

这样,你就可以将gstreamer YUV4:2:0 (I420)原始帧转换为OpenCV cv::Mat对象了。在处理帧数据时,你可以根据需要进行各种图像处理、分析等操作。

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

相关·内容

  • ISP-YUV格式

    下面三张图片是常见的三种YUV采样方式,YUV4:4:4、YUV422YUV420。...其中,YUV4:4:4是一种无压缩的采样方式,每一个Y分量对应一组UV分量;YUV422的采样方式丢弃了一半的色度分量,每两个Y分量对应一组UV分量;YUV420的采样方式对齐了四分之三的色度分量... I420文件 I420文件是YUV420采样格式的一种存储格式,具体的地址对应关系如下图所示,和UYVY文件稍有不同。I420文件先存储Y块、然后是U块和V块。...以YUV422YUV420换为例,如下:   最简单的方式:   YUV4:2:2 ---> YUV4:2:0 Y不变,U和V信号值在行(垂直方向)在进行一次隔行抽样。...YUV4:2:0 ---> YUV4:2:2 Y不变,U和V信号值的每一行分别拷贝一份形成连续两行数据。   在YUV420中,一个像素点对应一个Y,一个4X4的小方块对应一个U和V。

    1.2K20

    一文详解OpenCV中的CUDA模块

    三、CPU/GUP数据传递 要将数据从GpuMat传输到Mat,反之亦然,OpenCV提供了两个函数: 上传,数据从主机内存复制到设备内存 下载,数据从设备内存复制到主机内存。...以下是用C ++写的一个简单示例: #include #include cv::Mat img =...由于Farneback的光流法适用于灰度,因此我们需要确保灰度视频作为输入传递。这就是为什么我们首先对其进行预处理以从BGR格式转换为灰度的原因。...另外,由于原始分辨率可能太大,因此我们将其调整为较小的尺寸,就像对第一所做的一样。...我们这些输出转换为极坐标,以通过色相获得流动的角度(方向),并通过HSV颜色表示的值获得流动的距离(幅度)。对于可视化,我们现在要做的就是结果转换为BGR空间。

    5.1K30

    基于OpenCV 的美颜相机推送直播流

    1.图像采集 先从opencv(2.4.10版本)采集回来摄像头的图像,是一的 每一图像是一个矩阵,opencv中的mat 数据结构。...h264的格式 Rgb转换成yuv,opencv实现(美颜在这一步实现) Yuv转换成h264,x264实现 H264换成rtmp流,libxrtmp实现 4.发送给服务器进行直播 H264的流一般就可以播放了...,但是针对目前的网络直播主要是h264换成rtmp流,用rtmp的服务器进行播放,这块我们主要用的是adobe media server 5这个服务器进行接受工作 5.技术难点 1.人脸美化转换为皮肤检测...0;/// for(;;) { Mat frame; cap >> frame; // 从摄像头中获取新的一 //detectAndDisplay( frame ); imshow...::Mat yuvImg; cv::cvtColor(frame, yuvImg, CV_BGR2YUV_I420); memcpy(pYuvBuf, yuvImg.data, yuv_bufLen

    1.6K20

    OpenCV-Python学习教程.2

    子Linux不是太好使 ---- # 获取视频的宽 w = fcap.get(cv2.CAP_PROP_FRAME_WIDTH) # 获取视频的高 h = fcap.get(cv2.CAP_PROP_FRAME_HEIGHT.../img/111.jpg', 0) cv2.imshow('img', img) cv2.waitKey(1) 注意一定要有后面的waitkey参数,不然一闪而过 读取图片,第二个参数0是灰色,1是彩色...然后会返回一个负值 cv2.imread()的函数原型为Mat imread( const string& filename, int flags=1 ),其中MatOpencv最重要的数据结构,它在...(2)flags=2,这种情况代表选择CV_LOAD_IMAGE_GRAYSCALE方式,即以灰度图像格式读取图像。无论原始图像原来是什么格式,读取后都的结果都转变为灰度图像。   ...出现了 读取的图像如果通过numpy.asarray()转换为多维数组类型,即转换后的数组形状为[Height, Width, Channels]。 ---- 接下来的文章会继续深入学习cv2.

    72410

    JavaCV的摄像头实战之八:人脸识别

    本篇概览 本文是《JavaCV的摄像头实战》的第八篇,前面的操作夯实了的和流处理的基本功,接下来开始实现一些常见的CV能力,就从本篇的人脸识别开始吧 OpenCV中常用的人脸识别是基于Haar特征的级联分类器...return new Mat(src.rows(), src.cols(), CV_8UC1); } 第二个方法是第一个是detect,该方法非常重要:原图转为灰度图片,再用指定的分类器识别...,识别结果在原图上标注出来,标注后的Mat转为Frame对象返回: /** * 检测图片,检测结果用矩形标注在原始图片上 * @param classifier 分类器..., 0); } // 释放检测结果资源 objects.close(); // 标注过的图片转为,返回 return...,这个处理包括物体检测,再将检测结果标注在原始图片上, // 然后转换为返回 Frame detectedFrame = detectService.convert(frame

    1.7K40

    OpenCV Android 之 VideoCapture类

    不要想着使用 OpenCV 来进行视频播放 所有使用 OpenCV 进行播放视频,实际上都是视频图片了,再一张张图片在切换显示,编解码和效率是远远没有专门的视频播放器效率高的。...而我们可以通过OpenCV视频进行解码成Mat文件,进行操作,并将编辑之后的结果存储为视频。 可以将相机拍摄的结果,进行实时处理之后。存储为视频等操作。...提供了几种方法: 1.获取每一数据,转为Mat2.获取视频的一些配置信息,例如时长,FPS,帧数,宽高等等。...= 1600, CAP_OPENNI2_ASUS = 1610, CAP_GPHOTO2 = 1700, CAP_GSTREAMER...就可以这些配置信息添加到解码器中。进行生效了。 我们如果只是单纯调用 openCV 的 API。那么set()方法使用空间不大了。

    1.2K20

    JavaCV的摄像头实战之八:人脸检测

    return new Mat(src.rows(), src.cols(), CV_8UC1); } 第二个方法是第一个是detect,该方法非常重要:原图转为灰度图片,再用指定的分类器检测...,检测结果在原图上标注出来,标注后的Mat转为Frame对象返回: /** * 检测图片,检测结果用矩形标注在原始图片上 * @param classifier 分类器...* @param converter Frame和mat的转换器 * @param rawFrame 原始视频 * @param grabbedImage 原始视频对应的..., 0); } // 释放检测结果资源 objects.close(); // 标注过的图片转为,返回 return...,这个处理包括物体检测,再将检测结果标注在原始图片上, // 然后转换为返回 Frame detectedFrame = detectService.convert(frame

    73520

    YUV文件格式

    2)YUV数据的采集方式 YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2YUV4:2:0,关于其详细原理,可以通过网上其它文章了解...其提取方式与上一种 类似,即Y’00、Y’01、Y’10、Y’11共用Cr00、Cb00 三、YUV422,YUV420相互转换 最简单的方式: YUV4:2:2 —> YUV4:2:0 : Y不变,...YUV4:2:0 —> YUV4:2:2 :Y不变,U和V信号值的每一行分别拷贝一份形成连续两行数据。 在YUV420中,一个像素点对应一个Y,一个4X4的小方块对应一个U和V。...四、YV12和I420的区别 一般来说,直接采集到的视频数据是RGB24的格式,RGB24一的大小size=width×heigth×3 Byte,RGB32的size=width×heigth...但是这里需要注意的是,虽然YV12也是(4:20),但是YV12和I420的却是不同的,在 存储空间上面有些区别。

    1.9K20

    OpenCV 安卓编程示例:1~6 全

    在旋转 90 度的情况下,这意味着您将手机置于纵向时拍摄了图像; 我们通过调用t()方法图像逆时针旋转 90 度,以Mat对象。...置的结果是原始图像的镜像版本,因此我们需要执行另一步骤以通过调用Core.flip()并将其传递到源图像和目标图像并调用翻转代码来指定如何沿垂直轴翻转图像; 0表示围绕 x 轴翻转,正值(例如1)表示围绕...我们遵循相同的算法,对图像进行置然后翻转。 但是,在对图像进行置后,它将是围绕水平方向的镜像版本,因此我们00翻转代码一起调用。...图像转换为灰度 OpenCV 支持多种颜色空间转换,因此全彩色图像转换为灰度级所需的工作量非常小。...HSV.get(i, j,Vs); Vs[2]=vsout[0]; Vs[1]=ssout[0]; HSV.put(i, j,Vs); } } 现在,我们增强的饱和度和值复制回原始图像

    5.6K10

    常用的视频提取工具和方法总结

    使用上述命令提取视频的第一,并保存为PNG格式的图像文件。你可以命令中的eq(n,0)部分修改为其他条件,以提取不同的,比如提取所有、按时间间隔提取等。...使用OpenCV提取视频的代码如下: import cv2 # 打开视频文件 video = cv2.VideoCapture('input_video.mp4') # 检查视频是否成功打开...cv2.imshow("Frame", frame):显示当前。这里只是简单地显示,你也可以根据需求进行其他处理。...cv2.waitKey(1) & 0xFF == ord('q'):监听键盘输入,如果按下 'q' 键,则退出循环。 video.release():释放视频对象。...GStreamerGStreamer是一个功能强大的多媒体处理框架,可以在不同平台上进行视频提取。它支持多种编程语言和操作系统,并提供了广泛的插件和工具。

    99410
    领券