# learn-opencv **Repository Path**: alwayslearning/learn-opencv ## Basic Information - **Project Name**: learn-opencv - **Description**: 在《Learning OpenCV 3》这本书的过程中,书中的代码是C++的,笔者在实践过程中使用的是JAVA开发,本项旨在目收集笔者在学习过程中用JAVA代码实现的书中案例。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-02 - **Last Updated**: 2025-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OpenCV学习项目 ## MacOS安装OpenCV 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 ## MacOS编译OpenCV [参考1](https://www.zhihu.com/question/553650328/answer/3200776529?utm_id=0) [参考2](https://stackoverflow.com/questions/51204275/not-able-to-find-face-and-facerecognition-classes) 利用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,已经下载过一次,但版本和本次构建的版本是不同的,因此会报错(详见[这里]( https://blog.csdn.net/NeoZng/article/details/123085674)),关掉不构建就可以了,因为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_contrib的方法 [参考3](https://stackoverflow.com/questions/51204275/not-able-to-find-face-and-facerecognition-classes) 必须使用最新的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` ## 附JAVA1.8的编译命令 `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` ## 附Linux上编译OpenCV的过程 去cmake官网下载最新的cmake源码,编译安装cmake https://cmake.org/files/ `./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会比较慢,差不多用了一分钟,后面都是一两秒就加载完比较快。 ## 引入JavaFX制作图形化界面 在《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://stackoverflow.com/questions/39010477/confidence-in-opencv-facerecognizer-predict-method-output ## 图片特征匹配 https://blog.51cto.com/u_16213704/7542891 ## PDF内容提取 https://pdfbox.apache.org/ https://blog.csdn.net/weixin_38361347/article/details/89643568 ## OpenCV的JavaDoc文档 https://docs.opencv.org/4.8.0/javadoc/index.html