拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 使用OpenCVPython从BGR到YUYV的转换

使用OpenCVPython从BGR到YUYV的转换

白鹭 - 2022-01-23 2157 0 0

我一直在尝试将 BGR 捕获的帧转换为 YUYV 格式。

在 OpenCV Python 中,我可以使用COLOR_YUV2BGR_YUY2转换代码将 YUYV 转换为 BGR,但我不能执行此操作的相反操作(此操作没有转换代码,我已经尝试过,COLOR_BGR2YUV但没有正确转换)。我很好奇如何将 3 通道 BGR 帧转换为 2 通道 YUYV 帧。

在这里您可以看到我用来更改相机模式以捕获 YUYV 并将其转换为 BGR 的代码,我正在寻找替代品,cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)以便我可以捕获 BGR 并将其转换为 YUYV cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)(因为它是一个可选的捕获设定和 Windows DirectShow 忽略此标志)

import cv2import numpy as npcap = cv2.VideoCapture(4)_, frame = cap.read()cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)  # How to replace this line with another BGR to YUYV conversion?_, frame_rgb_off = cap.read()bgr_cvt = cv2.cvtColor(frame_rgb_off, cv2.COLOR_YUV2BGR_YUY2)

这是显示帧内容的除错器输出:

链接到荧屏截图

我试图了解 YUYV 格式,但它只有 2 通道,并且下采样程序非常复杂。我已经检查了 YUYV 到 BGR 的转换方法,但我找不到数学转换方法(解决方案通常使用命令列中的 ffmpeg 实用程序,但我认为我需要使用 numpy 阵列进行数学计算)

uj5u.com热心网友回复:

您可以使用以下代码将影像转换为 YUV,然后从 YUV 创建 YUYV。在这个例子中,一个影像作为程序的输入:

import cv2import numpy as np# Load sample imageimg_bgr = cv2.imread("home.jpg")cv2.imshow("original", img_bgr)cv2.waitKey(0)# Convert from BGR to YUVimg_yuv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YUV)# Converting directly back from YUV to BGR results in an (almost) identical imageimg_bgr_restored = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)cv2.imshow("converted", img_bgr_restored)cv2.waitKey(0)diff = img_bgr.astype(np.int16) - img_bgr_restoredprint("mean/stddev diff (BGR => YUV => BGR)", np.mean(diff), np.std(diff))# Create YUYV from YUVy0 = np.expand_dims(img_yuv[...,0][::,::2], axis=2)u = np.expand_dims(img_yuv[...,1][::,::2], axis=2)y1 = np.expand_dims(img_yuv[...,0][::,1::2], axis=2)v = np.expand_dims(img_yuv[...,2][::,::2], axis=2)img_yuyv = np.concatenate((y0, u, y1, v), axis=2)img_yuyv_cvt = img_yuyv.reshape(img_yuyv.shape[0], img_yuyv.shape[1] * 2, 
int(img_yuyv.shape[2] / 2))# Convert back to BGR results in more saturated image.img_bgr_restored = cv2.cvtColor(img_yuyv_cvt, cv2.COLOR_YUV2BGR_YUYV)cv2.imshow("converted", img_bgr_restored)cv2.waitKey(0)diff = img_bgr.astype(np.int16) - img_bgr_restoredprint("mean/stddev diff (BGR => YUV => YUYV => BGR)", np.mean(diff), np.std(diff))
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *