Ir ao conteúdo
  • Cadastre-se

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

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.

Link para o comentário
Compartilhar em outros sites

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

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/

 

Link para o comentário
Compartilhar em outros sites

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...