Ir ao conteúdo

Java Java OpenCV 3.4.9 migração para OpenCV 4.4.0. Comparação de imagens


Ir à solução Resolvido por dieisondr,

Posts recomendados

Postado

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.

  • 2 semanas depois...
  • Solução
Postado

Desisti de fazer a migração. Resolvi criar o arquivo libopencv_java349.so usando a solução do link https://libguides.lib.msu.edu/raspberry_pi/install_opencv.

Adicionando o programa "ant --classic" que é necessário para compilar para java que é parte do "snapd" e desativando todas as bibliotecas de programação python e seguindo o descrito neste link:

https://delabassee.com/OpenCVJava/

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...