[编辑]我设计用于图像比较一些代码。 匹配的部分仍然是一个有点瑕疵的,我会喜欢一些assitance。 该项目可以在这里找到- GitHub上 。
我有这两个图像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的双重价值。 这种双重价值重复的图像对变化。 但是,如果图像是不同的,然后抛出一个异常。 这是我如何找出重复的图片? 或者,有没有更好的方法? 我已经广泛用谷歌搜索,但没有找到一个真正有说服力的答案。 我想代码,并解释如何,我会比较两个图像,并得到一个布尔值true
或false
取决于图像。
编辑
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
我已经试过这一点,但if
条件永远不会满足。 我假设有一些差别,但没有compare
的功能Scalar
。 我该怎么办?
编辑
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);
}
这种方法是有缺陷的再次。 虽然可以使用一个体面的精度比较图像,它的图像时的大小不同的失败。
当图像是不同大小的,我打印标量值我得到这样的:
[9768383.0, 1.0052889E7, 1.0381814E7, 0.0] [1.5897384E7, 1.6322252E7, 1.690251E7, 0.0]
时相比,同样大小的图像进行比较,以在第二和第三个数字虽然不多之间的变化是相当大的。 然而,第一个数字受到最多的变化。
什么是比较两个图像的内容最好最快的方法?
[编辑]
我使用的是我找到的代码在这里 。
什么我无法弄清楚是如何初始化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));
我显然不能初始化变量, keypoints
和logoKeypoints
为空因为我会收到一个空指针异常即可。 我该如何初始化呢?