Мерцание с wxpython, отображающим видео с веб-камеры - PullRequest
3 голосов
/ 27 февраля 2012

Я новичок в питоне.Я пытаюсь написать приложение для обнаружения движения.В настоящее время я пытаюсь вывести видео с веб-камеры на экран.Текущий код сейчас не имеет мерцания сначала, но после любого изменения размера мерцание вернется.Любая подсказка?Кроме того, почему он не работает без self.Refresh () в событии timer, не происходит ли событие рисования всегда, пока кадр не свернут?Заранее спасибо.

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()

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Я нашел решение этой проблемы.Мерцание пришло от панели, очищающей ее фон.Мне пришлось создать экземпляр панели и сделать обход EVT_ERASE_BACKGROUND.Другое дело, что мне пришлось поместить подпрограмму веб-камеры в эту панель и нарисовать BufferPaintedDC на самой панели.По какой-то причине мерцание все еще сохраняется, если wx.BufferedPaintedDC рисует из фрейма в self.displaypanel.

1 голос
/ 27 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...