В настоящее время пытаюсь написать код с графическим интерфейсом, который позволит включить / выключить обработку изображений.В идеале код позволит включать / выключать вид из окна, обрабатывать изображения в реальном времени (довольно просто) и управлять внешней платой.
Проблема, с которой я сталкиваюсь, связана с функцией 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.
Однако при использовании 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 ()