Preciso de ajuda com o código de comparação de imagens. Estou usando o OpenCV 3.4.9 mas quero atualizar para o OpenCV 4.4.0 e não sei o que devo mudar no código. Somente uma classe está com problema que é esta:
public class Match349 {
private MatOfDMatch goodMatches;
private Scalar RED;
private Scalar GREEN;
private FeatureDetector detector;
private DescriptorExtractor descriptor;
private DescriptorMatcher matcher;
public Match349() {
try {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
goodMatches = new MatOfDMatch();
RED = new Scalar(255, 0, 0);
GREEN = new Scalar(0, 255, 0);
detector = FeatureDetector.create(FeatureDetector.ORB);
descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
} catch (java.lang.UnsatisfiedLinkError | java.lang.NoClassDefFoundError e) {
Bibliotecas.Iniciar(null);
}
}
public boolean Resultado() {
return goodMatches.rows() > 25;
}
public Mat Teste(Mat img1, Mat img2) throws java.lang.UnsatisfiedLinkError, java.lang.NoClassDefFoundError {
// First photo
final Mat descriptors1 = new Mat();
final MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
detector.detect(img1, keypoints1);
descriptor.compute(img1, keypoints1, descriptors1);
// Second photo
final Mat descriptors2 = new Mat();
final MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
detector.detect(img2, keypoints2);
descriptor.compute(img2, keypoints2, descriptors2);
// Matching
final MatOfDMatch matches = new MatOfDMatch();
matcher.match(descriptors1, descriptors2, matches);
// Linking
Double max_dist = 0.0;
Double min_dist = 100.0;
final java.util.List<DMatch> matchesList = matches.toList();
for (int i = 0; i < matchesList.size(); i++) {
Double dist = (double) matchesList.get(i).distance;
if (dist < min_dist) {
min_dist = dist;
}
if (dist > max_dist) {
max_dist = dist;
}
}
final java.util.LinkedList<DMatch> good_matches = new java.util.LinkedList<>();
for (int i = 0; i < matchesList.size(); i++) {
if (matchesList.get(i).distance <= (1.5 * min_dist)) {
good_matches.addLast(matchesList.get(i));
}
}
// Printing
goodMatches.fromList(good_matches);
final Mat outputImg = new Mat();
final MatOfByte drawnMatches = new MatOfByte();
Features2d.drawMatches(img1, keypoints1, img2, keypoints2, goodMatches, outputImg, GREEN, RED, drawnMatches, Features2d.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS);
return outputImg;
}
}
Esta classe funciona corretamente no OpenCV 3.4.9 mas tem comandos que mudaram no OpenCV 4 e eu não sei como alterar para funcionar na nova versão.
Já tenho as bibliotecas do OpenCV 4.4 que é opencv_java440.dll, opencv-440.jar, e libopencv_java440.so.
Com isso posso fazer rodar em Windows e Linux mas só se a classe acima for alterada já que não existe no OpenCV 4 os comandos FeatureDetector e DescriptorExtractor.