未考虑 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 流?

错误:标识符 <uint8_t> 未定义,是不是可以在 openCV 中使用

java版 opencv 图像对比相似度怎么实现

什么是 API 19 中 OpenCV 的“未找到本机方法”错误?