【问题标题】:Why can't I send a cv2 video source?为什么我不能发送 cv2 视频源?
【发布时间】:2012-11-09 09:31:08
【问题描述】:

我尝试使用 MPI scatter 将 cv2 Video Capture 源发送到不同的进程。这样,每个进程都会有一个句柄来检索帧。

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

为什么我不能腌制视频源?为什么&lt;type 'cv2.VideoCapture'&gt;cv2.VideoCapture 不是同一个对象?

【问题讨论】:

  • 显然cv2.VideoCapture 类是不可序列化的。为什么不将文件名传递给其他队伍并让他们创建自己的VideoCapture 对象?
  • 这和向不同进程发送很多很多帧是一回事吗?还有,为什么cv2.VideoCapture 不能序列化?

标签: python opencv mpi pickle


【解决方案1】:

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

source.set(cv.CV_CAP_PROP_POS_FRAMES, start_frame)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2013-01-26
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2021-03-14
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多