python - 为什么不能发送cv2视频源?

标签 python opencv mpi pickle

我尝试使用 MPI 分散将 cv2 视频捕获源发送到不同的进程。这样,每个进程都会有一个句柄来检索帧。

if rank == 0:
  video_source = cv2.VideoCapture('my_video.avi')
  source_list = [video_source] * world_communicator.Get_size()
else:
  source_list = None
data = world_communicator.scatter(source_list, root=0)
# Do stuff with access to the video source...

但是,此代码出现以下错误。

[dfaux@ubiquitous mpi_practice]$ mpirun -n 2 python cv2_video_practice.py
Traceback (most recent call last):
  File "cv2_video_practice.py", line 93, in <module>
    process_video(source, destination, kernel)
  File "cv2_video_practice.py", line 58, in process_video
    data = comm.scatter(frame_counts, root=0)
  File "Comm.pyx", line 874, in mpi4py.MPI.Comm.scatter (src/mpi4py.MPI.c:68023)
  File "pickled.pxi", line 656, in mpi4py.MPI.PyMPI_scatter (src/mpi4py.MPI.c:32402)
  File "pickled.pxi", line 131, in mpi4py.MPI._p_Pickle.dumpv (src/mpi4py.MPI.c:26847)
  File "pickled.pxi", line 81, in mpi4py.MPI._p_Pickle.dump (src/mpi4py.MPI.c:26188)
cPickle.PicklingError: Can't pickle <type 'cv2.VideoCapture'>: it's not the same object as cv2.VideoCapture

为什么我不能 pickle 视频源?为什么是<type 'cv2.VideoCapture'>cv2.VideoCapture 不是同一个对象?

最佳答案

cv2.VideoCapture 不是所有向量的列表。相反,它是一个指向视频中特定帧的句柄。这样,将这样的对象分散到一堆其他进程中就没有意义了。相反,我建议在每个进程中打开一个句柄,然后让每个进程从不同的框架开始:

source.set(cv.CV_CAP_PROP_POS_FRAMES, start_frame)

关于python - 为什么不能发送cv2视频源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13488051/

相关文章:

c++ - 使用接近于 `count` 的 `INT_MAX` 值通信数据

python - 使用嵌套结构按列连接 NumPy 数组

python - 如何使用运行时提供的键对 python 中的对象进行排序?

树莓派 3 : i wasn't able to write a value in db using a variable 上的 python 和 sql

c++ - 在树莓派2上使用opencv C++

c - MPI C 中的发送和接收阵列

python - 如何在Python中获取geckodriver的绝对路径

python-3.x - 使用opencv LineSegmentDetector查找图像的线条

python - 如何裁剪轮廓的内部区域?

python - mpi4py 是否使用 Python Pickle