未考虑 Java OpenCV VideoCapture 属性。需要避免最新帧的“当真”。多相机环境
Posted
技术标签:
【中文标题】未考虑 Java OpenCV VideoCapture 属性。需要避免最新帧的“当真”。多相机环境【英文标题】:Java OpenCV VideoCapture properties not being considered. Need to avoid “while true” for latest frame. Multi-camera environment 【发布时间】:2021-02-20 19:01:48 【问题描述】:我正在尝试创建一个使用 OpenCV 进行 RTSP 视频流处理(显示和处理 ALPR 的特定帧)的多摄像头软件。我遇到的最长时间的问题是必须为每个摄像机使用线程,而这些摄像机的唯一工作是“抓取()”帧,然后在另一个线程中检索和处理它们,以便我始终获得最新的帧。
Runnable streamGrabTask = new Runnable()
@Override
public void run()
while (!Thread.currentThread().isInterrupted())
stream.grab();
;
使用多个摄像头会非常快速地消耗资源。我尝试过使用 VideoIo 属性,但它们没有任何效果。
VideoCapture.set(Videoio.CAP_PROP_POS_FRAMES, anyInt);
VideoCapture.get(Videoio.CAP_PROP_POS_FRAMES); //returns 0 no matter what
VideoCapture.set(Videoio.CAP_PROP_BUFFERSIZE, anyInt);
VideoCapture.get(Videoio.CAP_PROP_BUFFERSIZE); // returns 0.0 no matter what
显示和处理任务理想情况下是这样的,不需要另一个线程去抓取:
Runnable displayTask = new Runnable()
@Override
public void run()
stream.grab();
stream.retrieve(concurrentMatMap.get(imageView.getId()));
//stuff hapenning here
;
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(displayTask, 500, 200, TimeUnit.MILLISECONDS);
但是像这样,显示器滞后并从我无法控制的内部缓冲区中获取帧。
我正在使用 opencv_java451、JavaFX11 和 Java 15。有没有一种方法可以获取最新的帧,而无需为每个摄像头设置一段时间的真线程?或者我可以做些什么来考虑属性以便考虑缓冲区大小或 Pos_frames?如果没有,是否有 OpenCV 的替代品实际上是最新的? Xuggler 停止,VLCJ 付费,资源消耗且多线程不可靠。
谢谢!
【问题讨论】:
【参考方案1】:多年来,我一直在维护 Xuggler 的一个分支。你可以看看https://github.com/olivierayache/xuggle-xuggler
【讨论】:
感谢您的回答!我会看看。会有新版本还是我必须编译库?我对这些事情的经验为 0.. 你可以在这里找到最后的快照dl.cloudsmith.io/public/olivier-ayache/first-repo/maven/xuggle/… 此版本适用于 Linux 和 Windows,您使用什么平台? 我正在使用 Windows。另外,您认为最新版本的 Xuggler 是否有助于在没有“while true”的情况下获得最新的框架?我已经用 5.4 进行了测试,它落后了。我的意思是链接不起作用。 这个链接解释了如何使用依赖cloudsmith.io/~olivier-ayache/repos/first-repo/packages/detail/…以上是关于未考虑 Java OpenCV VideoCapture 属性。需要避免最新帧的“当真”。多相机环境的主要内容,如果未能解决你的问题,请参考以下文章
以任何方式将 DroidCam 视频流式传输到 OpenCV Python
如何使用 GMock 模拟 OpenCV 相机,或者如何使用带有 GTest 的相机测试方法?
如何使用 Python3 opencv 捕获 mpeg-dash 流?