【发布时间】:2022-01-15 04:32:51
【问题描述】:
我正在通过 Windows (usb) 上的主机应用程序连接 qvga 传感器流式传输 yuv2 格式数据。如何使用任何 opencv-python 示例应用程序从 yuv2 格式流式传输或捕获原始数据。
我该怎么做?是否有任何测试示例可以这样做?
//opencv-python (host appl)
import cv2
import numpy as np
# open video0
cap = cv2.VideoCapture(0, cv2.CAP_MSMF)
# set width and height
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 340)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# set fps
cap.set(cv2.CAP_PROP_FPS, 30)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Display the resulting frame
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
获取视频帧而不解码的代码示例:
import cv2
import numpy as np
# open video0
# -------> Try replacing cv2.CAP_MSMF with cv2.CAP_FFMPEG):
cap = cv2.VideoCapture(0, cv2.CAP_FFMPEG)
# set width and height
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 340)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# set fps
cap.set(cv2.CAP_PROP_FPS, 30)
# Fetch undecoded RAW video streams
cap.set(cv2.CAP_PROP_FORMAT, -1) # Format of the Mat objects. Set value -1 to fetch undecoded RAW video streams (as Mat 8UC1)
for i in range(10):
# Capture frame-by-frame
ret, frame = cap.read()
if not ret:
break
print('frame.shape = {} frame.dtype = {}'.format(frame.shape, frame.dtype))
cap.release()
如果cv2.CAP_FFMPEG 不起作用,请尝试以下代码示例:
import cv2
import numpy as np
# open video0
cap = cv2.VideoCapture(0, cv2.CAP_MSMF)
# set width and height
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 340)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# set fps
cap.set(cv2.CAP_PROP_FPS, 30)
# -----> Try setting FOURCC and disable RGB conversion:
#########################################################
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('Y','1','6',' '))
cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)
#########################################################
# Fetch undecoded RAW video streams
cap.set(cv2.CAP_PROP_FORMAT, -1) # Format of the Mat objects. Set value -1 to fetch undecoded RAW video streams (as Mat 8UC1)
for i in range(10):
# Capture frame-by-frame
ret, frame = cap.read()
if not ret:
break
print('frame.shape = {} frame.dtype = {}'.format(frame.shape, frame.dtype))
cap.release()
将uint8 帧重新整形为680x240 并保存为img.png:
import cv2
import numpy as np
# open video0
cap = cv2.VideoCapture(0, cv2.CAP_MSMF)
# set width and height
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 340)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
cap.set(cv2.CAP_PROP_FPS, 30) # set fps
# Disable the conversion to BGR by setting FOURCC to Y16 and `CAP_PROP_CONVERT_RGB` to 0.
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('Y','1','6',' '))
cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)
# Fetch undecoded RAW video streams
cap.set(cv2.CAP_PROP_FORMAT, -1) # Format of the Mat objects. Set value -1 to fetch undecoded RAW video streams (as Mat 8UC1)
for i in range(10):
# Capture frame-by-frame
ret, frame = cap.read()
if not ret:
break
cols = 340*2
rows = 240
img = frame.reshape(rows, cols)
cv2.imwrite('img.png', img)
cap.release()
//处理后的图像(热物体)
//使用小端(测试)
//使用 CAP_DSHOW 测试图像(捕获)
//使用 CAP_DSHOW 测试图像(保存)
//680x240 (hand.png)
//680x240 (hand1.png)
//fing 预览
//fing.png
//fing.png
【问题讨论】:
-
请提出建议。
-
运气好吗?
YUV2 streaming不是已知格式... -
@Rotem 还没有。我从传感器获取视频数据,将其转换为 YUV2 格式并发送到 USB(uvc),上面发布的图像显示了我在 windows 上的 hos 应用程序中得到的内容。这里描述的yuv2格式:fourcc.org/pixel-format/yuv-yuy2stackoverflow.com/questions/36228232/yuy2-vs-yuv-422
-
YUY2和YUV2不是一回事...我想知道您的相机是灰度相机,而不是彩色相机。您能否添加一些有关相机(或传感器)型号的详细信息? -
是的,我明白了。我得到的是 YUV2 格式(根据图像)。传感器的实际输出是 raw16,它在内部(在 uvc 描述符中)用 YUV2 GUID 映射并产生 yuv2 输出格式。该红外传感器基于研究导向,因此没有型号。对不起。您能否让我了解这些数据,这实际上是什么以及需要检查更多才能获得图像。谢谢。