Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxpython显示网络摄像头视频时闪烁_Python_Opencv_Wxpython_Webcam - Fatal编程技术网

wxpython显示网络摄像头视频时闪烁

wxpython显示网络摄像头视频时闪烁,python,opencv,wxpython,webcam,Python,Opencv,Wxpython,Webcam,我是python新手。我正在尝试编写一个运动检测应用程序。目前,我正在尝试让网络摄像头视频显示在屏幕上。当前代码现在一开始没有闪烁,但在任何调整大小后,闪烁会回来。有线索吗?另外,为什么在计时器事件中没有self.Refresh()时它就不能工作,除非帧最小化,否则绘制事件不是总是发生吗?提前谢谢 import wx import cv class LiveFrame(wx.Frame): fps = 30 def __init__(self, parent): wx.F

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

在绘图时,只需调用Refresh。这是一项要求。我不记得为什么了。要消除闪烁,您可能需要阅读双缓冲:


或者你可以使用mplayer控件。这里有一个例子:

我找到了这个问题的解决方案。闪烁的声音来自面板清除背景的声音。我必须创建一个面板实例,并使其EVT_擦除_背景旁路。另一件事是,我必须将网络摄像头例程放在面板内,并在面板上绘制BufferPaintedDC绘图。由于某些原因,如果wx.BufferedPaintedDC从帧绘制到self.displaypanel,闪烁仍然存在

我不是已经对wx.BufferedPaintDC使用了双缓冲吗?还是我用错了??在我使用BufferedPaintDC并更新staticbitmap之前,当我运行代码时,它一直在闪烁。现在使用BufferedPaintDC,在窗口调整大小或最小化/最大化之前,它不会闪烁。我不确定您是否正确使用了它,所以我想我会将您链接到wiki,以便您进行比较。wxPython谷歌小组也很有帮助。我只是遇到了同样的问题,用你的方式解决了!