我正在尝试使用 ffmpeg 命令获取帧并使用 opencv 函数 cv2.imshow() 显示。这个片段给出了 RTSP 流链接上的黑白图像。输出如下链接[FFmpeg链接的输出]。
我试过 ffplay 命令,但它给出了直接图像。我无法访问框架或应用图像处理。
Output of 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
pipe.stdout.flush()
IMO 是一个危险的举动,因为缓冲区可能有部分帧。考虑设置bufsize
以字节为单位的帧大小的精确整数倍。 -r
匹配处理速率(避免从 ffmpeg 到 python 的无关数据传输)关于python - 使用 FFMPEG 命令读取帧并使用 opencv 中的 inshow 函数显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71349914/