[EDIT] Tôi đã nghĩ ra một số mã để so sánh hình ảnh. Phần phù hợp vẫn còn một chút thiếu sót và tôi rất thích một số sự thừa nhận. Dự án có thể được tìm thấy tại - GitHub.So sánh hình ảnh OpenCV trong Android
tôi có hai hình ảnh những img1 và img2:
Khi tôi sử dụng lệnh sau đây trong 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
}
tôi nhận được một giá trị gấp đôi cho l2_norm. Giá trị kép này thay đổi cho các cặp hình ảnh trùng lặp. Nhưng nếu các hình ảnh khác nhau, thì một ngoại lệ được ném ra. Đây có phải là cách tôi xác định hình ảnh trùng lặp không? Hoặc là có một phương pháp tốt hơn? Tôi đã Googled rộng rãi và không thể tìm thấy một câu trả lời thực sự thuyết phục. Tôi muốn mã và giải thích về cách tôi so sánh hai hình ảnh và nhận giá trị boolean là true
hoặc false
tùy thuộc vào hình ảnh.
EDIT
Scalar blah= Core.sumElems(img2);
Scalar blah1=Core.sumElems(img1);
if(blah.equals(blah1))
{
tv.setText("same image");
}
}
Tôi đã thử điều này, nhưng điều kiện if
là không bao giờ hài lòng. Tôi giả sử có một vài khác biệt, nhưng không có chức năng compare
cho Scalar
. Tôi làm gì?
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);
}
Phương pháp này được một lần nữa sai lầm. Mặc dù nó có thể được sử dụng để so sánh hình ảnh với độ chính xác cao, nhưng nó không thành công khi hình ảnh có kích thước khác nhau.
Khi hình ảnh có kích thước khác nhau và tôi in các giá trị vô hướng tôi có được điều này:
[9768383.0, 1.0052889E7, 1.0381814E7, 0.0] [1.5897384E7, 1.6322252E7, 1.690251E7, 0.0]
Các biến thể giữa các con số thứ hai và thứ ba mặc dù không nhiều là khá lớn so với khi những hình ảnh của cùng một kích thước được so sánh. Tuy nhiên, số đầu tiên bị thay đổi nhiều nhất.
Cách nào là cách nhanh nhất để so sánh nội dung của hai hình ảnh?
[EDIT]
Tôi đang sử dụng mã tôi thấy here.
Điều tôi không thể tìm ra là cách khởi tạo các biến số MatOfKeyPoint
keypoints
và logoKeypoints
. Dưới đây là đoạn mã của tôi:
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));
Tôi rõ ràng là không thể khởi tạo các biến keypoints
và logoKeypoints
để null vì tôi sẽ nhận được một con trỏ null thì ngoại lệ. Làm thế nào để tôi khởi tạo chúng?
Hướng dẫn OpenCV này hy vọng cung cấp một số thông tin về chủ đề; http://goo.gl/gwN6e. – harism
try-catch là * không * giống như if-else! Nếu một ngoại lệ đã được ném (bắt khối), một cái gì đó đã đi hoàn toàn sai! – sschrass
@SatelliteSD - Tôi biết điều đó. Đó là lý do tại sao tôi hỏi nếu có một phương pháp tốt hơn. –