使用FFMPEG命令读取帧,并使用opencv中的inshow函数进行显示



我正在尝试使用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的无关数据传输(

最新更新