2012-02-27 2 views
3

Я новичок в python. Я пытаюсь написать приложение обнаружения движения. В настоящее время я пытаюсь отобразить видео на веб-камерах на экране. Текущий код прямо сейчас не имеет мерцания, но после любого изменения размера мерцание вернется. Любая подсказка? Кроме того, почему он не работает без 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

tks много. я просто отвечаю на ту же проблему и решил по-вашему! –

1

Когда вы рисуете, вам просто нужно позвонить в Refresh. Это требование. Я не помню, почему. Чтобы избавиться от мерцания, вы, вероятно, захотите прочитать на DoubleBuffering: http://wiki.wxpython.org/DoubleBufferedDrawing

Или, может быть, вы можете использовать элемент управления mplayer. Вот пример: http://www.blog.pythonlibrary.org/2010/07/24/wxpython-creating-a-simple-media-player/

+0

Разве я не использую doublebuffering с wx.BufferedPaintDC? Или я использую это неправильно? Прежде чем использовать BufferedPaintDC и просто обновить staticbitmap, он мерцал сразу, когда я запускаю код. Теперь с BufferedPaintDC он не будет мерцать, пока окно не изменится, или не уменьшит/не максимизирует. –

+0

Я не был уверен, что вы использовали его правильно, поэтому я думал, что свяжу вас с вики, чтобы вы могли сравнить. Команда wxPython Google также очень полезна. –

Смежные вопросы