Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在线程之间共享相机帧_Multithreading_Opencv_Python Multithreading - Fatal编程技术网

Multithreading 在线程之间共享相机帧

Multithreading 在线程之间共享相机帧,multithreading,opencv,python-multithreading,Multithreading,Opencv,Python Multithreading,我试图构建一个脚本来管理多个应该并行运行的线程,并在它们之间交换数据。 作为起点,我有两个线程…第一个线程应该从USB摄像头读取帧并将其发送到队列,而第二个线程应该读取帧并显示它们 我试过: 导入json 导入队列、线程 从队列导入队列 进口cv2 类系统管理器(): 定义初始化(自身,源): ##照相机阅读器 self.camera_queue=queue.queue() self.camera\u reader=threading.Thread(目标=camera\u reader,args

我试图构建一个脚本来管理多个应该并行运行的线程,并在它们之间交换数据。 作为起点,我有两个线程…第一个线程应该从USB摄像头读取帧并将其发送到队列,而第二个线程应该读取帧并显示它们

我试过:

导入json
导入队列、线程
从队列导入队列
进口cv2
类系统管理器():
定义初始化(自身,源):
##照相机阅读器
self.camera_queue=queue.queue()
self.camera\u reader=threading.Thread(目标=camera\u reader,args=(源,self.camera\u队列))
self.camera\u reader.daemon=True
self.camera_reader.run()
self.camera\u display=threading.Thread(target=camera\u display,args=(self.camera\u队列))
self.camera\u display.daemon=True
self.camera_display.run()
def摄像头读卡器(源,摄像头队列):
打印(“凸轮加载…”)
cap=cv2.视频捕获(源)
打印(“凸轮加载…”)
虽然(正确):
ret,frame=cap.read()
摄影机队列放置(帧)
def摄像头显示(摄像头队列):
打印(“做某事”)
虽然(正确):
frame=camera_queue.get()
key=cv2.waitKey(1)
如果(键==ord('q')):
打破
cv2.imshow(“帧”,帧)
如果名称=“\uuuuu main\uuuuuuuu”:
SM=系统管理器(源=0)
但它并没有真正起作用。第一个线程,即应该读取帧的线程,实际上正在执行此操作,但第二个线程没有显示任何内容(开头有一个print语句,没有显示)。而且,在运行了几分钟后,我的电脑完全卡住了,所以我想我是不小心一直在占用内存。 我对多处理/多线程相当陌生,所以我可能在某个地方犯了一些非常基本的错误

编辑 好的,使用以下方法修复了内存问题:

self.camera_queue = queue.Queue(maxsize=5)
但是第二个线程尚未运行

请使用thread.start()而不是thread.run(),修复线程目标方法并在参数后添加逗号。这很有效

import json
import queue, threading
from queue import Queue
import cv2


class system_manager():
    def __init__(self, source):

        ## camera reader
        self.camera_queue = queue.Queue(maxsize=5)
        self.camera_reader = threading.Thread(target=camera_reader, args=(source, self.camera_queue))
        self.camera_reader.daemon = True
        self.camera_reader.start()
        self.camera_display = threading.Thread(target=camera_display, args=(self.camera_queue,))
        self.camera_display.daemon = True
        self.camera_display.start()


def camera_reader(source, camera_queue):
    print("Cam Loading...")
    cap = cv2.VideoCapture(source)
    print("Cam Loaded...")
    while(True):
        ret, frame = cap.read()
        camera_queue.put(frame)


def camera_display(camera_queue):
    print("doing something")
    while(True):
        frame = camera_queue.get()
        key = cv2.waitKey(1)
        if (key == ord('q')):
            break
        cv2.imshow("frame", frame)



if __name__ == "__main__":
    SM = system_manager(source=0)
使用thread.start()而不是thread.run(),修复线程目标方法并在参数后添加逗号。这很有效

import json
import queue, threading
from queue import Queue
import cv2


class system_manager():
    def __init__(self, source):

        ## camera reader
        self.camera_queue = queue.Queue(maxsize=5)
        self.camera_reader = threading.Thread(target=camera_reader, args=(source, self.camera_queue))
        self.camera_reader.daemon = True
        self.camera_reader.start()
        self.camera_display = threading.Thread(target=camera_display, args=(self.camera_queue,))
        self.camera_display.daemon = True
        self.camera_display.start()


def camera_reader(source, camera_queue):
    print("Cam Loading...")
    cap = cv2.VideoCapture(source)
    print("Cam Loaded...")
    while(True):
        ret, frame = cap.read()
        camera_queue.put(frame)


def camera_display(camera_queue):
    print("doing something")
    while(True):
        frame = camera_queue.get()
        key = cv2.waitKey(1)
        if (key == ord('q')):
            break
        cv2.imshow("frame", frame)



if __name__ == "__main__":
    SM = system_manager(source=0)
检查这个答案检查这个答案