2012-02-27 526 views
3

我是新来的蟒蛇。我正在尝试编写一个动作检测应用程序。目前,我正试图让网络摄像头的视频显示在屏幕上。目前的代码现在一开始没有闪烁,但是在任何调整大小之后,闪烁将会回来。任何线索?另外,为什么它没有self.Refresh()在定时器事件中工作,是不是总是发生绘画事件,除非框架被最小化?提前致谢。闪烁wxpython显示摄像头视频

import wx 
import cv 

class LiveFrame(wx.Frame): 

    fps = 30 


    def __init__(self, parent): 
    wx.Frame.__init__(self, parent, -1, title="Live Camera Feed") 

    self.SetDoubleBuffered(True) 
    self.capture = None 
    self.bmp = None 
    #self.displayPanel = wx.Panel(self,-1) 

    #set up camaera init 
    self.capture = cv.CaptureFromCAM(0) 
    frame = cv.QueryFrame(self.capture) 
    if frame: 
     cv.CvtColor(frame,frame,cv.CV_BGR2RGB) 
     self.bmp = wx.BitmapFromBuffer(frame.width,frame.height,frame.tostring()) 
     self.SetSize((frame.width,frame.height)) 
    self.displayPanel = wx.Panel(self,-1) 

    self.fpstimer = wx.Timer(self) 
    self.fpstimer.Start(1000/self.fps) 
    self.Bind(wx.EVT_TIMER, self.onNextFrame, self.fpstimer) 
    self.Bind(wx.EVT_PAINT, self.onPaint) 

    self.Show(True) 

    def updateVideo(self): 
    frame = cv.QueryFrame(self.capture) 
    if frame: 
     cv.CvtColor(frame,frame,cv.CV_BGR2RGB) 
     self.bmp.CopyFromBuffer(frame.tostring()) 
     self.Refresh() 


    def onNextFrame(self,evt): 
    self.updateVideo() 
    #self.Refresh() 
    evt.Skip() 

    def onPaint(self,evt): 
    #if self.bmp: 
    wx.BufferedPaintDC(self.displayPanel, self.bmp) 

    evt.Skip() 

if __name__=="__main__": 
    app = wx.App() 
    app.RestoreStdio() 
    LiveFrame(None) 
    app.MainLoop() 

回答

4

我找到了解决这个问题的办法。闪烁来自面板清除其背景。我不得不创建一个面板实例,并有EVT_ERASE_BACKGROUND旁路。另一件事是,我必须将摄像头例程放在该面板内,并在面板上绘制BufferPaintedDC。出于某种原因,如果wx.BufferedPaintedDC正在从帧中绘制到self.displaypanel,则闪烁仍然存在。

+0

很多。我只是遇到同样的问题,并通过你的方式解决! – 2012-09-04 10:41:39

1

当你绘图时,你只需要调用刷新。这是一个要求。我不记得为什么。为了摆脱闪烁,你可能想要阅读DoubleBuffering:http://wiki.wxpython.org/DoubleBufferedDrawing

或者你也许可以使用mplayer控件。这里有一个例子:http://www.blog.pythonlibrary.org/2010/07/24/wxpython-creating-a-simple-media-player/

+0

是不是我已经使用wx.BufferedPaintDC的doublebuffering?还是我用它错了?在我使用BufferedPaintDC并更新静态位图之前,当我运行代码时它正在闪烁。现在使用BufferedPaintDC,它不会闪烁直到窗口被调整大小,或最小化/最大化。 – 2012-02-27 16:33:40

+0

我不确定你是否正确使用它,所以我想我会把你链接到wiki,以便你可以比较。 wxPython Google Group也非常有帮助。 – 2012-02-27 17:24:22