Есть ли способ установить зависимость для родной части javacv в maven, без ручной установки и настройки java .library.path? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть зависимости от org.bytedeco:opencv:4.1.2-1.5.2, который в свою очередь добавляется в проект как

        <groupId>org.datavec</groupId>
        <artifactId>datavec-data-image</artifactId>
        <version>${datavec.version}</version>

И для нужд datavec-data-image open-cv загружается хорошо и все внутренние open-cv действия выполняются.

Затем я бы хотел явно выполнить некоторые open cv. Я использую класс из https://github.com/rostrovsky/pdf-table, который выполняет эту работу:

public class PdfTableReader {

    private TableExtractor extractor;
    private PdfTableSettings settings;

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

, и он терпит неудачу с

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java412 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at pdftable.PdfTableReader.<clinit>(PdfTableReader.java:32)
    at pdftable.ExtractSyzlekFromPdf.main(ExtractSyzlekFromPdf.java:12)

Что я должен сделать, чтобы сделать это явным javacv часть для работы с datavec кодом изображения без выполнения двойной явной установки open-cv в какое-либо место на моем p c и явной настройки java.library.path? По крайней мере, код изображения datavec получает его как-то без этой явной настройки.

Я также пытался ответить на этот ответ: { ссылка }, но безуспешно (если я правильно понял они используют зависимость, которая доставляет нативные библиотеки кросс-платформенным способом, то есть отгружает все двоичные файлы платформы, а необходимая используется на правильной платформе). Я предполагаю, что должен быть способ сделать java.library.path динамически обновляемым, если к проекту присоединены собственные двоичные файлы open-cv, упакованные в зависимости maven. Но как?

Если бы ребята из DL4J могли объяснить, как правильно использовать там часть javacv, это было бы прекрасно.

1 Ответ

1 голос
/ 23 апреля 2020

API Java OpenCV, найденный в пакете org.opencv, не поставляется с загрузчиком, поэтому библиотеки должны загружаться чем-то другим извне. В случае JavaCPP пресетов для OpenCV библиотеки и оболочки упакованы в файлы JAR, и мы можем вызвать Loader.load(opencv_java.class), чтобы загрузить все, как описано здесь:
https://github.com/bytedeco/javacpp-presets/tree/master/opencv#documentation

JavaCV, Deeplearning4j и DataVe c не используют этот Java API OpenCV, они используют API, найденный в пакете org.bytedeco.opencv, который загружает все автоматически, поэтому им не нужно позвони что угодно.

...