是否有任何方法可以从存储库中获取OpenCV?我应该将哪个工件添加到pom.xml
?我发现的每个教程都是从14年来的,似乎有些变化了 - 他们说这还不是在Maven官方存储库中,但我已经找到了条目:
<!-- https://mvnrepository.com/artifact/nu.pattern/opencv -->
<dependency>
<groupId>nu.pattern</groupId>
<artifactId>opencv</artifactId>
<version>2.4.9-7</version>
</dependency>
可悲的是,我有错误
Caused by: java.lang.UnsatisfiedLinkError: no opencv_java249 in java.library.path
当我使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME)
时。我可以以一种使我的项目包括它的方式添加此库,并"忘记"有关将其添加到ClassPath中的"忘记"?
在您的 pom 文件中添加以下依赖性:
<dependency>
<groupId>org.openpnp</groupId>
<artifactId>opencv</artifactId>
<version>3.2.0-0</version>
</dependency>
并更换以下行:
System.loadLibrary(Core.NATIVE_LIBRARY_NAME)
nu.pattern.OpenCV.loadShared();
这也应该解决 Windows 中的问题。快乐的编码。
这对我有用。
nu.pattern.OpenCV.loadLibrary();
我正在使用以下maven依赖性
<dependency>
<groupId>nu.pattern</groupId>
<artifactId>opencv</artifactId>
<version>2.4.9-4</version>
</dependency>
尝试一下,看看它是否有效:
-
nu.pattern.OpenCV.loadShared();
-
System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
API部分的更多信息:https://github.com/patternconsulting/opencv
也有2.4.9-7 openCV依赖。
目前没有官方方法可以将官方的Java绑定作为Maven依赖性(如评论中已经提到的那样,Maven Artifact已在#4588中要求,但仍在无人看管)。尽管如此,您的问题有3种可能的方法:
-
java.lang.UnsatisfiedLinkError
是因为您需要分别安装绑定的二进制文件(即" opencv_java")。最有可能的非官方伪像不包括它们(或与您的系统兼容的工件)。为了构建绑定:-
git clone
openCV存储库。 -
git checkout
预期版本(似乎您正在使用2.4.9版,尽管有更多的版本) - 请按照此处的说明构建OpenCV及其Java绑定,从而产生动态链接的库(" OpenCV_JAVA249.DLL"," LIBOPENCV_JAVA249.SO"或其他方面,根据您的操作系统。 )。
) -
- 将共享库文件复制到您的
java.library.path
(同样,此变量是系统依赖性的,但是在运行应用程序时可以定义)。此时,您应该准备好使用该工具。 一种替代方法是使用其他绑定:openCV的JavACPP预设似乎与官方的JAVACPP预设工作一样好,并且这些预设在Maven中注册(包括各种平台的二进制文件!)。请记住,API可能不完全相同。
这个解决方案听起来可能太远了,但是过去它对我有合法的工作。基本上,您可以避免使用绑定:在C 中实现解决方案,然后通过JNI将其与JVM链接或将其链接为单独的应用程序,由Main Application通过系统的其他机制使用(过程产卵,I/O频道,您将其命名)。例如,我曾经为其他程序通过Zeromq插座连接到功能提取的服务组件。
只需使用它 nu.pattern.opencv.loadshared();
用这种静态void方法写一个类
class Test {
public static void loadOpenCVNativeLibrary() {
nu.pattern.OpenCV.loadShared();
}
}
和在您的应用程序类(带有静态主)的Web应用程序(例如Spring Boot)之后
static {
Test.loadOpenCVNativeLibrary();
}
...
public static void main(String[] args) throws UnknownHostException {
}
您需要的一切:在本地Maven存储库中安装JAR:
mvn install:install-file -Dfile=C:opencv411buildjavaopencv-411.jar -DgroupId=org -DartifactId=opencv -Dversion=4.1.1 -Dpackaging=jar
在pom.xml中创建一个依赖性:
<dependency>
<groupId>org</groupId>
<artifactId>opencv</artifactId>
<version>4.1.1</version>
</dependency>
现在jar已经打开了,我们需要以某种方式添加OpenCV库。我通过在Java.library.path中添加Lib文件夹到Maven-Surefire插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>-Djava.library.path=${project.build.outputDirectory}/lib</argLine>
</configuration>
</plugin>
public static void main(String[] arges) throws MalformedURLException,
IOException, Exception {
loadLibraries();
// create and print on screen a 3x3 identity matrix
System.out.println("Create a 3x3 identity matrix...");
Mat mat = Mat.eye(3, 3, CvType.CV_8UC1);
System.out.println("mat = " + mat.dump());
// prepare to convert a RGB image in gray scale
String location = "resources/Poli.jpg";
System.out.print("Convert the image at " + location + " in gray scale... ");
// get the jpeg image from the internal resource folder
Mat image = Imgcodecs.imread(location);
// convert the image in gray scale
Imgproc.cvtColor(image, image, Imgproc.COLOR_RGB2GRAY);
// write the new image on disk
Imgcodecs.imwrite("resources/Poli-gray.jpg", image);
System.out.println("Done!");
}
private static void loadLibraries() {
try {
InputStream in = null;
File fileOut = null;
String osName = System.getProperty("os.name");
// String opencvpath = System.getProperty("user.dir");
String opencvpath = "C:\opencv411\build\java\";
if (osName.startsWith("Windows")) {
int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
if (bitness == 32) {
opencvpath = opencvpath + "\x86\";
} else if (bitness == 64) {
opencvpath = opencvpath + "\x64\";
} else {
opencvpath = opencvpath + "\x86\";
}
} else if (osName.equals("Mac OS X")) {
opencvpath = opencvpath + "Your path to .dylib";
}
System.out.println(opencvpath);
// System.out.println("Core.NATIVE_LIBRARY_NAME = " + Core.NATIVE_LIBRARY_NAME);
System.out.println("Core.NATIVE_LIBRARY_NAME = " + "opencv_java411.dll");
// System.load(opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll");
System.load(opencvpath + "opencv_java411.dll");
} catch (Exception e) {
throw new RuntimeException("Failed to load opencv native library", e);
}
}
对于那些想要在MacOS环境中使用OpenCV 3.2的人,您可以使用以下存储库定义:
<repositories>
<repository>
<id>kodfarki</id>
<url>https://raw.githubusercontent.com/kodfarki/repository/master/</url>
</repository>
</repositories>
https://github.com/kodfarki/opencv-example中还有一个示例项目。
要使用此示例项目,您仍然需要安装OpenCV二进制文件
brew tap homebrew/science
brew install opencv3 --with-java --with-contrib
对于Windows,@Sachin Aryal的答案存在问题。@anirban Chakraborty的答案是一个很好的提示。但是,在此线程中所述的运行时仍然存在问题。
最终用OpenCV.loadLocally();
代替CC_11为我工作。