Ответ 1
Это сработало для меня.
nu.pattern.OpenCV.loadLibrary();
Я использую следующую зависимость maven
<dependency>
<groupId>nu.pattern</groupId>
<artifactId>opencv</artifactId>
<version>2.4.9-4</version>
</dependency>
Есть ли способ получить 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)
. Можно ли добавить эту библиотеку так, чтобы мой проект включал ее и "забыл" о том, чтобы вручную добавить ее в путь к классам?
Это сработало для меня.
nu.pattern.OpenCV.loadLibrary();
Я использую следующую зависимость maven
<dependency>
<groupId>nu.pattern</groupId>
<artifactId>opencv</artifactId>
<version>2.4.9-4</version>
</dependency>
Добавьте следующую зависимость в ваш 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. Удачного кодирования.
В настоящее время не существует официального способа использовать официальные привязки Java для OpenCV в качестве зависимости Maven (как уже упоминалось в комментариях, артефакт Maven уже был запрошен в # 4588, но все еще остается без присмотра). Тем не менее, есть 3 возможных подхода к вашей проблеме:
java.lang.UnsatisfiedLinkError
был сгенерирован, потому что вам нужно установить двоичные файлы привязки (то есть opencv_java) отдельно. Скорее всего, этот неофициальный артефакт не включает их (или не совместимых с вашей системой). Чтобы построить привязки:
git clone
хранилище OpenCV.git checkout
предполагаемая версия (похоже, вы используете версию 2.4.9, хотя доступны более свежие версии)java.library.path
(опять же, эта переменная зависит от системы, но может быть определена при запуске приложения). На этом этапе вы должны быть готовы использовать этот артефакт.Альтернативой является использование других привязок: предустановки JavaCPP для OpenCV, кажется, работают так же хорошо, как и официальные, и они зарегистрированы в maven (двоичные файлы для различных платформ включены!). Просто помните, что API может не совпадать.
Это решение может показаться слишком далеко, но в прошлом оно вполне оправдывало меня. По сути, вы можете избежать использования привязок: внедрите свое решение в C++, а затем либо свяжите его с JVM через JNI, либо сделайте его отдельным приложением, используемым основным приложением через другие механизмы вашей системы (порождение процесса, I/О каналы, вы называете это). Например, я однажды создал служебный компонент для извлечения функций, к которому другие программы могли бы подключаться через сокеты ZeroMQ.
Попробуйте, посмотрите, работает ли он:
nu.pattern.OpenCV.loadShared();
System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
Больше информации здесь в разделе API: https://github.com/patternconsulting/opencv
Также есть 2.4.9-7 зависимость opencv.
Просто используйте его nu.pattern.OpenCV.loadShared();
написать класс с помощью этого статического метода void
class Test {
public static void loadOpenCVNativeLibrary() {
nu.pattern.OpenCV.loadShared();
}
}
и после вызова его в вашем классе приложения (со статическим main) для веб-приложения (например, w760 > boot), например
static {
Test.loadOpenCVNativeLibrary();
}
...
public static void main(String[] args) throws UnknownHostException {
}
Для тех, кто хочет использовать OpenCV 3.2 в среде MacOS, вы можете использовать следующее определение репозитория:
<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
Все, что тебе нужно: установите jar в локальный репозиторий maven с помощью:
mvn install:install-file -Dfile=C:\opencv411\build\java\opencv-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. Я сделал это, добавив папку lib в java.library.path к плагину 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);
}
}