我正在尝试使用ffmpeg命令获取帧,并使用opencv函数cv2.imshow((进行显示。这个片段在RTSP流链接上提供了黑白图像。输出在链接[FFmpeg链接的输出]下面给出。我尝试过ffplay命令,但它给出了直接的图像。我无法访问帧或应用图像处理。
FFMPEG 的输出
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
- CCD_ 8是危险的移动IMO,因为缓冲器可能具有部分帧。考虑将
bufsize
设置为以字节为单位的帧大小的精确整数倍 - 如果您希望处理时间比输入帧速率长得多,则可能需要降低输出帧速率
-r
以匹配处理速率(以避免从ffmpeg到python的无关数据传输(