SpringBoot использует сводку OpenCV

Java

предисловие

В последнее время в проекте требуется обработка картинок и изображений.Используется фреймворк с открытым исходным кодом OpenCV.Полное название Open Source Computer Vision Library,это кроссплатформенная библиотека компьютерного зрения.Текущие проекты основаны на SpringBoot,а OpenCv нужен Интеграция.Проведено обобщение проблем, возникших при использовании.

Загрузить и установить

Официальный сайт Opencv предоставляет версию для нескольких платформ, включая: Windows, IOS, Android, адрес выглядит следующим образом:opencv.org/releases/;Поскольку он разработан на платформе Windows и выпущен на платформе Linux, нам нужны как минимум две версии;

платформа окон

Скачать прямо с официального сайтаopencv-3.4.10-vc14_vc15.exeПросто установите его.После установки в папке opencv будут нужные нам файлы opencv-3410.jar, x64/opencv_java3410.dll, x86/opencv_java3410.dll в каталоге build\java;

платформа линукс

Платформа Linux требует от нас ручной компиляции и загрузкиopencv-3.4.10.zip, извлеките его в каталог /user/local, затем скомпилируйте и установите, выполните следующую команду:

cd /usr/local/opencv-3.4.10
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..
make -j8
sudo make install

После установки вы можете найти opencv-3410.jar в каталоге build/bin и libopencv_java3410.so в каталоге build/lib.

Комплексное использование

После того, как две платформы установлены отдельно, получаются соответствующие dll и т. д., jar-файлы, полученные двумя платформами, одинаковы, вы можете использовать любой из них, давайте посмотрим, как его использовать.

внешняя ссылка

Отделив jar-файл приложения от файла собственной библиотеки, а затем сославшись на него в проекте

относительный путь

Файл локальной библиотеки можно указать через System.loadLibrary, но этот метод требует указания -Djava.library.path во время выполнения, что может предоставить классы конфигурации:

@Configuration
public class NativeConfig {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
}

Во время выполнения вам нужно добавить -Djava.library.path= к пути, где dll хранится в аргументах ВМ, иначе произойдет следующая ошибка:

Caused by: java.lang.UnsatisfiedLinkError: no opencv_java3410 in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) ~[na:1.8.0_251]
	at java.lang.Runtime.loadLibrary0(Runtime.java:870) ~[na:1.8.0_251]
	at java.lang.System.loadLibrary(System.java:1122) ~[na:1.8.0_251]
	at com.springboot.opencv.NativeConfig.<clinit>(NativeConfig.java:10) ~[classes/:na]

абсолютный путь

Абсолютный путь к собственной библиотечной функции можно указать с помощью System.load:

@Configuration
public class NativeConfig {
    static {
        System.load("C:\\Users\\opencv\\build\\java\\x64\\opencv_java3410.dll");
    }
}

Шагнуть в яму 1

При запуске функции Opencv в среде IDE возникает следующая ошибка:

java.lang.UnsatisfiedLinkError: org.opencv.imgcodecs.Imgcodecs.imread_1(Ljava/lang/String;)J
	at org.opencv.imgcodecs.Imgcodecs.imread_1(Native Method) ~[opencv-3.4.10.jar:unknown]
	at org.opencv.imgcodecs.Imgcodecs.imread(Imgcodecs.java:332) ~[opencv-3.4.10.jar:unknown]
	at com.springboot.opencv.OpenCVController.testOpenCV(OpenCVController.java:13) ~[classes/:na]

Очевидно, что соответствующая функция локальной библиотеки не была найдена при использовании метода в jar-пакете, то есть loadLibrary оказалась неудачной, но на самом деле она ранее тестировалась в локальном Java-проекте, и ее можно передать. используются или нет. Инструменты приводят к сбою загрузки и в конечном итоге блокируютсяspring-boot-devtoolsИнструментарий, обеспечивающий такие функции, как динамическая загрузка, непосредственно удалите этот инструментарий или настройте следующие переключатели:

System.setProperty("spring.devtools.restart.enabled", "false");

внутренняя ссылка

Для упрощения развертывания файлы локальной библиотеки и файлы проекта можно упаковать в пакет jar, а файлы локальной библиотеки можно поместить в каталог ресурсов, чтобы их можно было упаковать в пакет jar. загрузите файлы локальной библиотеки в пакете jar.Файл библиотеки, через тест, обнаружено, что файл библиотеки в каталоге ресурсов может быть прочитан, но он не может быть успешно загружен через system.load, что соответствует пути, аналогичному к следующему:

file:/C:/Users/Administrator.SKY-20170404CXG/Desktop/springboot-0.0.1-SNAPSHOT.j
ar!/BOOT-INF/classes!/opencv

Последний метод — сохранить прочитанный файл библиотеки во временной папке системы, а затем получить абсолютный путь к файлу библиотеки, чтобы его можно было загрузить непосредственно через system.load.Для конкретного кода реализации см.Github

Шагнуть в яму 2

При выполнении компиляции и упаковки maven обнаруживается, что размер файла локальной библиотеки (файл dll или около того) станет больше.Предполагается, что maven также компилирует файл локальной библиотеки при компиляции, как отключить компиляцию указанного формат файла, и нужно всего лишь скопировать его:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <configuration>
       <encoding>UTF-8</encoding>
       <!-- maven编译下面扩展类型文件的时候直接复制原文件,而不会进行二次编码-->                 
       <nonFilteredFileExtensions>dll,so</nonFilteredFileExtensions>
    </configuration>
</plugin>

Сторонние пакеты JAR

В дополнение к двум вышеупомянутым способам, которые нам нужны для самостоятельной реализации загрузки, фактически мы также можем напрямую использовать пакет jar, предоставленный третьей стороной.OpenPnp, который содержит OpenCV.jar, нативную библиотеку, соответствующую каждой платформе, и пакетный класс для загрузки нативной библиотеки, посмотрев его исходный код, можно обнаружить, что на самом деле он тоже есть, оценив текущую систему, а затем копирование соответствующего файла нативной библиотеки во временную папку системы Next и, наконец, загрузка через system.load:

Files.createTempDirectory(`opencv_openpnp`);

Поскольку этот пакет учитывает все платформы, весь пакет немного великоват, более 100 МБ. Если развернутая система определена, вы можете загрузить указанный файл библиотеки самостоятельно, а затем таким же образом сделать публичный пакет для каждая система.использование;

Суммировать

Хотя в этой статье представлены некоторые сведения об использовании OpenCV в проектах, другие нативные библиотеки также могут использовать тот же метод; в этой статье основное внимание уделяется записи ям, возникающих во время использования, и способу загрузки файлов библиотеки.

кодовый адрес

Github