Пытаюсь отобразить канал веб-камеры на моем wx python GUI, но не могу этого сделать - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь отобразить канал с веб-камеры на моем GUI created. Однако, похоже, мне это не удается. Как только вы запустите эту программу, появится всплывающее окно GUI. После нажатия на кнопку «Пуск» программа обнаружения AI запустится в другом кадре. Однако я бы хотел, чтобы это программное обеспечение для обнаружения ИИ отображалось на верхней панели моего GUI. Кто-нибудь может мне с этим помочь? Извините, я новичок в этом.

Ниже приведен код:

import cv2
import numpy as np
import wx

class Main(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,parent = None, title = "Baby Sleep Monitor", size = (700,700))
        splitter = wx.SplitterWindow(self)
        top = TopPanel(splitter)
        bottom = BottomPanel(splitter,top)
        splitter.SplitHorizontally(top, bottom)
        splitter.SetMinimumPaneSize(470)

class TopPanel (wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self,parent = parent)



class BottomPanel (wx.Panel):
    def __init__(self,parent,top):
        wx.Panel.__init__(self,parent = parent)
        self.graph = top
        self.SetBackgroundColour("gray")

        self.togglebuttonStart = wx.ToggleButton(self, id = -1, label = "Start", pos = (10,10))
        self.togglebuttonStart.Bind(wx.EVT_TOGGLEBUTTON, self.OnStartClick)

        labelchannels = wx.StaticText(self, -1, "Analogue Inputs", pos = (200, 20))
        self.cb1 = wx.CheckBox(self, -1, label = "A0", pos = (200, 40))
        self.cb2 = wx.CheckBox(self, -1, label = "A1", pos = (200, 55))
        self.cb3 = wx.CheckBox(self, -1, label = "A2", pos = (200, 70))
        self.cb4 = wx.CheckBox(self, -1, label = "A3", pos = (200, 85))

        self.textboxSampleTime = wx.TextCtrl(self, -1, "1000", pos=(200, 115), size=(50, -1))
        self.buttonSend = wx.Button(self, -1, "Send", pos=(250, 115), size=(50, -1))
        self.buttonSend.Bind(wx.EVT_BUTTON, self.OnSend)

        self.Bind(wx.EVT_CHECKBOX,self.OnChecked)

        labelMinY = wx.StaticText(self,-1, "Min Y", pos = (400,10))
        self.textboxMinYAxis = wx.TextCtrl(self,-1,"0",pos = (400,30))

        labelMaxY = wx.StaticText(self, -1, "Max Y", pos=(400, 60))
        self.textboxMaxYAxis = wx.TextCtrl(self, -1, "1024", pos=(400, 80))

        self.buttonRange = wx.Button(self,-1,"Set Y Axis", pos = (400,105))
        self.buttonRange.Bind(wx.EVT_BUTTON, self.SetButtonRange)

    def SetButtonRange(self,event):
        min = self.textboxMinYAxis.GetValue()
        max = self.textboxMaxYAxis.GetValue()
        print(max)
        print(min)
        self.graph.changeAxes(min,max)

    def OnChecked(self, event):
        cb = event.GetEventObject()
        print("%s is clicked" % (cb.GetLabel()))

    def OnStartClick(self,event):
        val = self.togglebuttonStart.GetValue()
        if val == True:
            self.togglebuttonStart.SetLabel("Stop")

            cap = cv2.VideoCapture(0)
            font = cv2.FONT_HERSHEY_SCRIPT_COMPLEX

            face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
            eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
            fullb_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml')
            left45_cascade = cv2.CascadeClassifier('haarcascade_profileface.xml')
            left90_cascade = cv2.CascadeClassifier('haarcascade_mcs_leftear.xml')
            right45_cascade = cv2.CascadeClassifier('haarcascade_profileface.xml')
            right90_cascade = cv2.CascadeClassifier('haarcascade_mcs_rightear.xml')
            back_cascade = cv2.CascadeClassifier('backcascade.xml')
            while 1:
                value = self.togglebuttonStart.GetValue()
                ret, img = cap.read()
                gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                full_body = fullb_cascade.detectMultiScale(gray, 1.3, 2)
                for (fx, fy, fw, fh) in full_body:
                    cv2.rectangle(img, (fx, fy), (fx + fw, fy + fh), (0, 255, 255), 2)

                left_face = left45_cascade.detectMultiScale(gray, 1.3, 5)
                for (x2, y2, w2, h2) in left_face:
                    cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (255, 0, 0), 2)
                    roi_gray = gray[y2:y2 + h2, x2:x2 + w2]
                    roi_color = img[y2:y2 + h2, x2:x2 + w2]
                    cv2.putText(img, str('left face'), (x2, y2 + h2), font, 1, 255)

                flipped = cv2.flip(gray, 1)
                right_face = right45_cascade.detectMultiScale(flipped,1.3,5)
                for (x3,y3,w3,h3) in right_face:
                    cv2.rectangle(img,(x3,y3),(x3+w3, y3 + h3),(255,0,0),2)
                    cv2.putText(img,str('right face'), (x3, y3+h3), font, 1,255)

                leftmost_face = left90_cascade.detectMultiScale(gray,1.3,5)
                for(x4,y4,w4,h4) in leftmost_face:
                    cv2.rectangle(img,(x4,y4),(x4+w4, y4+h4),(0,255,255),2)
                    cv2.putText(img,str('right face'),(x4,y4+h4),font , 1,255)

                rightmost_face = right90_cascade.detectMultiScale(gray,1.3,5)
                for(x5,y5,w5,h5) in rightmost_face:
                    cv2.rectangle(img,(x5,y5),(x5+w5, y5+w5), (0,255,255),2)
                    cv2.putText(img,str('right face'),(x5,y5+h5),font,1,255)


                faces = face_cascade.detectMultiScale(gray, 1.3, 5)
                for (x, y, w, h) in faces:
                    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
                    roi_gray = gray[y:y + h, x:x + w]
                    roi_color = img[y:y + h, x:x + w]
                    cv2.putText(img, str('face'), (x, y + h), font, 1, 255)

                    eyes = eye_cascade.detectMultiScale(roi_gray)
                    for (ex, ey, ew, eh) in eyes:
                        cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

                cv2.imshow('img', img)
                k = cv2.waitKey(30) & 0xff
                if value == False:
                    break

            cap.release()
            cv2.destroyAllWindows()
        else:
            self.togglebuttonStart.SetLabel("Start")

    def OnSend(self, event):
        val = self.textboxSampleTime.GetValue()
        print(val)


if __name__ == "__main__":
    app = wx.App()
    frame = Main()
    frame.Show()
    app.MainLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...