Поток не открывает целевую функцию в python - PullRequest
0 голосов
/ 17 января 2020

Я хочу открыть функцию, которая показывает загрузку ВИДЕО на экране вызванным методом 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 () FOR ПЕРВЫЙ РАЗ поток запускается и показывает видео должным образом. После перерыва l oop, если я снова попытаюсь сделать новый t в качестве потока и снова запустить его .start (), он вообще ничего не показывает! Не ошибки, ничего!

Я использую spyder для повторного запуска кодов. И я хочу запускать видео всякий раз, когда мне нужно.

Теперь, где проблема?

1 Ответ

1 голос
/ 17 января 2020

Я попробовал ваш код с MP4-Video (http://techslides.com/demos/sample-videos/small.mp4), и он работает. Я преобразовал указанное видео в mov с https://video.online-convert.com/convert-to-mov, и он все еще работает ...

Хотя у меня может быть обоснованное предположение: вы должны пытаться делать каждый звонок с помощью fre sh экземпляр cv2.

Я предполагаю, что проблема может заключаться в том, что второй вызов потока наследует состояние первого вызова (особенно внутреннее состояние cv2), так как для него это только функция в состоянии "уже воспроизведено" или что-то еще, и больше ничего не показывает.

, поэтому, если вы помещаете все в класс и каждый раз вызываете новый экземпляр cv2, когда вызывается Load (), это может сработать.

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() 
...