使用Java运行OpenCV
首先
由于想在Java中使用OpenCV库,但是却遇到了一些困难,所以我记录下了相应的步骤。作为周边知识的整理,这也涉及到了如何使用Java库、包等基础知识的理解,我也会提及这方面的内容。我会同时记录在终端上进行编译和使用IDE(尤其是IntelliJ)进行编译的方法。
环境
-
- macOS Catalina 10.15.5
-
- Java OpenJDK 13.0.2
OpenCV 4.3.0
Java的安装
我还是提供一下Java安装的方法(macOS)作为备选。我是用Homebrew来进行安装的。
# install Homebrew (if needed)
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# update packages, install cask, and allow cask to look up versions
brew update
brew tap homebrew/cask
brew tap homebrew/cask-versions
# install Java
brew cask install java #java13などとすればバージョンを指定してインストールできる
通过这个步骤,Java 将会被安装在 /Library/ 目录中。预计目录结构如下。
/Library/Java
|-- Extensions/ # Javaの拡張フォルダ
`-- JavaVirtualMachine/
`-- openjdk-13.0.2.jdk/ # インストールしたJDK
`-- Contents/
|-- Home/ # JDKのホームディレクトリ
| |--
| ...
|-- MacOS/
`-- Info.plist
顺便说一下,像往常一样
java --version
如果这样的话,你可以检查版本。
打开计算机视觉库
按照下面的第一个网站,您可以在macOS上安装OpenCV Java。截至2020年6月,最新的Java版本是4.3.0,因此如果不指定版本进行安装,将会安装这个版本。安装本身可能需要一些时间。
-
- OpenCV Java Tutorials: Install OpenCV 3.x under macOS
- 【Mac】JavaでOpenCVの環境設定に苦労したメモ
希望情况下,库将按照以下层次结构安装在/usr/local/Cellar/opencv/4.3.0_4/share/java/中。这可能会根据机器和软件版本的不同而变化。
/java/
`-- opencv4/
|-- opencv-430.jar # 静的ライブラリ
`-- libopencv_java430.dylib* # 動的ライブラリ
|--
...
顺便提一下,.jar文件是静态库,.dylib文件是动态库(dynamic library的缩写),据说动态库是在运行时而不是编译时被引用的库文件。1. 另外,.jar文件是将编译生成的class文件集合并压缩而成的文件。2.
编译和运行
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;
public class Test {
// Compulsory
static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
public static void main(String[] args) {
System.out.println("Welcome to OpenCV " + Core.VERSION);
Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
System.out.println("OpenCV Mat: " + m);
Mat mr1 = m.row(1);
mr1.setTo(new Scalar(1));
Mat mc5 = m.col(5);
mc5.setTo(new Scalar(5));
System.out.println("OpenCV Mat data:\n" + m.dump());
}
}
我试着创建这样一个文件,然后进行编译。
就像普通编译.java文件一样,在该文件所在的目录下进行编译。
javac Test.java

