web-dev-qa-db-ja.com

Java MavenのOpenCV

リポジトリから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)を使用しているとき。プロジェクトにライブラリを含め、手動でクラスパスに追加するのを忘れるような方法でこのライブラリを追加できますか?

16
deem

これは私のために働いた。

nu.pattern.OpenCV.loadLibrary();

私は次のMaven依存関係を使用しています

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

[〜#〜] 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 [〜#〜]の問題も解決するはずです。ハッピーコーディング。

15

これを試して、それが機能するかどうかを確認してください:

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

詳細については、APIセクションをご覧ください。 https://github.com/patternconsulting/opencv

2.4.9-7 opencv依存関係もあります。

6
Melinda

現在、公式の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"、または他の何かを生成します) OSに応じて)。
    4. 共有ライブラリファイルをJava.library.pathにコピーします(この変数もシステムに依存しますが、アプリケーションの実行時に定義できます)。この時点で、そのアーティファクトを使用する準備ができているはずです。
  • 他のバインディングを使用:の代わりに、 OpenCVのJavaCPPプリセット は公式のものと同じようにうまく機能するようで、これらはmaven(さまざまなプラットフォームのバイナリが含まれます) !)。 APIがまったく同じでない場合があることを覚えておいてください。

  • この解決策は遠すぎるかもしれませんが、私にとっては過去に合法的に機能していました。基本的に、バインディングの使用を避ける:C++でソリューションを実装し、JNIを介してJVMとリンクするか、システムの他のメカニズムを介してメインアプリケーションで使用される別のアプリケーションにします(プロセス生成、I/Oチャネル、名前を付けます)。たとえば、他のプログラムがZeroMQソケットを介して接続する機能抽出用のサービスコンポーネントを作成したことがあります。

使用するだけnu.pattern.OpenCV.loadShared();

この静的なvoidメソッドでクラスを書く

class Test {
public static void loadOpenCVNativeLibrary() {
nu.pattern.OpenCV.loadShared();
}
}

そして、このようなWebアプリケーション(たとえば、スプリングブート)のアプリケーションクラスで(静的メインで)それを呼び出した後

static {
Test.loadOpenCVNativeLibrary();
}
...
public static void main(String[] args) throws UnknownHostException {
}
2
Pr4y

MacOs環境でOpenCV 3.2を使用する場合は、次のリポジトリ定義を使用できます。

<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

1
Halil

必要なもの: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ライブラリを追加する必要があります。 Java.library.pathのlibフォルダーを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);
    }
}
0
user1198289