在线程中运行opencv,无法再次启动

时间:2020-03-20 10:45:05

标签: python-3.x opencv python-multithreading

当我尝试在线程中启动openvc时,它只能工作一次,但是在我第二次调用它之后,它将无法再次启动。在这种情况下,代码到达cv2函数时卡住了cv2.imshow()(但在cv2.VideoCapture()之后)。 如果我在收到套接字的信号后立即调用start_videofeed()函数,则它可以正常工作,但是我希望sock.recvfrom()继续接收其他命令。

这段代码只是我脚本的一个小例子,但是我尝试了很多,还在网上搜索了,但是找不到其他答案,只有其他遇到类似问题的答案。

我正在运行最新的opencv-python软件包,并在manjaro上使用python3.8。

我希望有人知道如何解决此问题的答案。

先谢谢了。

import socket
from threading import Thread
import cv2


class VideoFeed():
    def __init__(self):
        self.url = 0
        self.window_name = "Video"


    def run(self):
        sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
        sock.bind( ('',54666) )

        while True:
            d, addr = sock.recvfrom( 1024 )
            payload = d.decode()
            if payload == "show_video":
                self.start_video()
            if payload == "exit":
                break

    def start_video(self):
        vs = Thread(target=self.start_videofeed)
        vs.start()



    def start_videofeed(self): 
        cap = cv2.VideoCapture(self.url) 
        if (cap.isOpened()== False):  
          print("Error opening video file")
        print("Starting videofeed") 
        while True:
            ret, self.frame = cap.read() 
            cv2.imshow(self.window_name, self.frame)
            key = cv2.waitKey(10)

            if key == 27 or key == ord('q'):
                break
            if cv2.getWindowProperty(self.window_name, cv2.WND_PROP_VISIBLE) < 1:        
                break


        cv2.destroyAllWindows()
        cap.release()
        print("Video release and Destroy")
        return



vf = VideoFeed()
vf.run()

编辑:

我终于找到了答案。似乎无法从第二个线程或另一个线程中启动视频,因此我在套接字线程中设置了一个布尔值以从主程序启动视频源。

class VideoFeed():
    def __init__(self):
        self.url = "http://192.168.178.103:8081"
        self.window_name = "Video"
        self.start_video = False

    def run(self):
        Thread(target=self.start_socket).start()

        while True:
            if self.start_video:
                self.start_videofeed()
                self.start_video = False



    def start_socket(self):
        sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
        sock.bind( ('',54666) )

        while True:
            d, addr = sock.recvfrom( 1024 )
            payload = d.decode()
            if payload == "show_video":
                self.start_video = True
            if payload == "exit":
                break


    def start_videofeed(self): 
        cap = cv2.VideoCapture(self.url) 
        if (cap.isOpened()== False):  
          print("Error opening video file")
        print("Starting videofeed") 
        while True:
            ret, self.frame = cap.read() 
            cv2.imshow(self.window_name, self.frame)
            key = cv2.waitKey(10)

            if key == 27 or key == ord('q'):
                break
            if cv2.getWindowProperty(self.window_name, cv2.WND_PROP_VISIBLE) < 1:        
                break


        cv2.destroyAllWindows()
        cap.release()
        print("Video release and Destroy")
        return

0 个答案:

没有答案