2013-02-11 12 views
5

के साथ ओपनसीवी एकीकरण मैं अपने वेब कैम से ओपनसीवी वीडियो स्ट्रीम को हाईगुई की पेशकश के मुकाबले एक और जटिल गुई में एकीकृत करना चाहता था, कुछ बटन और कुछ और नहीं, हालांकि यह छोटा नहीं साबित हुआ है। मुझे कोई आधार उदाहरण नहीं मिल रहा है जिससे मैं गुई को डिजाइन करना शुरू कर सकता हूं। मैंने इस code को नए ओपनसीवी इंटरफेस में काफी खराब परिणाम के साथ बदलने की कोशिश की। मैं opencv, numpy और gui डिजाइन के लिए एक नया हूँ। कुछ समय वीडियो स्ट्रीम करता है लेकिन ज्यादातर समय यह बस वहां लटकता है। मुझे लगता है कि मेरी एक गलती Wx.BitmapFromBuffer (col, row, img) में हो सकती है क्योंकि पुराने संस्करण में उन्होंने पायल छवि प्रारूप का उपयोग किया था और अब यह numpy arrays का उपयोग कर रहा है, इसलिए मूल कोड में पायल फ़ंक्शन "imageData" का उपयोग किया गया था जैसा कि मैं कर रहा हूँ सीधे numpy सरणी गुजर रहा है। किसी भी मदद की वास्तव में सराहना की है। color_channels_picwxpython

यह मेरा कोड रूपांतरण है।

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

आपका कोड मेरे लिए काम नहीं करता है, लेकिन बाद नाबालिग समायोजित कर देता है तब भी वह अच्छे से करता है। समस्या मैं देख रहा हूँ यह है कि, उदाहरण के लिए, जब मैं खिड़की का आकार बदलता हूं जब तक कि मैं आकार बदलना बंद नहीं कर देता। लेकिन अगर मैं खिड़की को नहीं छूता तो यह ठीक हो जाता है। क्या आप फ्रेम को प्रदर्शित करने से परे कुछ और कर रहे हैं? – mmgp

+0

@mmgp अगर आप टिप्पणी करते हैं तो आप सही हैं दो लाइनें जहां मैंने आकार निर्धारित किया है, यह काम करता है हालांकि मुझे लगता है कि मैं रंगीन चैनल खो रहा हूं। मैंने चित्र संलग्न किया है। – wind85

+2

रंगों के संबंध में, 'cvtcolor' जगह में नहीं होता है, इसलिए आपको इसके परिणाम को ' img' – mmgp

उत्तर

8

निम्नलिखित उदाहरण कोड ओएस एक्स के तहत मेरे लिए ठीक काम करता है, लेकिन मुझे प्लेटफॉर्म पर Wx के साथ छोटी आश्चर्य है। यह लगभग एक ही कोड है, अंतर यह है कि cvtColor का परिणाम फिर से सौंप दिया गया है, और wx.Panel (जो महत्वपूर्ण हिस्सा है) का उप-वर्ग जोड़ा गया था।

import wx 
import cv, cv2 

class ShowCapture(wx.Panel): 
    def __init__(self, parent, capture, fps=15): 
     wx.Panel.__init__(self, parent) 

     self.capture = capture 
     ret, frame = self.capture.read() 

     height, width = frame.shape[:2] 
     parent.SetSize((width, height)) 
     frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 

     self.bmp = wx.BitmapFromBuffer(width, height, frame) 

     self.timer = wx.Timer(self) 
     self.timer.Start(1000./fps) 

     self.Bind(wx.EVT_PAINT, self.OnPaint) 
     self.Bind(wx.EVT_TIMER, self.NextFrame) 


    def OnPaint(self, evt): 
     dc = wx.BufferedPaintDC(self) 
     dc.DrawBitmap(self.bmp, 0, 0) 

    def NextFrame(self, event): 
     ret, frame = self.capture.read() 
     if ret: 
      frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
      self.bmp.CopyFromBuffer(frame) 
      self.Refresh() 


capture = cv2.VideoCapture(0) 
capture.set(cv.CV_CAP_PROP_FRAME_WIDTH, 320) 
capture.set(cv.CV_CAP_PROP_FRAME_HEIGHT, 240) 

app = wx.App() 
frame = wx.Frame(None) 
cap = ShowCapture(frame, capture) 
frame.Show() 
app.MainLoop() 
+0

आपने पैनल को उप-वर्ग क्यों बनाया और फ्रेम नहीं किया? Wx नहीं होना चाहिए। Wx पदानुक्रम में पहला 'कंटेनर' फ्रेम करें? और दूसरा आयात ओएसएक्स पर काम नहीं करेगा, मुझे लगता है कि सीवी 2 से पुराने सीवी तक पहुंचने के बाद आपको cv2.cv आयात करने की आवश्यकता है। आपका कोड मेरी मशीन पर काम करता है जो बीटीडब्ल्यू एक लिनक्स डेबियन आधारित मशीन है, हालांकि यह आकार फ्रेम को 640X480 पर सेट नहीं करता है। – wind85

+1

मैं ओएसएक्स में बस 'सीवी' ठीक आयात कर सकता हूं। फ्रेम निश्चित रूप से '640 x 480' पर सेट नहीं है क्योंकि उदाहरण में यह '320 x 240' पर सेट है, क्या आपने इसे बदलने का प्रयास किया था? एक 'wx.frame' बनाया जा रहा है, यह' wx.Panel' subclassed का अभिभावक है। – mmgp

+0

मैंने नए मॉड्यूल और पुराने के साथ आकार बदलने की कोशिश की, हालांकि जैसे ही मैं इसका आकार बदलता हूं, यह अब रीफ्रेश नहीं होता है और यह फिर से क्रैश हो जाता है। – wind85

0

आपको कैप्चर की गई छवि दिखाने के लिए पैनल का आकार सेट करना होगा। मैं अपने कोड का इस्तेमाल किया और मैं कहा, "

self.SetSize(width,height) 

ठीक है