【问题标题】:Flicker with wxpython displaying webcam videowxpython 闪烁显示网络摄像头视频
【发布时间】:2012-02-27 05:55:32
【问题描述】:

我是 python 新手。我正在尝试编写一个运动检测应用程序。目前,我正在尝试让网络摄像头视频显示在屏幕上。当前代码现在一开始没有闪烁,但是在任何调整大小后,闪烁都会回来。有什么线索吗?另外,为什么在计时器事件中没有 self.Refresh() 就不能工作,除非帧被最小化,否则绘制事件是否总是发生?提前致谢。

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

【问题讨论】:

    标签: python opencv wxpython webcam


    【解决方案1】:

    我已经找到了解决这个问题的方法。闪烁来自清除背景的面板。我必须创建一个面板实例并绕过它的 EVT_ERASE_BACKGROUND。另一件事是我必须将网络摄像头例程放在该面板中,并在面板本身上绘制 BufferPaintedDC。出于某种原因,如果 wx.BufferedPaintedDC 从框架绘制到 self.displaypanel ,闪烁仍然存在。

    【讨论】:

    • tks 很多。我刚遇到同样的问题,按照你的方法解决了!
    【解决方案2】:

    在绘图时,您只需调用 Refresh。这是一个要求。我不记得为什么。要消除闪烁,您可能需要阅读 DoubleBuffering:http://wiki.wxpython.org/DoubleBufferedDrawing

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

    【讨论】:

    • 我不是已经在 wx.BufferedPaintDC 中使用双缓冲了吗?还是我用错了??在我使用 BufferedPaintDC 并仅更新静态位图之前,当我运行代码时它正在闪烁。现在使用 BufferedPaintDC,在调整窗口大小或最小化/最大化之前它不会闪烁。
    • 我不确定您是否正确使用它,所以我想我会将您链接到 wiki,以便您进行比较。 wxPython Google Group 也很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多