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

问题描述 投票:0回答:2

我正在尝试使用 ffmpeg 命令获取帧并使用 opencv 函数 cv2.imshow() 进行显示。此片段给出了 RTSP Stream 链接上的黑白图像。输出在链接[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()
python opencv ffmpeg ffplay
2个回答
0
投票

您使用的输出格式错误,应该是

-f rawvideo
。这应该可以解决您的主要问题。当前
-f image2pipe
以图像格式包装 RGB 数据(不知道它是什么,可能是 BMP,因为正在使用
rawvideo
编解码器?),因此无法正确显示。

其他提示:

  • 如果您的数据是灰度数据,请使用
    -pix_fmt gray
    并一次读取
    420*360
    字节。
  • 不知道速度有什么区别,但我用
    np.frombuffer
    代替
    np.fromstring
  • 在我看来,
  • pipe.stdout.flush()
    是一个危险的举动,因为缓冲区可能有部分帧。考虑将
    bufsize
    设置为帧大小(以字节为单位)的精确整数倍。
  • 如果您预计处理时间比输入帧速率长得多,您可能需要降低输出帧速率
    -r
    以匹配处理速率(以避免从 ffmpeg 到 python 的无关数据传输)

0
投票

pix_fmt
的值应该是
bgr24

OpenCV默认的像素格式是BGR。 ffmpeg 上的等效格式是

bgr24

© www.soinside.com 2019 - 2024. All rights reserved.