[英]python, cv2.imshow(), raspberryPi and a black screen
目前正在尝试使用GUI编写代码,以允许切换开/关图像处理。 理想情况下,代码将允许打开/关闭窗口视图,实时图像处理(非常基本),以及控制外部板。
我遇到的问题围绕着cv2.imshow()
函数。 几个月前,我做了一个推动通过切换来提高处理速度picamera
到cv2
在那里我可以,而不必调用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连接。
但是当使用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.