为什么在使用多处理时从视频块读取?
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__':
...
- 为了干净的完成,当
success
是False
时,你需要打破循环。
以下代码示例应该可以工作:
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()
我正在尝试在如下所示的进程中使用 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__':
... - 为了干净的完成,当
success
是False
时,你需要打破循环。
以下代码示例应该可以工作:
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()