python, cv2.imshow (), raspberryPi и черный экран - PullRequest
0 голосов
/ 21 сентября 2018

В настоящее время пытаюсь написать код с графическим интерфейсом, который позволит включить / выключить обработку изображений.В идеале код позволит включать / выключать вид из окна, обрабатывать изображения в реальном времени (довольно просто) и управлять внешней платой.

Проблема, с которой я сталкиваюсь, связана с функцией cv2.imshow().Несколько месяцев назад я попытался увеличить скорость обработки, переключившись с picamera на cv2, где я могу выполнять более сложные вычисления, такие как вычитание фона, без необходимости постоянно вызывать python.используя пакет bcm2835-v4l2 , я смог получить изображения непосредственно из Picamera, используя ускоренную перемотку вперед * 6 месяцев cv2.

* 1010 и, пытаясь обновить код, обнаружил, чтофункция cv2.imshow() больше не отображается правильно.Я думал, что это может быть проблема с bcm2835-v4l2 , но тесты с использованием matplotlib показывают, что соединение в порядке.похоже, все связано с 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

Однако при использовании opencv.imshow () окно приводит к появлению черного ящика, ничего не отображается.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)

обновление было решено и не связано с основной проблемой.Это была проблема буферизации.По-видимому, не имеет отношения к cv2.imshow ()

1 Ответ

0 голосов
/ 21 сентября 2018

для малины, с которой вы должны работать из picamera import PiCamera checkout pyimagesearch для этого

...