Java集成OpenCV总结
Java 如何使用OpenCV
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可能原因
内存泄漏 比如Mat对象没有release
CPU、内存本身不足,因为opencv本身还是比较消耗资源
javacv本身有bug或者opencv有bug,python使用场景比较多,建议python集成,rpc调用。