CV2.imshow()窗口不会重新打开-实时视频捕获

时间:2019-04-09 06:30:55

标签: python multithreading cv2

我正在尝试创建一个python程序,该程序可以从实时相机供稿中自动检测瞳孔。我的程序有多个线程可以从相机中获取图像,分析代码并显示相机Feed的编辑版本。

由于我不是线程技术的新手,所以我当前的代码仅显示相机供稿的底片。运行时,程序将按预期运行。但是,如果我在关闭cv2窗口后再次尝试运行代码,则该程序将无法正常运行。我的相机打开了(如预期的那样),但是新的cv2窗口没有打开。我需要重新打开ide(spyder),以使程序再次正常运行。

我认为这可能是由于我的线程未正确终止,但是,由于我在该领域缺乏经验,所以我不确定。如果我运行

threading.current_thread() 

我关闭窗口后得到

<_MainThread(MainThread, started 2468)> 

对于问题出在哪里,我将不胜感激。

我的代码:

frame_to_detect = None
filtering = True
filter_frame = None
view = True
stopper = None

class Filter(Thread):
#indenting got mess up here
def __init_(self):
    Thread.__init__(self)

def run(self):
    global frame_to_detect
    global filter_frame


    while view:
        if frame_to_detect is not None:
            filter_frame = 255-frame_to_detect

class displayFrame(Thread):
#indenting got messed up here
def __init__(self):
    Thread.__init__(self)

def run(self):
    global view
    while view:
        if filter_frame is not None:
            cv2.imshow('frame',filter_frame)
            if (cv2.waitKey(1) & 0xFF == ord('q')):
                view = False

Filter_thread = Filter()
Filter_thread.daemon = True
Filter_thread.start()
display = displayFrame()
display.daemon = True
display.start()
video_capture = cv2.VideoCapture(filepath)

while view:
    ret,frame_to_detect = video_capture.read()


filtering = False
video_capture.release()
cv2.destroyAllWindows()

1 个答案:

答案 0 :(得分:0)

当关闭cv2窗口时,线程继续在后台运行。 cv2.imshow的线程最终将超时。但是,为了加快处理速度,可以使线程异常关闭。如

    @inject(ConfigService)
export class MyFooterCustomElement{
    private version: string;
    constructor(
        private configService: ConfigService) {
        this.getVersion()
    }



<template>
    <footer class="footer fixed-bottom d-flex justify-content-between">
        <span class="p-2 ml-40">text</span>
        <span class="text-muted d-flex p-2">v${version}</span>
    </footer>
</template>
    async getVersion() {
        this.version = await this.configService.getVersion();
    }
}