[編集] 私は画像比較のためのコードを考案しました。一致する部分にはまだ欠陥があり、私はいくつかのassitanceが大好きです。このプロジェクトは - GitHubにあります。AndroidでのOpenCV画像比較
私は、これら二つの画像IMG1とIMG2持っている:私はOpenCVの
Mat img1 = Highgui.imread("mnt/sdcard/IMG-20121228.jpg");
Mat img2 = Highgui.imread("mnt/sdcard/IMG-20121228-1.jpg");
try{
double l2_norm = Core.norm(img1, img2);
tv.setText(l2_norm+"");
} catch(Exception e) {
//image is not a duplicate
}
で次のコマンドを使用すると
私はl2_normのために二重の値を取得します。この2倍の値は、重複したイメージペアによって異なります。しかし、イメージが異なる場合、例外がスローされます。重複した画像をどのように識別しますか?それとも良い方法がありますか?私は広範囲にグーグルで行き、本当に説得力のある答えを見つけることができませんでした。私は2つの画像をどのように比較し、画像に応じてブール値true
またはfalse
を得るかについて、コードと説明をしたいと思います。
EDIT
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
私はこれを試してみたが、if
条件を満たしことはありません。私はいくつかの違いがあると仮定していますが、Scalar
にはcompare
の機能はありません。私は何をしますか?
EDIT
try{
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
String b=blah.toString();
String b1=blah1.toString();
System.out.println(b+" "+b1);
double comp=b.compareTo(b1);
tv.setText(""+comp);
}
この方法は、再び欠陥があります。イメージを適切な精度で比較するのに使用できますが、イメージのサイズが異なると失敗します。画像は、異なるサイズのものであり、Iは、スカラー値を印刷するとき
私はこれを取得:
[9768383.0, 1.0052889E7, 1.0381814E7, 0.0] [1.5897384E7, 1.6322252E7, 1.690251E7, 0.0]
もののあまり第二及び第三の数字の間のばらつきが同じのときに画像に比べて非常に大きいですサイズを比較する。しかし、最初の数字が最も変化します。
2つの画像の内容を比較する最速の方法は何でしょうか?
[EDIT]
私はhere見つけたコードを使用しています。
私が理解できないのは、MatOfKeyPoint
の変数keypoints
とlogoKeypoints
を初期化する方法です。ここに私のコードスニペットです:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
//FeatureDetector detector = FeatureDetector.create(FeatureDetector.FAST);
//Imgproc.cvtColor(img1, img1, Imgproc.COLOR_RGBA2RGB);
//Imgproc.cvtColor(img2, img2, Imgproc.COLOR_RGBA2RGB);
DescriptorExtractor SurfExtractor = DescriptorExtractor
.create(DescriptorExtractor.SURF);
//extract keypoints
MatOfKeyPoint keypoints, logoKeypoints;
long time= System.currentTimeMillis();
detector.detect(img1, keypoints);
Log.d("LOG!", "number of query Keypoints= " + keypoints.size());
detector.detect(img2, logoKeypoints);
Log.d("LOG!", "number of logo Keypoints= " + logoKeypoints.size());
Log.d("LOG!", "keypoint calculation time elapsed" + (System.currentTimeMillis() -time));
//Descript keypoints
long time2 = System.currentTimeMillis();
Mat descriptors = new Mat();
Mat logoDescriptors = new Mat();
Log.d("LOG!", "logo type" + img2.type() + " intype" + img1.type());
SurfExtractor.compute(img1, keypoints, descriptors);
SurfExtractor.compute(img2, logoKeypoints, logoDescriptors);
Log.d("LOG!", "Description time elapsed" + (System.currentTimeMillis()- time2));
私は、nullポインタ例外を受け取りますcuzを私は明らかにnullに変数keypoints
とlogoKeypoints
を初期化することはできません。どのように初期化するのですか?
このOpenCVチュートリアルでは、このトピックに関するいくつかの情報を提供しています。 http://goo.gl/gwN6e。 – harism
try-catchはif-elseと同じではありません!例外がスローされた場合(catchブロック)、何かが完全に間違っていました! – sschrass
@SatelliteSD - 私はそれを知っています。だからこそ私はもっと良い方法があるかどうか尋ねています。 –