我想将我的网络摄像头的opencv视频流集成到比highgui提供更复杂的GUI中,仅有几个按钮和其他功能,但实际上并不是那么简单。我找不到任何可以开始设计GUI的基础示例。
我尝试将此代码转换为新的opencv接口,结果非常糟糕。我对opencv、numpy和GUI设计都还很陌生。有时会流视频,但大多数情况下它只是卡在那里。我猜想我的一个错误可能在于wx.BitmapFromBuffer(col, row, img),因为在旧版本中它们使用了pil图像格式,现在它正在使用numpy数组,因此在原始代码中,他们使用了pil函数“imageData”,而不是像我一样直接传递numpy数组。
非常感谢任何帮助。
![color_channels_pic](https://istack.dev59.com/p4DXq.webp)
这是我转换的代码。
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()
cvtColor
不是原地操作,所以您必须将其结果重新分配给img
。 - mmgpf(x)
,你必须将结果分配给某个变量以保存结果。cvtColor
就是这样一个函数。 - mmgp