質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1284閲覧

EclipseでJava用のOpenCVのプログラムを動かしたい

aiueoaiueoaiue

総合スコア94

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2017/11/07 11:47

編集2017/11/28 05:04

#EclipseでJava用のOpenCVのプログラムを動かしたい
Eclipseで2つの画像を比較した時のヒストグラム値を算出するというプログラムを動かしたいのですが、エラーが出てしまいどうすればよいかわかりません。

ソースは以下に示した通りです。

package def; import java.util.ArrayList; import java.util.List; import org.opencv.core.*; import org.opencv.imgcodecs.*; import org.opencv.imgproc.Imgproc; public class ImageComparison { public static void main(String[] args) { System.out.println("処理開始"); System.loadLibrary(Core.NATIVE_LIBRARY_NAME); new Demo().run(); System.out.println("処理終了"); } } class Demo { public void run() { List<Double> histList = new ArrayList<Double>(); System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat image[] = new Mat[2]; image[0] = Imgcodecs.imread("source/name1.png"); image[1] = Imgcodecs.imread("source/name2.png"); Mat hist1 = new Mat(); Imgproc.cvtColor(image[0], image[0], Imgproc.COLOR_RGB2GRAY); Imgproc.cvtColor(image[1], image[1], Imgproc.COLOR_RGB2GRAY); List<Mat> src1 = new ArrayList<Mat>(); src1.add(image[0]); Imgproc.calcHist(src1, new MatOfInt(0), new Mat(), hist1, new MatOfInt(256), new MatOfFloat(0, 64)); Mat hist2 = new Mat(); List<Mat> src2 = new ArrayList<Mat>(); src2.add(image[1]); Imgproc.calcHist(src2, new MatOfInt(0), new Mat(), hist2, new MatOfInt(256), new MatOfFloat(0, 64)); histList.add(Imgproc.compareHist(hist1, hist2, 0)); Imgcodecs.imwrite("source/test.png", image[0]); System.out.println(image[0]); System.out.println(image[1]); System.out.println(histList); } }

#エラーメッセージ
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Core を変数に解決できません

at def.ImageComparison.main(ImageComparison.java:13)

#試したこと
teratailで似た質問を見かけ、変数のスコープが関係しているらしいというのはわかったのですが、何分初心者なものでよくわかりませんでした。
#最終的なソース

Java

