繁体   English   中英

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

[英]python, cv2.imshow(), raspberryPi and a black screen

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

我遇到的问题围绕着cv2.imshow()函数。 几个月前,我做了一个推动通过切换来提高处理速度picameracv2在那里我可以,而不必调用Python所有的时间执行像背景减除更复杂的计算。 使用bcm2835-v4l2包,我能够使用cv2直接从picamera中提取图像。

快进6个月,在尝试更新代码时,我发现函数cv2.imshow()不再正确显示。 我认为这可能是bcm2835-v4l2的一个问题,但使用matplotlib测试显示连接正常。 它似乎与cv2.imshow()或所以有关。

我实际上是使用threading模块创建一个单独的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连接。 使用系统捕获的框架的图像,但用matplotlib绘图

但是当使用opencv.imshow()窗口导致黑盒时,不会显示任何内容。 在此输入图像描述

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

import cv2
import matplotlib

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

grab,frame = camera.read()
matplotlib.pyplot.imshow(frame)

更新已解决,与主要问题无关。 这是一个缓冲问题。 似乎与cv2.imshow()没有相关性

在树莓上你应该使用picamera导入PiCamera checkout pyimagesearch

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM