Java OpenCV от Maven

Есть ли способ получить 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). Можно ли добавить эту библиотеку так, чтобы мой проект включал ее и "забыл" о том, чтобы вручную добавить ее в путь к классам?

Ответ 1

Это сработало для меня.

nu.pattern.OpenCV.loadLibrary();

Я использую следующую зависимость maven

<dependency>
  <groupId>nu.pattern</groupId>
  <artifactId>opencv</artifactId>
  <version>2.4.9-4</version>
</dependency>

Ответ 2

Добавьте следующую зависимость в ваш 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. Удачного кодирования.

Ответ 3

В настоящее время не существует официального способа использовать официальные привязки Java для OpenCV в качестве зависимости Maven (как уже упоминалось в комментариях, артефакт Maven уже был запрошен в # 4588, но все еще остается без присмотра). Тем не менее, есть 3 возможных подхода к вашей проблеме:

  • java.lang.UnsatisfiedLinkError был сгенерирован, потому что вам нужно установить двоичные файлы привязки (то есть opencv_java) отдельно. Скорее всего, этот неофициальный артефакт не включает их (или не совместимых с вашей системой). Чтобы построить привязки:

    1. git clone хранилище OpenCV.
    2. git checkout предполагаемая версия (похоже, вы используете версию 2.4.9, хотя доступны более свежие версии)
    3. Следуйте инструкциям здесь для создания OpenCV и его привязок Java, что дает динамически связанную библиотеку ("opencv_java249.dll", "libopencv_java249.so" или что-то еще, в зависимости от вашей ОС).
    4. Скопируйте файл общей библиотеки в свой java.library.path (опять же, эта переменная зависит от системы, но может быть определена при запуске приложения). На этом этапе вы должны быть готовы использовать этот артефакт.
  • Альтернативой является использование других привязок: предустановки JavaCPP для OpenCV, кажется, работают так же хорошо, как и официальные, и они зарегистрированы в maven (двоичные файлы для различных платформ включены!). Просто помните, что API может не совпадать.

  • Это решение может показаться слишком далеко, но в прошлом оно вполне оправдывало меня. По сути, вы можете избежать использования привязок: внедрите свое решение в C++, а затем либо свяжите его с JVM через JNI, либо сделайте его отдельным приложением, используемым основным приложением через другие механизмы вашей системы (порождение процесса, I/О каналы, вы называете это). Например, я однажды создал служебный компонент для извлечения функций, к которому другие программы могли бы подключаться через сокеты ZeroMQ.

Ответ 4

Попробуйте, посмотрите, работает ли он:

  • nu.pattern.OpenCV.loadShared();
  • System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);

Больше информации здесь в разделе API: https://github.com/patternconsulting/opencv

Также есть 2.4.9-7 зависимость opencv.

Ответ 5

Просто используйте его   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 {
}

Ответ 6

Для тех, кто хочет использовать 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

Ответ 7

Все, что тебе нужно: установите 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);
    }
}