我正在尝试在两个进程之间共享从USB摄像头(logitech c270)收到的帧(图像),以便我可以避免使用memcpy
。我正在使用描述here的内存映射流I / O方法,我可以在使用v4l2_mmap
后成功从相机中获取帧。但是,我有另一个进程(用于图像处理),它必须在出队后使用图像缓冲区,并发出信号通知第一个进程再次对缓冲区进行排队。
在线搜索,我发现允许多次打开视频设备,但是当我尝试在成功后{v4l2_mmap
和mmap
中尝试映射(同时尝试v4l2_open
和EINVAL
) 1}},我收到EINVAL
错误。
我发现了this pdf,它讨论了在v4l2中实现多地图(非官方),并想知道这是否已实施。我也尝试过使用用户指针流I / O方法,其文档明确指出共享内存可以在这个方法中实现,但是当我请求缓冲区时我得到linuxtv.org
(根据文档中的说明) /dev/video0
这意味着相机不支持用户指针流I / O)。
注意:我想保持代码模块化,因此需要两个进程。如果这是不可能的,那么仍然可以在单个进程(多线程和全局帧缓冲区)中完成所有工作。
使用标准共享内存函数调用是不可能的,因为这两个进程必须映射到视频设备文件(/dev/shm
),而我无法在JOptionPane.showInputDialog(...)
下进行调用。
答案 0 :(得分:0)
多用户mmap的主要问题是需要在设备驱动程序端实现。即:即使某些设备可能支持多地图,其他设备也可能不支持。
因此,除非您可以控制与您的应用程序一起使用的相机,否则您最终会遇到不适用的相机,在这种情况下您的应用程序将无效。
因此,在任何情况下,您的应用程序都应提供处理非多地图设备的方法。
顺便说一下,您不需要多个进程来保持代码模块化。 多个进程有其优点(例如,私密性分离,崩溃恢复能力......),但也可能鼓励代码重复...
答案 1 :(得分:0)
现在这可能不相关.....
您不需要使用完整的monty multi consumer事物来执行此操作。我使用Python将mmap缓冲区的处理交给多个进程(python多线程一次只允许1个线程执行)
如果您正在运行多线程,那么工作线程可以获取缓冲区并在主线程触发时独立处理它
由于代码显然非常pythonesq我不会在这里发布,因为它在其他语言中没有意义,因为它使用python多处理支持。