除了创建新图像的明显方法,使用for循环遍历电影的每一帧以及每次迭代都经过帧中的每个像素,如果它大于当前值,则以相应的像素值更新图像。
我确实可以使用 cv.Get2D 访问帧中的单个像素,所以这很好。我只是想知道是否可以利用更快或更硬件优化的方式来执行此操作,因为我将在许多千兆字节的灰度视频上执行此操作。
除了创建新图像的明显方法,使用for循环遍历电影的每一帧以及每次迭代都经过帧中的每个像素,如果它大于当前值,则以相应的像素值更新图像。
我确实可以使用 cv.Get2D 访问帧中的单个像素,所以这很好。我只是想知道是否可以利用更快或更硬件优化的方式来执行此操作,因为我将在许多千兆字节的灰度视频上执行此操作。
有很多方法可以做到这一点,而“最佳”方法将取决于您可以使用的硬件。
如果您使用的是优质的 AMD 显卡,您可以使用AMD 的 OpenVideo 解码库将帧传送到您的 GPU,然后使用 OpenCL 进行数学运算。它会很快变坏。
如果您没有 AMD 显卡,但您有不错的 NVidia 卡或 Intel HD4000(新的基于 Ivy Bridge 的 Core i7 系统),您可以使用 OpenCV 读取帧,然后将该数据传递给 OpenCL 并且仍然大规模并行计算。
即使您没有好的显卡,您仍然可以使用 OpenCL CPU 上下文进行计算,如果您使用int4
矢量数据类型,您的代码将使用您的 Intel 或 AMD 处理器的 SSE2 寄存器。如问题陈述中所述,这应该是原始像素迭代速度的 4 倍以上。
添加一个答案,因为 K. Brafford 没有直接回答您问题的“OpenCV 或 PIL”部分
从这里完成的基准测试来看,OpenCV 似乎是明显的赢家。