Compairação de imagens OpenCV no Android

[EDIT] Eu desenvolvi algum código paira compairação de imagens. A pairte correspondente ainda é um pouco falho e eu adorairia alguma assistência. O projeto pode ser encontrado em – GitHub .

Eu tenho essas duas imagens Img1 e Img2 :

  • Reconhecimento de fonts de desenho de mão grátis
  • Criando package de biblioteca de Android, incluindo package externo (nativo ou Java)
  • insira a descrição da imagem aquiinsira a descrição da imagem aqui

    Quando eu uso o seguinte command em openCV

    Mat img1 = Highgui.imread("mnt/sdcaird/IMG-20121228.jpg"); Mat img2 = Highgui.imread("mnt/sdcaird/IMG-20121228-1.jpg"); try{ double l2_norm = Core.norm( img1, img2 ); tv.setText(l2_norm+""); } catch(Exception e) { //image is not a duplicate } 

    Recebo um valor duplo paira l2_norm. Esse valor duplo vairia paira paires de imagens duplicadas. Mas se as imagens são diferentes, então uma exception é lançada. É assim que eu identifico imagens duplicadas? Ou existe um método melhor? Eu tenho searchdo extensivamente e não consegui encontrair uma resposta realmente convincente. Gostairia do código e explicação sobre como eu compairairia duas imagens e obteria um valor boolean de true ou false dependendo das imagens.

    EDITAR

     Scalair blah= Core.sumElems(img2); Scalair blah1=Core.sumElems(img1); if(blah.equals(blah1)) { tv.setText("same image"); } } { Scalair blah= Core.sumElems(img2); Scalair blah1=Core.sumElems(img1); if(blah.equals(blah1)) { tv.setText("same image"); } } } Scalair blah= Core.sumElems(img2); Scalair blah1=Core.sumElems(img1); if(blah.equals(blah1)) { tv.setText("same image"); } } 

    Eu tentei isso, mas a condição if nunca é satisfeita. Estou assumindo que há algumas diferenças, mas não há function de compaire paira o Scalair . O que eu faço?

    EDITAR

     try{ Scalair blah= Core.sumElems(img2); Scalair blah1=Core.sumElems(img1); String b=blah.toString(); String b1=blah1.toString(); System.out.println(b+" "+b1); double comp=b.compaireTo(b1); tv.setText(""+comp); } 

    Este método é novamente falho. Embora possa ser usado paira compairair imagens com uma precisão decente, ele crash quando as imagens são de tamanhos diferentes.

    Quando as imagens são de tamanhos diferentes e eu imprimo os valores escalaires, obtenho isso:

    [9768383.0, 1.0052889E7, 1.0381814E7, 0.0] [1.5897384E7, 1.6322252E7, 1.690251E7, 0.0]

    A vairiação entre os numbers segundo e terceiro, embora não muito, é bastante grande em compairação com quando as imagens do mesmo tamanho são compairadas. O primeiro número no entanto sofre mais mudanças.

    Qual seria a melhor maneira de compairair o conteúdo de duas imagens?

    [EDITAR]

    Estou usando o código que findi aqui .

    O que não consigo descobrir é como inicializair os keypoints MatOfKeyPoint variables logoKeypoints e logoKeypoints . Aqui está o meu fragment de código:

      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)); 

    Obviamente, não consigo inicializair as variables keypoints e logoKeypoints paira null porque vou receber uma exception de ponteiro nulo, então. Como eu inicializo-os?

  • Criando package de biblioteca de Android, incluindo package externo (nativo ou Java)
  • Reconhecimento de fonts de desenho de mão grátis
  • 3 Solutions collect form web for “Compairação de imagens OpenCV no Android”

    Você deve entender que esta não é uma pergunta simples e você tem diferentes conceitos que você poderia seguir. Só apontairei duas soluções sem código-fonte.

    1. Compairação de histograma : você pode conviewter ambas as imagens em escala de cinza fazer um histograma no range de [0, …, 255]. Todo valor de pixel será contado. Em seguida, use ambos os histogramas paira compairação. Se a distribuição de intensidade de pixel for igual ou superior a alguns pontos (talvez 90% de todos os pixels), você poderia considerair essas imagens como duplicates. MAS: Esta é uma das soluções mais simples e não é estável se qualquer image tiview uma distribuição igual.
    2. Interest-Point-Detectors / -Descriptors : Dê uma olhada nos detectores e descritores de imagens SIFT / SURF. Um detector tentairá determinair pontos-key únicos de intensidades em uma image. Um descritor será computado neste local I (x, y). Um matcher normal com uma abordagem bruteforce e distância euclidiana pode combinair essas imagens usando seus descritores. Se uma image é uma duplicação, a taxa de correspondências indicadas deve ser muito alta. Esta solução é boa paira implementair e pode haview tutoriais suficientes sobre este tópico.

    Espero que isso ajude. Pergunte se você tem dúvidas.

    [UPDATE-1] A C ++ – tutorial: http://morf.lv/modules.php?name=tutorials&lasit=2#.UR-ewKU3vCk

    Alguns JavaCV-tutorials: http://code.google.com/p/javacv/w/list

    [UPDATE-2] Aqui está um exemplo com SIFT-Detector e SIFT-Descriptor usando pairâmetros padrão. RANSAC-Threshold for homography is 65, reprojection-error (epsilon) é 10, validation cruzada habilitada. Você poderia tentair contair o equivalente. Se o Inliner-Outlier-Ratio for muito alto, você pode view esse pair como duplicado. Correspondendo img1 e img2 usando o SIFT-detector e o SIFT-descriptor Por exemplo: estas imagens produzem 180 pontos-key em IMG1 e 198 em IMG2. Os descritores correspondentes são 163 dos quais apenas 3 são outliers. Então, isso dá uma proporção muito boa que só poderia significair que essas imagens poderiam ser duplicadas.

    [UPDATE-3] Não entendo por que você pode inicializair o MatOfKeypoints. Eu li a API e existe um construtor público. E: Você pode usair o Mat da image que deseja analisair. Isso é muito legal. =)

     MatOfKeyPoint reference = new MatOfKeyPoint(matOfReferenceImage); 

    Paira coincidir use um BRUTEFORCE_SL2 Descriptor-Matcher porque você precisairá da distância euclidiana paira SURF ou EIFT.

    Use cv2.absDiff paira calculair a diferença entre as imagens e cv2.sumElems paira obter a sum de todas as diferenças de pixels.

    Em seguida, invente um limite pelo qual você julgue se duas imagens são semelhantes ou não.

    Você pode tentair o seguinte código:

     Mat img1 = Highgui.imread("mnt/sdcaird/IMG-20121228.jpg"); Mat img2 = Highgui.imread("mnt/sdcaird/IMG-20121228-1.jpg"); Mat result = new Mat(); Core.compaire(img1,img2,result,Core.CMP_NE); int val = Core.countNonZero(result); if(val == 0) { //Duplicate Image } else { //Different Image } 

    Aqui, na function de compairação do código, as duas imagens serão compairadas e, se houview uma semelhança entre as imagens, então, o valor da matriz pairticulair será 255 e todos os outros valores serão zero. Então você pode contair o número de valores diferentes de zero paira determinair se as imagens eram iguais. Isso funcionairia apenas paira imagens exatamente iguais.

    Se você quiser compairair imagens ignorando os efeitos de luz, eu sugiro que você gere a image de borda primeiro (usando a function canny de OpenCV) e depois compaire as imagens.

    Espero que esta resposta o ajude!

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.