Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用gstreamer快速捕获图像_Python_Python 2.7_Gstreamer_Raspberry Pi3 - Fatal编程技术网

Python 如何使用gstreamer快速捕获图像

Python 如何使用gstreamer快速捕获图像,python,python-2.7,gstreamer,raspberry-pi3,Python,Python 2.7,Gstreamer,Raspberry Pi3,我想以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

我想以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)

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

v4l2src!视频转换!时钟覆盖!时间重叠!JPEG! fakesink name=sink

然后在take_photo()中,抓取伪造墨水,访问
last sample
属性。从样本中提取数据并将其渲染到所需文件

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

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

v4l2src!阀门名称=阀门压降=真!视频转换!时钟覆盖!时间重叠!JPEG! fakesink name=sink

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


也可能是您试图对帧速率执行的某些操作导致了问题。我认为您希望以所需的分辨率以尽可能高的帧速率拍摄视频,否则可能会内置自然延迟,例如,如果您的帧速率为5/1,则为200ms。

我建议尝试使用以下形式的管道:

v4l2src!视频转换!时钟覆盖!时间重叠!JPEG! fakesink name=sink

然后在take_photo()中,抓取伪造墨水,访问
last sample
属性。从样本中提取数据并将其渲染到所需文件

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

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

v4l2src!阀门名称=阀门压降=真!视频转换!时钟覆盖!时间重叠!JPEG! fakesink name=sink

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


也可能是您试图对帧速率执行的某些操作导致了问题。我认为您希望以所需的分辨率以尽可能高的帧速率接收视频,否则可能会内置一个自然延迟,例如,如果您的帧速率为5/1,则为200ms。

RPI并不完全是CPU性能的高性能平台。在这里,jpeg编码可能需要相当多的CPU时间。请尝试将图像另存为原始位图图像,并查看它是否有助于您的运行时间。如果让程序始终运行,然后根据用户输入编写JPEG,您的运气可能会更好。其中的一些800毫秒将是启动GStreamer、连接到v4l2等操作。您还可以看到v4l2src是否可以直接为您提供jpeg(它确实具有caps图像/jpeg).@mpr您知道如何使用python将管道更改为动态吗?@mpr@mpr如果我将管道更改为动态,那么它可以更快地捕获映像吗?RPI并不是CPU性能的高性能平台。在这里,jpeg编码可能需要相当多的CPU时间。请尝试将图像另存为原始位图图像,并查看它是否有助于您的运行时间。如果让程序始终运行,然后根据用户输入编写JPEG,您的运气可能会更好。其中的一些800毫秒将是启动GStreamer、连接到v4l2等操作。您还可以看到v4l2src是否可以直接为您提供jpeg(它确实具有caps图像/jpeg)@mpr您知道如何使用python将管道更改为动态吗?@mpr@mpr如果我将管道更改为动态,那么它可以更快地捕获图像吗?但我需要执行动态管道,因为我也需要执行视频。你知道如何使用python吗?因为我找不到任何可以使用python进行动态管道的源代码。如果你想在stackoverflow上获得好的帮助,你必须努力将你的问题分解。在最初的问题中,您甚至没有提到除了进行JPEG捕获之外还要播放视频。我建议查看
tee
元素,或者执行单独的过程来获取原始视频缓冲区并将其转换为jpeg。但是1.0中不存在最后一个示例属性,但我需要执行动态管道,因为我也需要执行视频。你知道如何使用python吗?因为我找不到任何可以使用python进行动态管道的源代码。如果你想在stackoverflow上获得好的帮助,你必须努力将你的问题分解。在最初的问题中,您甚至没有提到除了进行JPEG捕获之外还要播放视频。我建议查看
tee
元素,或者执行单独的过程来获取原始视频缓冲区并将其转换为jpeg