Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    5

    Ricerca di un QRcode all'interno di un'immagine

    Buondì a tutti
    mi trovo davanti a un problema abbastanza ostico, per cui mi rivolgo a voi per avere qualche dritta
    PROBLEMA:
    ho una decina di immagini in formato .jpg di dimensioni abbastanza grosse (2500x3500 px) dove all'interno dispongo di varie informazioni, diciamo sia stringhe che immagini. In ognuna di queste immagini è presente un QRCode e il mio problema sarebbe proprio quello di riuscire a "ritagliare" la parte dell'immagine contenente il QRCode per poi confrontarla con un'altra immagine contentente anche lei un QRCode e verificare se sono uguali. Il problema è che le immagini non sono standard, differiscono sia di contenuti che di dimensioni (anche se di pochi pixel, max 20), e anche il QRCode purtroppo non si trova sempre nello stesso punto.
    Ho già fatto molte prove, sono riuscito a manipolare le immagini con la classe BufferedImage, ma nn sapendo di preciso dove si trova il codice non posso dargli le coordinate esatte da dove iniziare a leggere l'immagine.....
    Mi sorge il dubbio che quello che vorrei fare non sia realizzabile, o che magari sia realizzabile ma che vada assolutamente oltre le mie capacità XD

    Se qualcuno si fosse già imbattuto in un problema del genere e mi sapesse dare qualche suggerimento utile gliene sarei molto grato.
    Grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    domande (non voglio e non so risponderti al momento, non mi sono mai occupato di niente del genere): i QRCodes sono almeno "allineati" ai bordi delle immagini o possono essere anche ruotati aribitrariamente. Altra cosa: appurato che le immagini possono essere di diverse dimensioni, almeno i QRCode sono tutti delle stesse dimensioni?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    5
    Si si sono sempre allineati nel foglio e hanno sempre la stessa dimensione sono sempre diciamo perpendicolari all'immagine, ma in coordinate diverse.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ho trovato 2 librerie a cui forse vorrai dare un'occhiata:

    http://sourceforge.net/projects/imgrecognition/
    http://neuroph.sourceforge.net/image_recognition.html

    altrimenti se vuoi riscrivere tutto, in forza bruta si tratta di:

    - analizzare pixel per pixel l'immagine di partenza, ovvero, vedere se il dato pixel "i" è uguale al pixel "0" del tuo pattern (i 3 quadrati agli angoli dei QRCode servono proprio ai lettori di QRCode a riconoscere, orientare e decifrare il contenuto), se sì, passi al pixel i+1 e lo confronti col pixel 1 del pattern etc etc.

    Potresti voler implementare qualcuno degli algoritmi di ricerca nelle stringhe
    http://en.wikipedia.org/wiki/String_searching_algorithm

    per migliorare l'efficienza della tua ricerca.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    5
    Ci dò un'occhiata subito grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    e forse (ti) ho trovato qualcosa di ancora più specifico:

    http://code.google.com/p/zxing/

    adesso lo provo anch'io perché mi ha incuriosito.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    e ti posto anche un esempio funzionante di ricerca e decodifica di QRCode (l'ho testato con un po' di immagini, e se non troppo distorte o con colori strani va degnamente)

    http://javamagic.wordpress.com/2012/...rcode-in-java/

    sul sito di zxing hanno anche un decoder online che apparentemente riesce a decodificare anche immagini in cui il fattore di skewing/deformazione sia maggiore, se ho tempo mi documento.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    5
    Me li leggo subito grazie

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    siccome mi sono un po' intrippato con sta libreria, ed avendo riscontrato che la versione online riusciva a decodificare alcuni QR che invece il semplice codice linkato non decifrava, ho spulciato un po' nella distribuzione ed ho trovato il codice della servlet che usano nella pagina ufficiale del progetto. Strippando di tutto quanto non "algoritmico", ma non ripulendo (per noia) interamente il codice, viene fuori questo - che funziona meglio di quello linkato:
    codice:
    import java.io.File;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    
    import com.google.zxing.*;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.common.*;
    import com.google.zxing.multi.*;
    import java.util.*;
    
    public class QRReader {
        
        private static final Map<DecodeHintType,Object> HINTS;
        private static final Map<DecodeHintType,Object> HINTS_PURE;
        
        static {
            HINTS = new EnumMap<DecodeHintType,Object>(DecodeHintType.class);
            HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            HINTS.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.allOf(BarcodeFormat.class));
            HINTS_PURE = new EnumMap<DecodeHintType,Object>(HINTS);
            HINTS_PURE.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
        }
        
        public static void main(String args[]) {
            
            String filePath = "C:/Users/Andrea/Desktop/QRCode.jpg";       
            
            BufferedImage image = null;
            try {
                image = ImageIO.read(new File(filePath));
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            
            Reader reader = new MultiFormatReader();
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(source));
            Collection<Result> results = new ArrayList<Result>(1);
            ReaderException savedException = null;
            
            try {
                // Look for multiple barcodes
                MultipleBarcodeReader multiReader = new GenericMultipleBarcodeReader(reader);
                Result[] theResults = multiReader.decodeMultiple(bitmap, HINTS);
                if (theResults != null) {
                    results.addAll(Arrays.asList(theResults));
                }
            } 
            catch (ReaderException re) {
                savedException = re;
            }
            
            if (results.isEmpty()) {
                try {
                    // Look for pure barcode
                    Result theResult = reader.decode(bitmap, HINTS_PURE);
                    if (theResult != null) {
                        results.add(theResult);
                    }
                } 
                catch (ReaderException re) {
                    savedException = re;
                }
            }
            
            if (results.isEmpty()) {
                try {
                    // Look for normal barcode in photo
                    Result theResult = reader.decode(bitmap, HINTS);
                    if (theResult != null) {
                        results.add(theResult);
                    }
                } 
                catch (ReaderException re) {
                    savedException = re;
                }
            }
            
            if (results.isEmpty()) {
                try {
                    // Try again with other binarizer
                    BinaryBitmap hybridBitmap = new BinaryBitmap(new HybridBinarizer(source));
                    Result theResult = reader.decode(hybridBitmap, HINTS);
                    if (theResult != null) {
                        results.add(theResult);
                    }
                } 
                catch (ReaderException re) {
                    savedException = re;
                }
            }
            if (savedException != null) {
                System.out.println(savedException);
            }
            System.out.println("Decodificato: ");
            for (Result r : results) {
                System.out.println(r);
            }
        }
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    5
    Grazie mille utilissimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.