为什么在使用多处理时从视频块读取?

Why does reading from a video block when using multiprocessing?

我正在尝试在如下所示的进程中使用 cv2 读取视频文件。读取开头的块不显示任何帧!!!

我确保使用 reader_1920_1080.isOpened() 打开视频文件!! 它在 self.reader_1920_1080.read() 处阻塞并且不会继续到下一行代码,这无助于我检查 success.

当我在没有 multiprocessing 的情况下尝试 运行 时,效果非常好!

因此,问题出在进程内读取!!

有解决办法吗?

import cv2
from multiprocessing import Process

class ComputePSNRProcess(Process):
    def __init__(self):
        super(ComputePSNRProcess, self).__init__()
        self.reader_1920_1080 = cv2.VideoCapture('res_1920_1080.ivf')


    def run(self):
        while True:
            success, original_1920_1080 = self.reader_1920_1080.read()
            cv2.imshow('original', original_1920_1080)
            cv2.waitKey(25)


computePSNR = ComputePSNRProcess()
computePSNR.start()

不能在master进程中执行cv2.VideoCapture,在子进程中使用

我不确定,但我认为原因是 cv2.VideoCapture 锁定了无法传递给其他进程的 OS 资源。

运行 您在 Windows 10 中的代码,我遇到异常:

can't pickle cv2.VideoCapture objects

在下面的 post 中,Dan Mašek 建议在 运行 方法中创建 VideoCapture 实例。


其他问题:

  • 使用进程时,必须使用 if __name__ == '__main__': ...
  • 为了干净的完成,当successFalse时,你需要打破循环。

以下代码示例应该可以工作:

import cv2
from multiprocessing import Process

class ComputePSNRProcess(Process):
    def __init__(self):
        super(ComputePSNRProcess, self).__init__()

    def run(self):
        self.reader_1920_1080 = cv2.VideoCapture('res_1920_1080.ivf')

        while True:
            success, original_1920_1080 = self.reader_1920_1080.read()

            if not success:
                break

            cv2.imshow('original', original_1920_1080)
            cv2.waitKey(25)

        self.reader_1920_1080.release()
        cv2.destroyAllWindows()

if __name__ == '__main__':
    computePSNR = ComputePSNRProcess()
    computePSNR.start()