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

标签 python opencv ffmpeg ffplay

我正在尝试使用 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/

    相关文章:

    python ssh 密码提示

    c++ - 如何在 OpenCV 中处理 vector (数学)

    opencv - ffmpeg 失败 - 455 方法在此状态下无效

    ios - ARKit 和 3D 对象/图像识别

    android - 如何为 Android 编译最新的 FFmpeg 库?

    ffmpeg归一化波形

    python - 如何在不创建新文件的情况下使用 ffmpeg/avconv 更改元数据?

    python : How to make different thread read different sections of my file

    python - 在 postgreSQL 中启用查询缓存以提高性能

    python - Django Iframe Safari 修复