【发布时间】:2019-01-31 20:52:04
【问题描述】:
TLDR:如何在 Julia 中实现低延迟、低 CPU 影响的网络摄像头采集?
编辑:我也在julia devs forum上发布了这个
我是 Julia 的新手。我有兴趣处理来自连接网络摄像头的视频源,看看我可以从 Julia 中获得什么样的性能。
我正在使用 Linux Ubuntu,16.04。
我发现通过 video4linux 获取网络摄像头输入的唯一方法是通过 VideoIO,它在我的系统上运行。然而,视频有一个不可接受的延迟,最长为 4 秒。我假设这是由驱动程序和/或 libav 的帧缓冲给出的(或者是 ffmpeg,我不知道)。使用任何名副其实的相机 api,我应该能够访问获取的最新相机帧......或者至少设置我从中弹出帧的队列的大小。似乎 VideoIO 中没有这样的选项,或者我错过了它。
能够向非技术人员展示 Julia 作为一种高性能语言对我来说真的很重要......所以这种延迟会毁掉我希望完成的演示。
编辑:这是我的一些代码:
module myViewCam
export myView
import VideoIO, ImageView;
function myView()
camera = VideoIO.opencamera();
buf = VideoIO.read(camera);
guidict = ImageView.imshow(buf);
while !eof(camera)
VideoIO.read!(camera, buf);
ImageView.imshow(guidict["gui"]["canvas"], buf);
sleep(0.00001);
end
end
end
假设上面是 Julia 提示符下 myViewCam.jl 的内容(“REPL”),我输入:
include("myViewCam.jl");
myViewCam.myView();
请注意,这是对“VideoIO.viewcam()”函数的修复,它似乎无法开箱即用。
在我的系统上,这使 Julia 线程的 cpu 使用率达到了大约 100%,在视频流开始时有大约 4 秒的延迟,但随着时间的推移,这会变得均匀,直到它达到大约 0.5 秒的延迟。显然有一些队列从中弹出帧。
【问题讨论】:
-
不足以成为答案,但看起来 VideoIO 将
DEFAULT_CAMERA_DEVICE和DEFAULT_CAMERA_FORMAT包装成一个适用于文件和设备的AVInput对象。尝试挖掘AVInput属性并查看/减小缓冲区大小。或者确保您的其他代码不会导致延迟...... -
@stillearningsomething,我在 VideoIO 的 repo 中查看了相同的 jl 文件。如果没有大量的时间投入,您的建议是无法完成的,最终导致了 api 的更新。关于我的代码,还没有什么可说的。我用几种不同的方式修改了 VideoIO.viewcam(),都产生了相同的延迟。这显然是在引擎盖下排队框架的问题,可能在驱动程序中。
-
@stillearningsomething,添加了一些代码来看看
-
我认为这将是一个需要解决的重要话题。我不可能是唯一一个想要在 Julia 中进行实时视频处理的人。我也在 julia discourse 论坛上发布了这个问题:discourse.julialang.org/t/…
-
OpenCV 工作吗?如果是这样,那么github.com/opencv/opencv_contrib/tree/master/modules/julia 和github.com/opencv/opencv_contrib/blob/master/modules/julia/… 您需要编写代码来转换为 julia 图像格式。主要只是置换最后两个数组维度,然后使用正确的颜色。