繁体   English   中英

使用 OpenCV Python 从 BGR 转换为 YUYV

[英]Conversion from BGR to YUYV with OpenCV Python

我一直在尝试将 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 without cap.set(cv2.CAP_PROP_CONVERT_RGB, 0) (因为它是一个可选的捕获设置,Windows DirectShow 忽略了这个标志)

import cv2
import numpy as np

cap = 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)

这是调试器 output 以显示帧内容:

链接到屏幕截图

我试图理解 YUYV 格式,但它只有 2 个通道,下采样过程相当复杂。 我已经检查了 YUYV 到 BGR 的转换方法,但我找不到数学转换方法(解决方案通常使用命令行中的 ffmpeg 实用程序,但我需要使用 numpy ZA3CBC3F9D0CE2F2C11D9E1B671 进行数学转换)

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

import cv2
import numpy as np

# Load sample image
img_bgr = cv2.imread("home.jpg")
cv2.imshow("original", img_bgr)
cv2.waitKey(0)

# Convert from BGR to YUV
img_yuv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YUV)

# Converting directly back from YUV to BGR results in an (almost) identical image
img_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_restored
print("mean/stddev diff (BGR => YUV => BGR)", np.mean(diff), np.std(diff))

# Create YUYV from YUV
y0 = 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_restored
print("mean/stddev diff (BGR => YUV => YUYV => BGR)", np.mean(diff), np.std(diff))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM