https://opencv-java-tutorials.readthedocs.io/en/latest/01-installing-opencv-for-java.html
主要是利用Homebrew安装
安装完成后OpenCV的jar包在 /usr/local/Cellar/opencv/4.7.0_1/share/java/opencv4
利用Homebrew安装的优势是简单轻松,无需考虑各种依赖,但劣势是不能自定义代码,例如有时候改动一点点源码以适应一些自定义场景,Homebrew安装方式就不能应对了。以下是手动编译OpenCV的JNI包的过程。
Xcode用MacOS系统自带的App Store下载,下载好之后记得打开一次,需要安装Xcode的核心依赖,不安装的话会找不到CXX编译器,其他xcodebuild相关的配置命令可以百度搜索。
官方源码下载地址: https://opencv.org/releases/
cmake下载 https://cmake.org/download/
cmake需要安装到环境变量中,打开cmake的GUI,菜单栏Tools→How to Install For Command Line Use,里面会有一键安装cmake的方法
OpenCV源码解压,然后创建文件夹存放构建生成物
mkdir XXX/opencv-4.X.0/build/
这里简单介绍一下构建OpenCV的过程:源码→cmake生成物→make生成物→make install最终生成物
首先添加一下临时的环境变量:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-19.0.1.jdk/Contents/Home/
在shell中执行可以插入JAVA_HOME这个临时变量,后面的cmake需要此变量以使得JAVA能被识别到。
然后进入build文件夹里面,使用以下命令配置生成cmake生成物
cmake -DCMAKE_SYSTEM_PROCESSOR=x86_64 -D CMAKE_OSX_ARCHITECTURES=x86_64 -D OPENCV_JAVA_TARGET_VERSION=19 -D JAVA_INCLUDE_PATH=/Library/Java/JavaVirtualMachines/jdk-19.0.1.jdk/Contents/Home/include -D BUILD_opencv_java=ON -D WITH_FFMPEG=ON -D WITH_IPP=OFF -D JAVA_AWT_LIBRARY=/Library/Java/JavaVirtualMachines/jdk-19.0.1.jdk/Contents/Home/lib/libawt.dylib -D BUILD_opencv_python3=OFF -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 -D BUILD_ZLIB=OFF -D CMAKE_INSTALL_PREFIX=./aa ..
参数解释,CMAKE_SYSTEM_PROCESSOR、CMAKE_OSX_ARCHITECTURES是硬件和系统架构,OPENCV_JAVA_TARGET_VERSION我这里用了JDK19,BUILD_opencv_java这个必须开着,WITH_IPP这个OFF貌似没什么问题,如果是ON的话还需要下载github上的文件(国内基本是断网的),BUILD_opencv_python3这个我用不上python就先不构建了,BUILD_ZLIB用OFF是因为我之前用Homebrew安装过zlib,已经下载过一次,但版本和本次构建的版本是不同的,因此会报错(详见这里),关掉不构建就可以了,因为zlib虽然版本不同,但是最终生成动态库的时候是兼容的。最后一个CMAKE_INSTALL_PREFIX是make install生成物存放的位置我就先放到aa文件夹了。
cmake命令的参数解释就是以上内容,最后的..表示cmake的源码位置在当前build目录的上层。
如果最后显示Configure done的字样就算cmake成功了,接下去轮到make。
make -j8
按JAVA的JDK19为目标环境进行预make,这里等待比较长时间的编译,机器CPU使用率也较高,各种连接。
最后
make install
一下,就可以生成动态链接库dylib和JNI接口的jar包了,位置在
XXX/opencv-4.X.0/build/aa/share/java/opencv4/opencv-480.jar
、
XXX/opencv-4.X.0/build/aa/share/java/opencv4/libopencv_java480.dylib
必须使用最新的opencv代码和opencv_contrib的代码(都使用master分支)
https://github.com/opencv/opencv/tree/master
https://github.com/opencv/opencv_contrib/tree/master
之后创建build文件夹和构建结果文件夹(例如aa)
mkdir XXX/opencv-4XX/build/
mkdir XXX/opencv-4XX/build/aa/
之后设定JAVA环境
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-19.0.1.jdk/Contents/Home/
(JAVA1.8的awt路径在/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/jre/lib/libawt.dylib)
进入opencv-4XX/build/文件夹,执行configure命令
cmake -DCMAKE_SYSTEM_PROCESSOR=x86_64 -D CMAKE_OSX_ARCHITECTURES=x86_64 -D OPENCV_JAVA_TARGET_VERSION=19 -D JAVA_INCLUDE_PATH=/Library/Java/JavaVirtualMachines/jdk-19.0.1.jdk/Contents/Home/include -D BUILD_opencv_java=ON -D WITH_FFMPEG=ON -D WITH_IPP=OFF -D JAVA_AWT_LIBRARY=/Library/Java/JavaVirtualMachines/jdk-19.0.1.jdk/Contents/Home/lib/libawt.dylib -D BUILD_opencv_python3=OFF -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 -D BUILD_ZLIB=OFF -D OPENCV_EXTRA_MODULES_PATH=/Users/kwok/Downloads/opencv_contrib/modules -D CMAKE_INSTALL_PREFIX=./aa ..
OPENCV_EXTRA_MODULES_PATH选项就是指向opencv_contrib的modules文件夹
configure成功后执行
make -j8
生成install前的构建产物 。最后install产生jar包合dylib库
make install
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home
cmake -DCMAKE_SYSTEM_PROCESSOR=x86_64 -D CMAKE_OSX_ARCHITECTURES=x86_64 -D OPENCV_JAVA_TARGET_VERSION=8 -D JAVA_INCLUDE_PATH=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/include -D JAVA_AWT_LIBRARY=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/jre/lib/libawt.dylib -D BUILD_opencv_java=ON -D WITH_FFMPEG=ON -D WITH_IPP=OFF -D BUILD_opencv_python3=OFF -D BUILD_ZLIB=OFF -D OPENCV_EXTRA_MODULES_PATH=/Users/kwok/Downloads/opencv_contrib-4.8.1/modules -D CMAKE_INSTALL_PREFIX=./aa ..
make -j8
make install
去cmake官网下载最新的cmake源码,编译安装cmake
./configure --prefix=/usr/local
make -j8
make install
Linux下载JDK1.8
https://www.oracle.com/java/technologies/downloads/#java8
Mac scp 命令上传文件,scp命令,然后密码验证,看上传进度条
scp -r ~/Downloads/opencv_contrib-4.8.1.zip root@192.168.2.76:/root/guojunjie
需要JDK、opencv、opencv_contrib,用tar(-zxvf)、unzip等解压
Linux上安装必须的环境
yum -y install gcc gcc-c++ openssl openssl-devel ant
配置OpenCV的编译变量
/usr/local/bin/cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=/root/guojunjie/opencv_contrib-4.8.1/modules -D CMAKE_INSTALL_PREFIX=./aa -D CMAKE_SYSTEM_PROCESSOR=x86_64 -D OPENCV_GENERATE_PKGCONFIG=ON -D ENABLE_CXX11=ON -D OPENCV_JAVA_TARGET_VERSION=8 -D JAVA_INCLUDE_PATH=/root/guojunjie/jdk1.8.0_401/include -D BUILD_opencv_java=ON -D WITH_IPP=OFF -D WITH_1394=OFF -D BUILD_opencv_xfeatures2d=OFF -D BUILD_SHARED_LIBS=OFF -D BUILD_TESTS=OFF -D BUILD_opencv_python3=OFF -D BUILD_ZLIB=OFF ..
编译
make -j8
make install
由于程序默认有几个读取dylib的地方(OpenCV的JAVA接口其实是一堆JNI接口,底层实现在dylib里面)(如果不知道这些地方,只加载jar时系统会报错并提示那几个地方)
我挑了其中一个 /Library/Java/Extensions
首先将jar文件和dylib(相当于windows的dll库)文件拷贝到 /Library/Java/Extensions 文件夹下
(此处可以通过运行时的VM变量指定一个系统中的JAVA第三方库的位置,例如-Djava.library.path=/Library/Java/JavaVirtualMachines/jdk-19.0.1.jdk/Contents/Home/bin)
jar文件最好再放到项目的/lib文件夹下,加载比较方便(需要在IDEA的"项目结构"功能中加载到全局库中)。本项目通过gitignore忽略了jar文件的跟踪,OpenCV的库需自行打包后再放到对应位置。
然后再重新执行程序就可以运行了。第一次运行的时候加载dylib会比较慢,差不多用了一分钟,后面都是一两秒就加载完比较快。
在《Learning OpenCV 3》这本书中,所有代码都是C++的,C++版本的OpenCV接口可以使用很多原生的HighGui功能,但是JAVA的接口就不行了,有很多诸如createTrackBar这种接口都没有,那图形化界面就只能通过别的库去实现。由于之前了解过JAVA目前最好的GUI库是JavaFX(其实也不咋地,毕竟极少开发者用JavaFX开发GUI),所以我选择用JavaFX实现那些书中需要图形化的实践内容。
要引入JavaFX很简单,依赖只需要引入javafx-controls、javafx-graphics、javafx-fxml、javafx-base即可,其他的配置详情可以看pom.xml。
引入JavaFX后,JDK需要用19的,要正常运行还需要编写module-info.java文件,否则会报找不到模块的错误。在项目的路径根目录(例如我这个项目设置dd.lo作为包的根目录)下面创建此文件,文件内容参考项目。IDEA的好处是有时候可以自动提示并按照你的需要自动添加模块。
例子中使用到的HAAR方法检测人脸需要加载预训练模型的XML文件,下载位置在
https://github.com/opencv/opencv/tree/3.4/data/haarcascades
目前测试了haar的alt效果基本达到要求
人脸识别的JAVA代码例子
https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html
其他参考文章
https://blog.csdn.net/bllxk/article/details/80828465
几种FaceRecognizer的使用
https://blog.csdn.net/weixin_61961691/article/details/132678185
关于人脸识别的一个样例做法
https://blog.csdn.net/lifetragedy/article/details/127133541
关于faceRecognizer的predict结果的confidence数值,解释是confidence越小越好,所以有些评论说叫loss更好
https://blog.51cto.com/u_16213704/7542891
https://blog.csdn.net/weixin_38361347/article/details/89643568
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。