admin 管理员组

文章数量: 1184232

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

我遇到的问题围绕着cv2.imshow()函数。几个月前,我通过从picamera切换到{}来提高处理速度,在这里我可以执行更复杂的计算,比如背景减法,而不必一直调用python。使用bcm2835-v4l2包,我可以使用cv2直接从picamera中提取图像。在

快进6个月,当我试图更新代码时,我发现函数cv2.imshow()不再正确显示。我认为bcm2835-v4l2可能有问题,但使用matplotlib进行的测试表明连接良好。它似乎与cv2.imshow()有关,我想大概是这样。在

实际上,我使用threading模块创建了一个单独的线程,我想知道这是否是罪魁祸首。我不这么认为,因为输入命令import cv2

camera = cv2.VideoCapture(0)

grabbed,frame = camera.read()

cv2.imshow(frame)

产生同样的黑幕

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

作为参考,这里是关于我的系统的细节

^{pr2}$

代码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连接工作的。

但是当使用打开cv.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()没有关联

本文标签: 黑屏 摄像头 python raspberrypi