Skip to main content
 首页 » 编程设计

python之在 python (pygtk) 中从网络摄像头监视器拍摄快照

2025年05月04日14daizhj

我有这段代码可以用 python 和 pygtk 监控网络摄像头。 问题是,我如何使用这段代码拍摄快照?:

#!/usr/bin/env python 
 
import sys, os 
import pygtk, gtk, gobject 
import pygst 
pygst.require("0.10") 
import gst 
import time 
 
class WebCam: 
    def __init__(self): 
        window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
        window.set_title("Webcam-Viewer") 
        window.set_default_size(1024, 768) 
        window.connect("destroy", gtk.main_quit, "WM destroy") 
        vbox = gtk.VBox() 
        window.add(vbox) 
        self.movie_window = gtk.DrawingArea() 
        vbox.add(self.movie_window) 
        hbox = gtk.HBox() 
        vbox.pack_start(hbox, False) 
        hbox.set_border_width(10) 
        hbox.pack_start(gtk.Label()) 
        self.button = gtk.Button("Start") 
        self.button.connect("clicked", self.start_stop) 
        hbox.pack_start(self.button, False) 
 
        self.button3 = gtk.Button("SnapShot") 
        self.button3.connect("clicked", self.take_snapshot) 
        hbox.pack_start(self.button3, False) 
 
        self.button2 = gtk.Button("Quit") 
        self.button2.connect("clicked", self.exit) 
        hbox.pack_start(self.button2, False) 
        hbox.add(gtk.Label()) 
 
        # Set up the gstreamer pipeline 
        self.player = gst.parse_launch ("v4l2src ! autovideosink") 
 
        bus = self.player.get_bus() 
        bus.add_signal_watch() 
        bus.enable_sync_message_emission() 
        bus.connect("message", self.on_message) 
        bus.connect("sync-message::element", self.on_sync_message) 
 
        window.set_border_width(3) 
        window.set_position(gtk.WIN_POS_CENTER_ALWAYS) 
        window.show_all() 
 
    def take_snapshot(self,widget): 
        filename = str(time.time()) + ".jpg"      
        #self.movie_window.window.get_image(0, 0, 500, 400) 
        print "Snapshot" 
 
    def start_stop(self, w): 
        if self.button.get_label() == "Start": 
            self.button.set_label("Stop") 
            self.player.set_state(gst.STATE_PLAYING) 
        else: 
            self.player.set_state(gst.STATE_NULL) 
            self.button.set_label("Start") 
 
    def exit(self, widget, data=None): 
        gtk.main_quit() 
 
    def on_message(self, bus, message): 
        t = message.type 
        if t == gst.MESSAGE_EOS: 
            self.player.set_state(gst.STATE_NULL) 
            self.button.set_label("Start") 
        elif t == gst.MESSAGE_ERROR: 
            err, debug = message.parse_error() 
            print "Error: %s" % err, debug 
            self.player.set_state(gst.STATE_NULL) 
            self.button.set_label("Start") 
 
    def on_sync_message(self, bus, message): 
        if message.structure is None: 
            return 
        message_name = message.structure.get_name() 
        if message_name == "prepare-xwindow-id": 
            # Assign the viewport 
            imagesink = message.src 
            imagesink.set_property("force-aspect-ratio", True) 
            imagesink.set_xwindow_id(self.movie_window.window.xid) 
 
if __name__ == "__main__": 
    try: 
        a = WebCam() 
        gtk.gdk.threads_init() 
        gtk.main() 
    except KeyboardInterrupt: 
        pass     

谢谢大家

请您参考如下方法:

我错过了问题的重点。有一个 take_snapshot 函数,其中实际拍摄快照的位被注释掉了。将您的代码修改为如下所示

def take_snapshot(self,widget): 
  filename = str(time.time()) + ".jpg"      
  pixbuf = gtk.gdk.Pixbuf.get_from_drawable(self.movie_window.window, self.movie_window.window.get_colormap(), 0, 0, 0,0 500, 400) 
  pixbuf.save(filename, "jpeg", {"quality":"100"}) 

应该拍摄快照并保存当前时间的图像