我正在尝试使用 ffmpeg 命令获取帧并使用 opencv 函数 cv2.imshow() 进行显示。此片段给出了 RTSP Stream 链接上的黑白图像。输出在链接[FFmpeg 链接的输出]下面给出。 我尝试过 ffplay 命令,但它给出了直接图像。我无法访问框架或应用图像处理。
import cv2
import subprocess as sp
command = [ 'C:/ffmpeg/ffmpeg.exe',
'-i', 'rtsp://192.168.1.12/media/video2',
'-f', 'image2pipe',
'-pix_fmt', 'rgb24',
'-vcodec', 'rawvideo', '-']
import numpy
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize=10**8)
while True:
raw_image = pipe.stdout.read(420*360*3)
# transform the byte read into a numpy array
image = numpy.fromstring(raw_image, dtype='uint8')
image = image.reshape((360,420,3))
cv2.imshow('hello',image)
cv2.waitKey(1)
# throw away the data in the pipe's buffer.
pipe.stdout.flush()
您使用的输出格式错误,应该是
-f rawvideo
。这应该可以解决您的主要问题。当前 -f image2pipe
以图像格式包装 RGB 数据(不知道它是什么,可能是 BMP,因为正在使用 rawvideo
编解码器?),因此无法正确显示。
其他提示:
-pix_fmt gray
并一次读取 420*360
字节。np.frombuffer
代替np.fromstring
pipe.stdout.flush()
是一个危险的举动,因为缓冲区可能有部分帧。考虑将 bufsize
设置为帧大小(以字节为单位)的精确整数倍。-r
以匹配处理速率(以避免从 ffmpeg 到 python 的无关数据传输)pix_fmt
的值应该是bgr24
。
OpenCV默认的像素格式是BGR。 ffmpeg 上的等效格式是
bgr24
。