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

发布于 2025-01-12 00:17:45 字数 891 浏览 0 评论 0原文

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

I am trying to get the frame using the ffmpeg command and show using the opencv function cv2.imshow(). This snippet gives the black and white image on the RTSP Stream link . Output is given below link [ output of FFmpeg link].
I have tried the ffplay command but it gives the direct image . i am not able to access the frame or apply the image processing.

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()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

十年不长 2025-01-19 00:17:45

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

其他提示:

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

You're using a wrong output format, it should be -f rawvideo. This should fix your primary problem. Current -f image2pipe wraps the RGB data in an image format (donno what it is maybe BMP as rawvideo codec is being used?) thus not shown correctly.

Other tips:

  • If your data is grayscale, use -pix_fmt gray and read 420*360 bytes at a time.
  • Don't know the difference in speed, but I use np.frombuffer instead of np.fromstring
  • pipe.stdout.flush() is a dangerous move IMO as the buffer may have a partial frame. Consider setting bufsize to be an exact integer multiple of framesize in bytes.
  • If you are expecting processing to take much longer than input frame rate, you may want to reduce the output framerate -r to match the processing rate (to avoid extraneous data transfer from ffmpeg to python)
何必那么矫情 2025-01-19 00:17:45

pix_fmt 的值应为 bgr24

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

现在 fromstring 已被弃用。您应该使用frombuffer

The vaue of pix_fmt should be bgr24.

The default pixel format of OpenCV is BGR. And the equivalent format on ffmpeg is bgr24.

And right now fromstring is deprecated. You should use frombuffer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文