[EDIT] Я разработал код для сравнения изображений. Соответствующая часть по-прежнему немного испорчена, и я хотел бы получить некоторую помощь. Проект можно найти по адресу 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]
Разница между вторым и третьим номерами, хотя и не намного, довольно велика по сравнению с тем, когда сравниваются изображения того же размера. Первое число, однако, имеет наибольшее изменение.
Каким будет самый быстрый способ сравнить содержимое двух изображений?
[EDIT]
Я использую код, который я нашел здесь.
Я не могу понять, как инициализировать переменные 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
в null, потому что я получу исключение нулевого указателя. Как их инициализировать?