предисловие
В последнее время в проекте требуется обработка картинок и изображений.Используется фреймворк с открытым исходным кодом 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 в проектах, другие нативные библиотеки также могут использовать тот же метод; в этой статье основное внимание уделяется записи ям, возникающих во время использования, и способу загрузки файлов библиотеки.