代码之家  ›  专栏  ›  技术社区  ›  Hojo.Timberwolf

python、cv2.imshow()、raspberryPi和黑屏

  •  3
  • Hojo.Timberwolf  · 技术社区  · 7 年前

    目前正在尝试使用GUI编写代码,该GUI将允许打开/关闭图像处理。理想情况下,代码将允许打开/关闭窗口视图、实时图像处理(相当基本)和控制外部板。

    我遇到的问题是围绕着 cv2.imshow() 功能。几个月前,我通过从 picamera cv2 在这里我可以执行更复杂的计算,比如背景减法,而不必一直调用python。使用 cv2型 .

    快进6个月,在尝试更新代码时,我发现 cv2.imshow() bcm2835-v4l2型 cv2.imshow() 或者我猜是这样。

    threading 我想知道这是否是罪魁祸首。我不这么认为,虽然在输入命令

    import cv2
    camera = cv2.VideoCapture(0)
    grabbed,frame = camera.read()
    cv2.imshow(frame)
    

    产生相同的黑屏

    下面是我正在使用的代码(在RPi3上),一些图片显示了错误和预期结果。

    Raspberry pi3
    raspi stretch
    python 3.5.1
    opencv 3.4.1
    

    代码

    import cv2
    from threading import Thread
    import time
    import numpy as np
    from tkinter import Button, Label, mainloop, Tk, RIGHT
    
    class GPIOControllersystem:
        def __init__(self,OutPinOne=22, OutPinTwo=27,Objsize=30,src=0):
            self.Objectsize = Objsize
    
            # Build GUI controller
            self.TK = Tk()                                                          # Place TK GUI class into self
    
            # Variables
            self.STSP = 0
            self.ShutdownVar = 0
            self.Abut = []
            self.Bbut = []
            self.Cbut = []
            self.Dbut = []
    
            # setup pi camera for aquisition
            self.resolution = (640,480)
            self.framerate = 60
    
            # Video capture parameters
            (w,h) = self.resolution
            self.bytesPerFrame = w * h
    
            self.Camera = cv2.VideoCapture(src)
            self.fgbg = cv2.createBackgroundSubtractorMOG2()
    
        def Testpins(self):
            while True:
                grabbed,frame = self.Camera.read()
                frame = self.fgbg.apply(frame)
    
                if self.ShutdownVar ==1:
                    break
                if self.STSP == 1:
                    pic1, pic2 = map(np.copy,(frame,frame))
                    pic1[pic1 > 126] = 255
                    pic2[pic2 <250] = 0
                    frame = pic1
                elif self.STSP ==1:
                    time.sleep(1)
                cv2.imshow("Window",frame)
            cv2.destroyAllWindows()
    
        def MProcessing(self):
            Thread(target=self.Testpins,args=()).start()
            return self
    
        def BuildGUI(self):
            self.Abut = Button(self.TK,text = "Start/Stop System",command = self.CallbackSTSP)
            self.Bbut = Button(self.TK,text = "Change Pump Speed",command = self.CallbackShutdown)
            self.Cbut = Button(self.TK,text = "Shutdown System",command = self.callbackPumpSpeed)
            self.Dbut = Button(self.TK,text = "Start System",command = self.MProcessing)
    
            self.Abut.pack(padx=5,pady=10,side=RIGHT)
            self.Bbut.pack(padx=5,pady=10,side=RIGHT)
            self.Cbut.pack(padx=5,pady=10,side=RIGHT)
            self.Dbut.pack(padx=5,pady=10,side=RIGHT)
            Label(self.TK, text="Controller").pack(padx=5, pady=10, side=RIGHT)
            mainloop()
    
        def CallbackSTSP(self):
            if self.STSP == 1:
                self.STSP = 0
                print("stop")
            elif self.STSP == 0:
                self.STSP = 1
                print("start")
    
        def CallbackShutdown(self):
            self.ShutdownVar = 1
    
        def callbackPumpSpeed(self):
            pass
    
    if __name__ == "__main__":
        GPIOControllersystem().BuildGUI()
    

    matplotlib.pyplot.imshow() ,我可以看到raspberry pi摄像头和opencv之间的连接是通过bcm2835-v4l2连接工作的。 Image of frame captured using system but plotting with matplotlib

    enter image description here

    更新:所以在测试时我发现当我执行以下任务时

    import cv2
    import matplotlib
    
    camera = cv2.VideoCapture(0)
    grab,frame = camera.read()
    matplotlib.pyplot.imshow(frame)
    
    grab,frame = camera.read()
    matplotlib.pyplot.imshow(frame)
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   user3732793    7 年前

    你应该和一个覆盆子一起工作 结帐 pyimagesearch 为了这个