, , , , wx.Python 2.8. Phoenix (> 4.00) . , ? :
import numpy as np
import cv2
import wx
import sys, time
wxversion = wx.__version__
class webcamPanel(wx.Panel):
def __init__(self, parent, camera, fps=10, pause=False, mirror=False):
wx.Panel.__init__(self, parent)
self.camera = camera
return_value, self.frame = self.camera.read()
height, width = self.frame.shape[:2]
self.frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
if mirror:
self.frame = cv2.flip(self.frame, 1)
if wxversion[0] == "2":
self.bmp = wx.BitmapFromBuffer(width, height, self.frame)
else:
self.bmp = wx.Bitmap.FromBuffer(width, height, self.frame)
self.SetSize((width,height))
self.pause = pause
self.mirror = mirror
self.timer = wx.Timer(self)
self.timer.Start(1000./fps)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_TIMER, self.NextFrame)
def GetState(self):
return self.pause
def Kill(self):
self.Pause()
self.timer.Stop()
def Mirror(self, mirror=None):
if mirror is None:
self.mirror = not self.mirror
else:
self.mirror = mirror
def OnPaint(self, e):
dc = wx.BufferedPaintDC(self)
dc.DrawBitmap(self.bmp, 0, 0)
def Pause(self):
self.pause = True
def Start(self):
self.pause = False
def NextFrame(self, e):
if not self.pause:
return_value, self.frame = self.camera.read()
if return_value:
self.frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
if self.mirror:
self.frame = cv2.flip(self.frame, 1)
self.bmp.CopyFromBuffer(self.frame)
self.Refresh()
class mainWindow(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, style=wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN)
self.Bind(wx.EVT_CLOSE, self.CloseApp)
# Creating any menubar.
filemenu= wx.Menu()
filemenu.Append(101, "Open", "Open")
filemenu.Append(102, "Save", "Save")
filemenu.Append(wx.ID_ABOUT, "About","About")
filemenu.Append(wx.ID_EXIT,"Exit","Close")
menuBar = wx.MenuBar()
menuBar.Append(filemenu,"File")
self.SetMenuBar(menuBar)
#main ui
self.camera = cv2.VideoCapture(0)
return_value, frame = self.camera.read()
self.mirror = True
self.height, self.width, _ = frame.shape
self.iteration = 0
self.webcampanel = webcamPanel(self, self.camera, mirror=self.mirror)
self.button = wx.Button(self, label="Take Picture!")
self.button1 = wx.Button(self, label="Toggle Camera on/off")
self.button2 = wx.Button(self, label="Mirror")
main_window_sizer = wx.BoxSizer(wx.VERTICAL)
main_window_sizer.Add(self.webcampanel, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 10)
buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
buttonSizer.Add(self.button, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 10)
buttonSizer.Add(self.button1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 10)
buttonSizer.Add(self.button2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 10)
main_window_sizer.Add(buttonSizer, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 10)
self.SetSizer(main_window_sizer)
main_window_sizer.Fit(self)
self.Bind(wx.EVT_BUTTON, self.take_picture, self.button)
self.Bind(wx.EVT_BUTTON, self.toggle, self.button1)
self.Bind(wx.EVT_BUTTON, self.toggle_mirror, self.button2)
def toggle_mirror(self, event):
self.webcampanel.Mirror()
def take_picture(self, e):
image = self.webcampanel.frame
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow('Snapshot!', image)
def toggle(self, event):
if self.webcampanel.GetState():
self.webcampanel.Start()
else:
self.webcampanel.Pause()
def CloseApp(self, event):
self.webcampanel.Kill()
time.sleep(.2)
self.camera.release()
cv2.destroyAllWindows()
self.Destroy()
sys.exit()
if __name__ == '__main__':
app = wx.App()
window = mainWindow()
window.Show()
window.Maximize()
app.MainLoop()