opencv读取YUV文件并转为BGR

这篇博客介绍了如何使用OpenCV读取和处理YUYV4:2:2格式的YUV图像数据。通过计算frame_len为像素深度16位的数据长度,并进行reshape操作,展示原始YUV数据并将其转换为BGR色彩空间。文章还提供了YUV存储方式的参考资料链接。
摘要由CSDN通过智能技术生成

项目中需要使用opencv对相机读取的yuv格式数据做处理,故记录在此。

注意下方代码中frame_len参数,因为我的yuv文件是YUYV 4:2:2格式,每个像素深度为16位(2x8bit),故数据长度需x2。可推知若为YUV 4:2:0,像素深度为12位,则x1.5。
关于YUV存储方式的详细信息可以参考https://blog.csdn.net/qq_25333681/article/details/89970216

import numpy as np
import cv2
import os


def convert_yuyv(yuv_file):
    yuv_file = open(yuv_file, 'rb')
    frame_len = 352 * 288 * 2
    shape1 = (288, 352*2)  # 用于可视化raw yuv,比例可以任意
    shape2 = (288, 352, 2)  # 用于yuv转bgr,对于yuyv格式,需要2通道
    raw = yuv_file.read(int(frame_len))
    yuv = np.frombuffer(raw, dtype=np.uint8)
    yuv = yuv.reshape(shape1)
    cv2.imshow("raw yuv", yuv)
    cv2.waitKey(0)
    yuv = yuv.reshape(shape2)
    bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_YUYV)
    cv2.imshow("YUV2BGR", bgr)
    cv2.waitKey(0)

yuv图片可视化结果
转为RGB结果

OpenCV可以通过cv::VideoCapture类读取常见的视频文件格式,如.avi和.mp4等。然而,在某些应用场景中,我们需要读取yuv格式的原始视频数据,例如压缩算法的研究或图像处理的探索。在这种情况下,OpenCV提供了一个cv::VideoCapture类,可以读取yuv格式的视频数据。 使用cv::VideoCapture::open()打开yuv文件时,需要指定文件的路径,并设置四个参数:视频宽度、视频高度、帧率和视频格式。对于yuv文件,格式通常是YUV 4:2:0或YUV 4:2:2。例如: cv::VideoCapture capture; std::string filename = "path/to/yuvfile.yuv"; int width = 1920; int height = 1080; int fps = 30; int format = CV_8UC1; // YUV格式通常为单通道 bool success = capture.open(filename, cv::CAP_ANY); if (!success) { std::cerr << "Error: Failed to open the video file." << std::endl; return -1; } 读取yuv文件时,每个帧通常由Y、U和V三个分量组成。因此,我们需要使用不同的函数读取不同的分量。例如: cv::Mat yuv_image; cv::Mat y_plane(height, width, format); cv::Mat u_plane(height / 2, width / 2, format); cv::Mat v_plane(height / 2, width / 2, format); while (capture.read(yuv_image)) { // 分离y、u、v分量 cv::extractChannel(yuv_image, y_plane, 0); cv::extractChannel(yuv_image, u_plane, 1); cv::extractChannel(yuv_image, v_plane, 2); // 处理y分量 // ... // 将分量合并以重构原始图像 cv::Mat bgr_image; cv::merge(std::vector<cv::Mat>{y_plane, u_plane, v_plane}, bgr_image); // 显示图像 cv::imshow("Video", bgr_image); cv::waitKey(1); } 需要注意的是,由于yuv文件的像素值通常不是8位,而是10位,12位等,因此需要根据实际情况对像素值进行缩放和偏移。此外,在将Y、U和V三个分量合并以重构原始图像之前,需要将U和V分量上采样到与Y分量相同的分辨率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值