文章

Java集成OpenCV总结

Java 如何使用OpenCV

官网:https://opencv.org/

Github:https://github.com/opencv/opencv

Java集成:https://github.com/bytedeco/javacv

  <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.10</version>
  </dependency>
Loader.load(org.bytedeco.opencv.opencv_java.class);

集成常见坑总结

一、1.5.10 CentOS Glibc版本问题

最新版本的OpenCV需要使用GcLib 2.27或者更高,当前需要自行编译https://ftp.gnu.org/gnu/glibc/

issue: https://github.com/bytedeco/javacv/issues/2136

当前解决方案:采用1.5.7版本

二、1.5.10以下 存在webp CVE-2023-5129

简述:存在解析某些图片会崩溃

详见:https://nvd.nist.gov/vuln/detail/CVE-2023-5129

本质是OpenCV4.8.0以上才修复,javacv需要升级最新版本1.5.10才行。

详情见releases:https://github.com/bytedeco/javacv/releases

三、CentOS 部署坑 HeadLess

issue详见:https://github.com/bytedeco/javacpp-presets/issues/1223

CentOS7 部署需要依赖gtk2,手动安装方式 yum -y install gtk2

另类解决方案issue: https://github.com/bytedeco/javacpp-presets/issues/593

四、池化常见实例对象

在使用opencv的对象时,注意不要每次new,性能很差,且大多数opencv实例非线程安全不支持并发,需要采用池化技术进行初始化,可以考虑类似动态线程池进行实现。

五、使用时注意内存OOM

因为javacv调用opencv采用的是jni,所以很多内存使用都是堆外内存,一般我们的jvm参数都默认为机器内存的xxx,所以堆外内存有限,使用时对于opencv的实例需要采用池化技术,对于机器或者容器需要预留堆外内存,防止机器kill java进程。

六、JVM Crash可能原因

  1. 内存泄漏 比如Mat对象没有release

  2. CPU、内存本身不足,因为opencv本身还是比较消耗资源

  3. javacv本身有bug或者opencv有bug,python使用场景比较多,建议python集成,rpc调用。