繁体   English   中英

python 多处理和 opencv VideoCapture read() 错误

[英]python multiprocessing and opencv VideoCapture read() error

我对 python 多处理有疑问。

我想与 opencv 一起使用多处理

这是我的源代码

--- 主要.py

if use_webcam:
    print("[INFO] Using Webcam")
    reader = cv2.VideoCapture(0)
    ret, frame = reader.read()
    if ret:
        img_height, img_width, C = frame.shape
    else:
        img_height = 360
        img_width = 640
    fps = 1000 // DELAY
else:
    reader = cv2.VideoCapture(video_path)
    fps = reader.get(cv2.CAP_PROP_FPS)
shape = [T, img_height, img_width, 3]

frame_q = Queue()
frame_reader = Process(target=read_frames, args=(reader,frame_q,use_webcam)

--- def read_frames()

def read_frames(reader, frame_q, use_webcam, shape):
    allframes = int(reader.get(cv2.CAP_PROP_FRAME_COUNT))
    resize_height = shape[1]
    resize_width = shape[2]

    for ii in range(allframes):
        if reader.isOpened():
            print("[INFO] reader is opended")
            # while frame_q.qsize() > 500:
            #     time.sleep(1)
            ret, frame = reader.read()
            print("[INFO] ret : ", ret)
            resize_img = cv2.resize(frame, dsize=(resize_width, resize_height), interpolation=cv2.INTER_LINEAR)
            cur_img = resize_img[:, :, ::-1]
            frame_q.put(cur_img)            

我尝试运行源代码

但是当我运行它时reader.read()不起作用。

它没有显示任何错误,也没有任何结果。

并且frame_q.qsize()为 0。

我需要帮助。

如果 multiprocessing 和 opencv 不兼容,我应该如何处理它们?

- - - - - - - - - - - - 编辑

这个问题使用了 imageio 库。

它适用于我的代码

但我想知道这个问题。

为什么一起使用时停在'read()'?

在我看来,不要在主进程和子进程之间共享 object 是可能的。 所以 object 必须单独声明。

主文件

if use_webcam:
        print("[INFO] Using Webcam")
        reader = cv2.VideoCapture(0)
        ret, frame = reader.read()
        if ret:
            img_height, img_width, C = frame.shape
        else:
            img_height = 360
            img_width = 640
        fps = 1000 // DELAY
    else:
        reader = cv2.VideoCapture(video_path)
        fps = reader.get(cv2.CAP_PROP_FPS)
    shape = [T, img_height, img_width, 3]

    frame_q = Queue()
    frame_reader = Process(target=read_frames, args=(reader,frame_q,use_webcam)

def read_frames()

def read_frames(video_path, frame_q, use_webcam, shape):
    allframes = int(reader.get(cv2.CAP_PROP_FRAME_COUNT))
    resize_height = shape[1]
    resize_width = shape[2]
    cap = cv2.VideoCapture(video_path)

    for ii in range(allframes):
        if reader.isOpened():
            print("[INFO] reader is opended")
            # while frame_q.qsize() > 500:
            #     time.sleep(1)
            ret, frame = cap.read()
            print("[INFO] ret : ", ret)
            resize_img = cv2.resize(frame, dsize=(resize_width, resize_height), interpolation=cv2.INTER_LINEAR)
            cur_img = resize_img[:, :, ::-1]
            frame_q.put(cur_img)  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM