如何快速使用gstream捕捉图像

2024-06-01 03:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在3亿毫秒或更短的时间内捕捉到图像。但是我用下面的代码以800毫秒的速度捕捉到了这张图像。有人能帮我解决这个问题吗?我试了很长时间,但不知道为什么我不能捕捉到3亿毫秒的图像。我用树莓皮捕捉图像。在

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject #,Gtk
from gi.repository import Gst as gst
class TakePhoto:
  def __init__(self):
    GObject.threads_init()
    gst.init(None)
    self.pipeline = gst.Pipeline()
    self.video_source = gst.ElementFactory.make('v4l2src', 'video_source')
    self.video_source.set_property("num-buffers", 1)
    self.vconvert = gst.ElementFactory.make('videoconvert', 'vconvert')
    self.clock = gst.ElementFactory.make('clockoverlay', 'clock')
    self.timer= gst.ElementFactory.make('timeoverlay','timer')
    self.vrate = gst.ElementFactory.make('videorate', 'vrate')
    self.sconvert = gst.ElementFactory.make('videoconvert', 'sconvert')
    self.png = gst.ElementFactory.make('jpegenc', 'png')
    self.multi_sink = gst.ElementFactory.make('multifilesink', 'multi_sink')

    self.caps = gst.caps_from_string ("video/x-raw,format=RGB,width=800,height=600,framerate=5/1")
    self.timer.set_property('valignment','bottom')
    self.timer.set_property('halignment','right')
    self.clock.set_property('time-format','%Y/%m/%d %H:%M:%S')
    self.clock.set_property('valignment','bottom')
    self.caps1 = gst.caps_from_string("video/x-raw,framerate=1/1")
    self.png.set_property('idct-method',1)
    self.multi_sink.set_property('location','/home/pi/frame.jpeg')
    self.filter = gst.ElementFactory.make("capsfilter", "filter")
    self.filter.set_property("caps", self.caps)
    self.filter1 = gst.ElementFactory.make("capsfilter", "filter1")
    self.filter1.set_property("caps", self.caps1)
    self.pipeline.add(self.video_source)
    self.pipeline.add(self.vconvert)
    self.pipeline.add(self.timer)
    self.pipeline.add(self.clock)
    self.pipeline.add(self.filter)
    self.pipeline.add(self.vrate)
    self.pipeline.add(self.filter1)
    self.pipeline.add(self.sconvert)
    self.pipeline.add(self.png)
    self.pipeline.add(self.multi_sink)
    self.video_source.link(self.filter)
    self.filter.link(self.vconvert)
    self.vconvert.link(self.timer)
    self.timer.link(self.clock)
    self.clock.link(self.vrate)
    self.vrate.link(self.filter1)
    self.filter1.link(self.sconvert)
    self.sconvert.link(self.png)
    self.png.link(self.multi_sink)

def take_photo(self): #this is reusable
    bus = self.pipeline.get_bus()
    self.pipeline.set_state(gst.State.PLAYING)
    print "Capture started"
    msg = bus.timed_pop_filtered(gst.CLOCK_TIME_NONE,gst.MessageType.ERROR | gst.MessageType.EOS)
    #print msg

    self.pipeline.set_state(gst.State.READY)

Tags: selfaddmakepipelinepngvideolinkproperty
1条回答
网友
1楼 · 发布于 2024-06-01 03:27:44

我建议尝试使用这种形式的管道:

v4l2src ! videoconvert ! clockoverlay ! timeoverlay ! jpegenc ! fakesink name=sink

然后在take\u photo()中,获取fakesink,访问last-sample属性。从示例中提取数据并将其呈现到所需的文件中。在

我不知道这会给你多少时间,但至少你不会有任何管道启动时间,v4l2src元素也不会每次都重新访问相机。在

如果可以的话,我会回去给管道加一个阀门:

v4l2src ! valve name=valve drop=true ! videoconvert ! clockoverlay ! timeoverlay ! jpegenc ! fakesink name=sink

…并根据需要启用/禁用该功能,以便在不需要屏幕截图时减少Pi上的净负载。在

也可能有一些事情,你试图做的帧率,导致问题。我想你应该以最高的帧速率以所需的分辨率拍摄视频,否则可能会有一个自然的延迟,比如说200毫秒,如果你的帧速率是5/1。在

相关问题 更多 >