我只是想将来自我的网络摄像头的 opencv 视频流集成到一个比 highgui 所能提供的更复杂的 gui 中,没有什么特别的,只是几个按钮和其他东西,但事实证明它并不是那么微不足道。我找不到任何可以开始设计 gui 的基本示例。我尝试将此代码转换为新的 opencv 接口,结果很差。我是 opencv、numpy 和 gui 设计的新手。有时确实会流式传输视频,但大多数时候它只是挂在那里。我想我的一个错误可能是在 wx.BitmapFromBuffer(col, row, img) 中,因为在旧版本中他们使用 pil 图像格式,现在它使用 numpy 数组,所以在原始代码中使用了 pil 函数“imageData”,而不是正如我正在做的那样直接传递numpy数组。任何帮助它'
这是我的代码转换。
import wx
import cv2
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.displayPanel = wx.Panel(self)
self.displayPanel.SetSize(wx.Size(800,640))
self.cam = cv2.VideoCapture(1)
self.cam.set(3, 640)
self.cam.set(4, 480)
ret, img = self.cam.read()
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
row, col, x = img.shape
self.SetSize((col,row))
self.bmp = wx.BitmapFromBuffer(col, row, img)
self.displayPanel.Bind(wx.EVT_PAINT, self.onPaint)
self.playTimer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.onNextFrame)
self.playTimer.Start(1000/15)
def onPaint(self, evt):
if self.bmp:
dc = wx.BufferedPaintDC(self.displayPanel)
self.PrepareDC(dc)
dc.DrawBitmap(self.bmp, 0, 0, True)
evt.Skip()
def onNextFrame(self, evt):
ret, img = self.cam.read()
if ret == True:
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.bmp.CopyFromBuffer(img)
self.displayPanel.Refresh()
evt.Skip()
if __name__=="__main__":
app = wx.App()
MyFrame(None).Show()
app.MainLoop()