Webカメラからのopencvビデオストリームを、highguiが提供できるよりも複雑なGUIに統合したかっただけです。ボタンをいくつか追加するだけで派手なものはありませんが、それほど些細なことではないことが証明されています。GUIの設計を開始できる基本的な例が見つかりません。このコードを新しいopencvインターフェースに変換しようとしましたが、結果はかなり悪くなりました。私はopencv、numpy、GUIデザインの初心者です。ある時間はビデオをストリーミングしますが、ほとんどの場合、それはただそこにぶら下がっています。以前のバージョンではpil画像形式を使用していましたが、現在はnumpy配列を使用しているため、元のコードではpil関数「imageData」を使用していたため、私の1つの間違いはwx.BitmapFromBuffer(col、row、img)にあると思います。私がしているように、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()