首页 > 解决方案 > 线程没有在python中打开目标函数

问题描述

我想打开一个函数,通过调用 cv2.imshow() 方法在屏幕上显示加载视频。首先,我想演示代码,然后是问题。


import cv2
import threading


def Load():

    video = cv2.VideoCapture('Loading.mov')

    if video.isOpened() == True:

        cv2.namedWindow("The Video")
        cv2.moveWindow("The Video", 500,200)

    elif video.isOpened() == False:

        print('No Data For Loading Video')
        return 0

    while video.isOpened():

        _, frame = video.read()

        if _ == True:


            cv2.imshow("The Video",frame)

            if cv2.waitKey(10) & 0xff == 27:
                break

        if _ == False :

            break

    cv2.destroyAllWindows()
    video.release()


t = threading.Thread(target = Load)
t.start()    

现在,问题:

当我第一次调用 t.start(),线程启动并正确显示视频。循环中断后,如果我再次尝试创建一个新t线程并再次 .start() 它,它根本不会显示任何内容!没有错误,什么都没有!

我正在使用 spyder 重新运行代码。而且我想在需要时重新播放视频。

现在,问题出在哪里?

标签: pythonpython-3.xmultithreadingcv2

解决方案


我用 mp4-Video ( http://techslides.com/demos/sample-videos/small.mp4 )尝试了你的代码,它可以工作。我使用https://video.online-convert.com/convert-to-mov将所述视频转换为 mov并且它仍然有效......

尽管我可能有一个有根据的猜测:您应该尝试使用新的 cv2 实例进行每次调用。

我认为问题可能是,线程的第二次调用继承了第一次调用的状态(尤其是 cv2 的内部状态),因为它只是一个函数,因此视频处于“已播放”状态或其他状态并且没有不要再显示任何东西了。

因此,如果您将所有内容放在一个类中并在每次调用 Load() 时使用 cv2 的新实例进行调用,它可能会起作用。

import cv2
import threading

class Video:
    def play(self):
        video = cv2.VideoCapture('small.mov')

        if video.isOpened() == True:
            cv2.namedWindow("The Video")
            cv2.moveWindow("The Video", 500,200)

        elif video.isOpened() == False:
            print('No Data For Loading Video')
            return 0

        while video.isOpened():
            _, frame = video.read()

            if _ == True:
                cv2.imshow("The Video",frame)

                if cv2.waitKey(10) & 0xff == 27:
                    break

            if _ == False :
                break

        cv2.destroyAllWindows()
        video.release()

def Load():
    v=Video()
    v.play()
    del v


t = threading.Thread(target = Load)
t.start() 

推荐阅读