javac -classpath /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar Test.java
此外,在运行时还需要指定动态库的路径.
java -Djava.library.path="/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4" -classpath /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar: Test
在macOS上执行时,需要在类路径后面加上冒号:。在Windows上,则需要使用分号;。如果设置正确,
Welcome to OpenCV 4.3.0
OpenCV Mat: Mat [ 5*10*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x7fd0f2e3f230, dataAddr=0x7fd0f2e3f0c0 ]
OpenCV Mat data:
[ 0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
1, 1, 1, 1, 1, 5, 1, 1, 1, 1;
0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
0, 0, 0, 0, 0, 5, 0, 0, 0, 0]
以以下方式显示。
较为正确的翻译为:更准确地说
在Java中,我们可以将类编写在不同的文件中,并在另一个Java文件中使用这些类时,需要使用import和package。上面的例子只是一个单独的文件,但在编写程序时,文件之间通常存在相互依赖的情况。另外,在这个例子中,我们还希望引用OpenCV即外部库。
在这种情况下,和之前一样,
javac -classpath /usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar Test.java
当尝试将其编译为程序时,现在出现了关于包和导入的错误。
这意味着由于指定了类路径,所以javac会从该路径去寻找package和import,但结果却找不到。Java中,包和引入的层次结构通过点.而不是斜杠/来表示,而且默认是相对于执行编译命令的当前目录来编写的(参考网站)。也就是说,默认情况下类路径是当前目录,但由于使用了-classpath选项覆盖了默认值,所以现在找不到了。
在这种情况下,可以考虑的一个解决方案是将package和import的路径改为①绝对路径或者②在编译时从-classpath选项中改为相对路径。但是,绝对路径很长,并且当程序移至其他计算机时,必须每次都手动更改路径。此外,考虑编译选项并预先更改文件内容是不合理的,外部库的位置也因计算机而异,因此每次都需要重新编写路径。所以,最好还是使用相对于主文件的路径。
因此,我想要使用一种指定方式,而不是重写类路径来添加(也包括OpenCV库的路径)。通过使用冒号:连接,我们可以指定多个类路径,包括当前目录.和(OpenCV的路径)。这样做可以在保留原始包依赖关系的同时,添加了新的OpenCV库的类路径。
javac -classpath .:/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar Test.java # コンパイル
java -Djava.library.path="/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4" -classpath .:/usr/local/Cellar/opencv/4.3.0_4/share/java/opencv4/opencv-430.jar: Test # 実行
通过这样的设置,现在可以正确地进行编译和执行了。
(参考网站)
Java编程:包和类路径
其他方式
这种方法是在编译和执行时临时指定类路径的方法,但是因为/Library/Extensions/是Java的扩展文件夹,所以你也可以将jar文件和dylib文件放在这里来设置路径。这样一来就不需要每次都指定-classpath选项了。
在IntelliJ中的配置方法
以下のは、Java開発でよく使われる優れたIDE(統合開発環境)であるIntelliJです。先ほどはエディタとターミナルを使用してOpenCVの使い方の紹介でしたが、IntelliJを使用する場合の設定方法も記述しておきます。ちなみに、IntelliJ自体のチュートリアルは以下にあります。
-
- Overview of the user interface
- Video tutorials
基本设置
为了避免遗漏,我也将从安装IntelliJ到进行基本设置的步骤记录下来。
安装
可以从安装页面上选择操作系统,然后下载Community Edition(学生也可以选择下载licensed版本)。
插件
如果需要的话,欢迎安装插件进入IntelliJ IDEA的Configure -> Plugins窗口中(比如”Java Visualizer”等非常方便的插件)。如果安装了插件,需要重新启动IntelliJ。
SDK的设置

按照”Configure -> Structure for New Projects”,设置SDK(软件开发工具包)。根据这篇文档的步骤进行设置即可。
设置OpenCV库
使用上述设置,可以开发基本程序,但在使用外部库时需要进行设置。 IntelliJ是一个集成开发环境(IDE),通过它进行编译和执行,因此在终端上进行编译和执行时需要事先设置类路径之类的东西。
以本次OpenCV为例,下面解释其流程。


如果我们试着运行与上述相同的测试文件,并且得到了正确的结果,那就意味着我们已经正确配置好了。顺便提一下,
-
- importの段階でコンパイルエラーが出るのなら,External Libraryとしてopencv-430.jarがちゃんと設定されていないことになるので1枚目の写真の段階を確認.
static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
でエラーが出るのなら,これは”Native Library Locations”がちゃんと設定されていないということになるので2枚目の写真の段階で設定がうまくできていないことになります.
我参考了以下网站上仔细描述的步骤来完成这个流程。根据OpenCV的版本可能需要进行一些修正。
- How to set-up OpenCV in Intellij IDEA
https://qastack.jp/software/66305/what-is-a-dylib ←点击此链接查看
https://www.sejuku.net/blog/65313 ←点击此链接查看