web-dev-qa-db-ja.com

OpenCV + Java = UnsatisfiedLinkError

USBウェブカメラからビデオストリームをキャプチャする必要があります。これには、Javaでの開発にOpencv 2.4.6を使用します。 こちら に記載されている手順に従います

「C:\ opencv\build\Java\x64」ディレクトリをシステムパスに追加し、Eclipseのライブラリに「opencv-246.jar」ファイルを含めます。あなたが炎を実行するとき

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

public class Main {
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat m  = Mat.eye(3, 3, CvType.CV_8UC1);
        System.out.println("m = " + m.dump());
    }
}

私は得る

m = [1, 0, 0;
  0, 1, 0;
  0, 0, 1]

OK =)

でも走るとき

import org.opencv.highgui.VideoCapture;

public class Main {
    public static void main(String[] args) {
        VideoCapture vc = new VideoCapture(0);
        if(vc.isOpened()){
            System.out.println("Works!");
        }
    }
}

私は得る

Exception in thread "main" Java.lang.UnsatisfiedLinkError: org.opencv.highgui.VideoCapture.n_VideoCapture(I)J
    at org.opencv.highgui.VideoCapture.n_VideoCapture(Native Method)
    at org.opencv.highgui.VideoCapture.<init>(VideoCapture.Java:113)
    at Main.main(Main.Java:5)

私が含むすべてのルートを追加します:

C:\ opencv\build\x64\vc10

1つずつですが、機能しません。

最後に、C:\ opencv\build\x64\vc10でOPENCV_DIRと呼ばれる変数を作成しますが、それでもUnsatisfiedLinkErrorが発生します。

私を助けてください!

21
efmoyano

2番目の例では、この行をスキップしました

 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

したがって、opencv libsはロードされませんでした、UnsatisfiedLinkErrorなど...

[編集]:

java.libraryパスの問題を強調表示してくれた@Jishnu Prathapに感謝します。その設定で問題が発生した場合でも、Java wrapper so/dll/dylib likeへの絶対パスを使用できます。 :

 System.load("/path to/our/Java_wrapper");
30
berak

JavaでOpenCVを使用しているときに同様のエラーが発生しました。解決するために2つのことを行いました。

  1. static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
  2. OpenCV dllまたは.soへのパスをjavalibpathまたはパスに追加しました。これは実際に何らかの理由で機能しなかったため、-OpenCV dllをsystem32フォルダーに入れました
3
Jishnu Prathap

opencv3.xを使用する一般ユーザー向け:

HighGUIモジュールは、Java)には存在しません。

import org.opencv.videoio.VideoCapture;

の代わりに

import org.opencv.highgui.VideoCapture;

videoioには、VideoCapture、VideoWriterが含まれています。

同様に:

imgcodecsにはimread/imwriteとその仲間が含まれます

例:

Highgui.imread(fileName)

->

 Imgcodecs.imread(fileName)
1

以下のコードを試してください

import org.opencv.core.CvType; import org.opencv.core.Mat;

nu.pattern.OpenCVをインポートします。

パブリッククラスOpencvMain {

public static void main( String[] args )
   {

      OpenCV.loadLocally();
      Mat mat = Mat.eye( 3, 3, CvType.CV_8UC1 );
      System.out.println( "mat = " + mat.dump() );
   }

}

1
Bala

だから、私もこの問題を抱えていて、あなたのすべての提案を実行しました。x64ウィンドウでは問題なく動作しましたが、x86では動作しませんでした。

ついに私は変更することで解決策を見つけました:

VideoCapture capture = new VideoCapture(0);

for

    VideoCapture capture = new VideoCapture();
    capture.open("resources/vid.MP4");

なぜこれが機能したのかはわかりませんが、同じ問題を抱えている誰かに役立つことを願っています。

0
Varu