Python:在多个进程上分配视频帧

标签 python opencv video multiprocessing

目标是对视频帧进行图像处理。视频可以分为 16 个单独的区域,可以在这些区域上进行处理。因此,使用 16 个不同的进程同时进行处理(结果也存储在每个区域中)。

import cv2
import multiprocessing

def process_region(n):
    cap = cv2.VideoCapture('/path/to/video.avi')

    ret, frame = cap.read()
    while ret:
        # crop frame to region n
        # process the region

        ret, frame = cap.read()

pool = multiprocessing.Pool()
pool.map(process_region, range(16))

这里一个明显的缺陷是所有进程都在单独加载视频。测试确实表明,经过一定 (10) 次处理后,阅读测试视频的性能确实会下降:
+------------+--------+
| #processes | T (s.) |
+------------+--------+
|      1     |  30.2  |
|      2     |  27.1  |
|      3     |  32.9  |
|      4     |  30.2  |
|      5     |  31.7  |
|      6     |  29.6  |
|      7     |  29.5  |
|      8     |  29.5  |
|      9     |  30.6  |
|     10     |  30.9  |
|     11     |  32.4  |
|     12     |  35.7  |
|     13     |  40.3  |
|     14     |  43.5  |
|     15     |  48.3  |
|     16     |  52.5  |
+------------+--------+

我尝试仅使用 1 个进程读取所有视频帧并使用 multiprocessing.Pipe 发送到 16 开始 multiprocessing.Process过程。然而,这具有最差的性能(> 15 分钟)。

我的问题是,是否有一种方法可以比让所有进程加载视频本身具有更好的性能来分发视频帧。

请注意,这是在具有 64GB 内存的双 8 核机器上运行的。

最佳答案

你可以试试numpy-sharedmem使单个图像(cv2 中的 NumPy 数组)可由多个进程读取的模块。我在 one of my projects 中正是这样做的。 .

关于Python:在多个进程上分配视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31541548/

相关文章:

python - 了解性能差异

python - 如何计算首字母大写的单词出现的比例

python - 如何等待进程池有空闲的 worker

python - 比较两个 OpenCV 图像/2D Numpy 数组

java - 打开默认照片库应用程序

python - 在 numpy 中一次将函数应用于 3 个元素

python - 使用 OpenCV 校正蒙版中形状的边缘

c++ - cv::equalizeHist 和 matlab histeq() 之间有什么区别

audio - 如何使用 ffmpeg CLI 拉伸(stretch)音频流的开头,使用静音,以匹配视频的开头?

ajax - Squarespace Ajax调用不会加载视频和音频