2016-12-04 79 views
0

我被卡住了。我的代码很糟糕。我的傻子也不行,但无限的形象窗户让我疯狂。当我关闭namedWindow时,它会随着图像(无限地)打开一个新的显示窗口。帮帮我?关闭图像窗口将显示另一个窗口。为什么?

import numpy as np 
import cv2 
from pylepton import Lepton 

#setup the Lepton image buffer 
def capture(device = "/dev/spidev0.0"): 
    with Lepton() as l: 
     a,_ = l.capture()  #grab the buffer 
    cv2.normalize(a, a, 0, 65535, cv2.NORM_MINMAX) # extend contrast 
    np.right_shift(a, 8, a) # fit data into 8 bits 
    return np.uint8(a) 


#Create a window and give it features 
def nothing(x): 
    pass 
cv2.namedWindow('flir', cv2.WINDOW_NORMAL) 
cv2.moveWindow('flir',1,1) 
cv2.createTrackbar('thresh','flir',50,100,nothing) 
cv2.createTrackbar('erode','flir',5,100,nothing) 
cv2.createTrackbar('dilate','flir',7,100,nothing) 

#process the buffer into an image on a continuous loop  
while True: 

    #update the image processing variables 
    thresh = cv2.getTrackbarPos('thresh', 'flir') 
    erodeSize = cv2.getTrackbarPos('erode', 'flir') 
    dilateSize = cv2.getTrackbarPos('dilate', 'flir') 

    image = capture() 

    #apply some image processing 
    blurredBrightness = cv2.bilateralFilter(image,9,150,150) 
    thresh = 50 
    edges = cv2.Canny(blurredBrightness,thresh,thresh*2, L2gradient=True) 
    _,mask = cv2.threshold(blurredBrightness,200,1,cv2.THRESH_BINARY) 
    erodeSize = 5 
    dilateSize = 14 
    eroded = cv2.erode(mask, np.ones((erodeSize, erodeSize))) 
    mask = cv2.dilate(eroded, np.ones((dilateSize, dilateSize))) 
    adjusted_image = cv2.resize(cv2.cvtColor(mask*edges, cv2.COLOR_GRAY2RGB) | image, (640, 4$ 
    final_image = cv2.applyColorMap(adjusted_image, cv2.COLORMAP_HOT) 

    #display the image 
    cv2.imshow('flir', final_image) 

    if cv2.waitKey(1) == ord('q'): 
     break 

cv2.waitKey() 
cv2.destroyWindow('flir') 
+0

你有一个'while True',所以它在循环结束时关闭窗口,然后从while块的开始处重新开始。它会永远做到这一点! – Ali

回答

3

首先,冷静下来。其次,仔细看看你的代码。关闭窗口不会给你带来任何好,因为线路:

cv2.imshow('flir', final_image)

cv2.destroyWindow('flir') 

什么这2个正在做的串联是,你在一个新窗口中显示的帧,然后摧毁它,然后在imshow中重新创建该窗口,然后显示下一帧并销毁它......等等。

这应该解释你的闪烁窗口。

要停止程序的执行,您添加以下代码:

if cv2.waitKey(1) == ord('q'): 
     break 

它所意味的是,当你按“Q”键盘上,而你的图像窗口的重点是,while循环将会中断,您的程序将终止。

因此,我建议您删除cv2.destroyWindow并使用'q'键退出您的应用程序,而不是使用鼠标关闭它。

+1

谢谢你的明确答案。对不起这部戏。那时凌晨2点,我很沮丧。 –