1package def; 2 3import java.util.ArrayList; 4import java.util.List; 5 6import org.opencv.core.Core; 7import org.opencv.core.Mat; 8import org.opencv.core.MatOfFloat; 9import org.opencv.core.MatOfInt; 10import org.opencv.imgcodecs.Imgcodecs; 11import org.opencv.imgproc.Imgproc; 12 13public class ImageComparison { 14 public static void main(String[] args) { 15 System.out.println("処理開始"); 16 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 17 new Demo().run(); 18 19 System.out.println("処理終了"); 20 } 21} 22 23class Demo { 24 public void run() { 25 List<Double> histList = new ArrayList<Double>(); 26 27 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 28 Mat image[] = new Mat[2]; 29 image[0] = Imgcodecs.imread("F:\yamauchi\opencv-IC\source\name1.png"); 30 image[1] = Imgcodecs.imread("F:\yamauchi\opencv-IC\source\name2.png"); 31 Mat hist1 = new Mat(); 32 33 Imgproc.cvtColor(image[0], image[0], Imgproc.COLOR_RGB2GRAY); // 逕サ蜒上・繧ー繝ャ繝シ繧ケ繧ア繝シ繝ォ螟画鋤 34 Imgproc.cvtColor(image[1], image[1], Imgproc.COLOR_RGB2GRAY); 35 36 List<Mat> src1 = new ArrayList<Mat>(); 37 src1.add(image[0]); 38 39 Imgproc.calcHist(src1, new MatOfInt(0), new Mat(), hist1, new MatOfInt(256), new MatOfFloat(0, 64)); 40 41 Mat hist2 = new Mat(); 42 List<Mat> src2 = new ArrayList<Mat>(); 43 src2.add(image[1]); 44 45 Imgproc.calcHist(src2, new MatOfInt(0), new Mat(), hist2, new MatOfInt(256), new MatOfFloat(0, 64)); 46 47 histList.add(Imgproc.compareHist(hist1, hist2, 0)); 48 49 Imgcodecs.imwrite("source/test.png", image[0]); 50 System.out.println(image[0]); 51 System.out.println(image[1]); 52 System.out.println(histList); 53 } 54 55 56}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/11/07 12:41

質問を編集し、コードの行を選択した上で<code>ボタンを押してください。そうすると字下げされた見やすいソースコードが表示されます。
guest

回答2

0

KSwordOfHasteさんがほぼ回答を書いてらっしゃるのでエラーチェックがあるソースを記載します参考まで。
前回の質問と同じなのですが、Imgcodecs.imreadの戻り値はそのまま使用しないでください
Matクラスにあるempty()メソッドを使って、imreadが正常に読み取れたかどうかの確認してください。

引用部分を書き換えたサンプルソースです。

Java

1 Mat image[] = new Mat[2]; 2 image[0] = Imgcodecs.imread("source/name1.png"); 3 image[1] = Imgcodecs.imread("source/name2.png"); 4 Mat hist1 = new Mat(); 5 6 Imgproc.cvtColor(image[0], image[0], Imgproc.COLOR_RGB2GRAY); 7 Imgproc.cvtColor(image[1], image[1], Imgproc.COLOR_RGB2GRAY);

Java

1import java.util.ArrayList; 2import java.util.List; 3 4import org.opencv.core.*; 5import org.opencv.imgcodecs.*; 6import org.opencv.imgproc.Imgproc; 7 8public class ImageComparison { 9 public static void main(String[] args) { 10 System.out.println("処理開始"); 11 new Demo().run(); 12 System.out.println("処理終了"); 13 } 14} 15 16class Demo { 17 static { 18 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 19 } 20 21 public void run() { 22 String[] strArray = new String[] { "source/name1.png", "source/name2.png" }; 23 List<Mat> temp = new ArrayList<Mat>(); 24 for (String str : strArray) { 25 java.io.File f = new java.io.File(str); 26 // ファイル未存在時 27 if (!f.exists()) 28 throw new RuntimeException(f.getAbsolutePath()); 29 // 画像をグレースケールで読み込み。 30 Mat m = Imgcodecs.imread(f.getAbsolutePath(), Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); 31 // 読めなかった時 32 if (m.empty()) 33 throw new RuntimeException(f.getAbsolutePath()); 34 temp.add(m); 35 } 36 Mat image[] = temp.toArray(new Mat[0]); 37 Mat hist1 = new Mat(); 38 39 List<Mat> src1 = new ArrayList<Mat>(); 40 src1.add(image[0]); 41 42 Imgproc.calcHist(src1, new MatOfInt(0), new Mat(), hist1, new MatOfInt(256), new MatOfFloat(0, 64)); 43 44 Mat hist2 = new Mat(); 45 List<Mat> src2 = new ArrayList<Mat>(); 46 src2.add(image[1]); 47 48 Imgproc.calcHist(src2, new MatOfInt(0), new Mat(), hist2, new MatOfInt(256), new MatOfFloat(0, 64)); 49 List<Double> histList = new ArrayList<Double>(); 50 histList.add(Imgproc.compareHist(hist1, hist2, 0)); 51 52 Imgcodecs.imwrite("source/test.png", image[0]); 53 System.out.println(image[0]); 54 System.out.println(image[1]); 55 System.out.println(histList); 56 } 57}

投稿2017/11/07 15:14

編集2017/11/07 20:36
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ご質問のとおりのコードを(画像ファイルのパスのみ絶対パスに変更し)実行したところ、実行時例外などは発生せずに正常終了しました。自分の環境は

Windows10 (64bit)
Eclipse mars
JDK 1.8.0_152
opencv 3.3.0

opencvのjar/dllはプロジェクトの外側の以下の場所に置いてあります
classes: c:\Tools\opencv-330\opencv\build\java\opencv-330.jar
native library locations: c:\Tools\opencv-330\opencv\build\java\x64

プログラムコード自体には問題なく、Eclipseのプロジェクトへ以下のようにライブラリーを設定してやればうまくいくと思います。

イメージ説明

投稿2017/11/07 12:47

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiueoaiueoaiue

2017/11/07 13:26

修正してみたのですが実行しようとすると起動エラー 選択にはメイン型が含まれていません。 と出て実行自体が出来なくなりました。これは何が原因なんでしょう?
KSwordOfHaste

2017/11/07 13:34 編集

それは普通のEclipseプロジェクトの実行用の設定の問題ではないでしょうか? 実行用のConfigurationを適切に設定してありますか? メニューでいえば Run>Debug Configuration or Run>Run COnfiguration の設定画面です。
aiueoaiueoaiue

2017/11/07 14:01

どこをいじればいいのかわからないので適当に「メイン・クラスの検索時に継承されたmainを組み込む」にチェックを入れたんですけど OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\imgproc\src\color.cpp, line 11048 Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\imgproc\src\color.cpp:11048: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor ] at org.opencv.imgproc.Imgproc.cvtColor_1(Native Method) at org.opencv.imgproc.Imgproc.cvtColor(Imgproc.java:1854) at def.Demo.run(ImageComparison.java:30) at def.ImageComparison.main(ImageComparison.java:14) 今度はこういうエラーが出てきました。
KSwordOfHaste

2017/11/07 14:24

画像ファイルのパスが相対パスですが、多分それが原因ではないかと。 (1)実行時の作業ディレクトリーがどうなるかよくわからないうちは絶対パス指定をお奨めします (2)OpenCVで画像を扱う場合はファイル名に日本語文字を含めないのがコツだそうです。(先日このサイトでそうであることを教わりました)
aiueoaiueoaiue

2017/11/07 14:55

ありがとうございます。無事動きました。お手数おかけして大変申し訳ございませんでした。
KSwordOfHaste

2017/11/07 15:21

umyuさんがコメントをよせてくださっているのでぜエラーチェック方法にご注目ください! imreadが「画像を読めてないのに例外を発してくれない」という仕様はなかなか気づきにくいのできっと今後参考になるはずです。(自分は指摘できませんでした><)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問