Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [VB 2008 EXPRESS] Confronto immagini

    Salve a tutti voi forumisti.
    Avrei bisogno di creare una funzione che prelevi una immagine da una pagina web e suvessivamente esegua il confronto con delle immagini presenti in una cartella del computer.
    Una volta eseguito il confronto, se l'immagine prelevata dal web, "matcha"(coincide) con una delle immagini presenti nella cartella allora deve uscire un Msgbox con scritto un messaggio. Visto che l'immagine prelevata dal web può differire di qualche pixel con quelle presenti nella cartella, avrei la necessità che anche se l'immagine coincide solo per una certa percentuale, comunque la funzione mi dica se c'è stato match o no.
    So che probabilmente la soluzione vera e propria è un po' complicata, ma un qualsiasi tipo di aiuto (anche magari solo per prelevare l'immagine) è ben accetto

    Spero di essere stato abbastanza chiaro e spero che qualcuno riesca ad aiutarmi.

    Il linguaggio che uso è Visual Basic Express 2008.

  2. #2
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,117
    Prova così!

    Metti 2 textbox e chiamale txtFile1 e txtFile2, poi metti una pictureBox e chiamala picResult.
    Infine metti un bottone al cui click assegni questo codice:

    codice:
       Me.Cursor = Cursors.WaitCursor
            Application.DoEvents()
    
            ' Load the images.
            Dim bm1 As Bitmap = Image.FromFile(txtFile1.Text)
            Dim bm2 As Bitmap = Image.FromFile(txtFile2.Text)
    
            ' Make a difference image.
            Dim wid As Integer = Math.Min(bm1.Width, bm2.Width)
            Dim hgt As Integer = Math.Min(bm1.Height, bm2.Height)
            Dim bm3 As New Bitmap(wid, hgt)
    
            ' Create the difference image.
            Dim are_identical As Boolean = True
            Dim r1, g1, b1, r2, g2, b2, r3, g3, b3 As Integer
            Dim eq_color As Color = Color.White
            Dim ne_color As Color = Color.Red
            For x As Integer = 0 To wid - 1
                For y As Integer = 0 To hgt - 1
                    If bm1.GetPixel(x, y).Equals(bm2.GetPixel(x, _
                        y)) Then
                        bm3.SetPixel(x, y, eq_color)
                    Else
                        bm3.SetPixel(x, y, ne_color)
                        are_identical = False
                    End If
                Next y
            Next x
    
            ' Display the result.
            picResult.Image = bm3
    
            Me.Cursor = Cursors.Default
            If (bm1.Width <> bm2.Width) OrElse (bm1.Height <> _
                bm2.Height) Then are_identical = False
            If are_identical Then
                MessageBox.Show("Le immagini sono identiche!")
            Else
                MessageBox.Show("Le immagini sono diverse!")
            End If
    
            bm1.Dispose()
            bm2.Dispose()
    Questo non fa altro che caricare le immagini corrispondenti ai percorsi che inserirai nelle 2 textbox (es: "C:\miaCartella\miaIMG.jpg") e pixel per pixel controllare se ci sono differenze!

    Alla fine nella pictureBox assegnerà il colore (rosso se son diverse ecc)

    Questa è la base son sicura che smanettandoci un po arriverai ad adattarlo a ciò che ti serve!

    Ciao!

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da Veronica80
    Prova così!

    Metti 2 textbox e chiamale txtFile1 e txtFile2, poi metti una pictureBox e chiamala picResult.
    Infine metti un bottone al cui click assegni questo codice:

    codice:
       Me.Cursor = Cursors.WaitCursor
            Application.DoEvents()
    
            ' Load the images.
            Dim bm1 As Bitmap = Image.FromFile(txtFile1.Text)
            Dim bm2 As Bitmap = Image.FromFile(txtFile2.Text)
    
            ' Make a difference image.
            Dim wid As Integer = Math.Min(bm1.Width, bm2.Width)
            Dim hgt As Integer = Math.Min(bm1.Height, bm2.Height)
            Dim bm3 As New Bitmap(wid, hgt)
    
            ' Create the difference image.
            Dim are_identical As Boolean = True
            Dim r1, g1, b1, r2, g2, b2, r3, g3, b3 As Integer
            Dim eq_color As Color = Color.White
            Dim ne_color As Color = Color.Red
            For x As Integer = 0 To wid - 1
                For y As Integer = 0 To hgt - 1
                    If bm1.GetPixel(x, y).Equals(bm2.GetPixel(x, _
                        y)) Then
                        bm3.SetPixel(x, y, eq_color)
                    Else
                        bm3.SetPixel(x, y, ne_color)
                        are_identical = False
                    End If
                Next y
            Next x
    
            ' Display the result.
            picResult.Image = bm3
    
            Me.Cursor = Cursors.Default
            If (bm1.Width <> bm2.Width) OrElse (bm1.Height <> _
                bm2.Height) Then are_identical = False
            If are_identical Then
                MessageBox.Show("Le immagini sono identiche!")
            Else
                MessageBox.Show("Le immagini sono diverse!")
            End If
    
            bm1.Dispose()
            bm2.Dispose()
    Questo non fa altro che caricare le immagini corrispondenti ai percorsi che inserirai nelle 2 textbox (es: "C:\miaCartella\miaIMG.jpg") e pixel per pixel controllare se ci sono differenze!

    Alla fine nella pictureBox assegnerà il colore (rosso se son diverse ecc)

    Questa è la base son sicura che smanettandoci un po arriverai ad adattarlo a ciò che ti serve!

    Ciao!

    mmmmmmmmmhhhh..............
    A parte che la funzione .GetPixel è una vera lumaca e su un'immagine, diciamo cicciottella, potrebbe essere un problema e non tieni conto che tra due immagini ci possono essere lievi differenze ma essere comunque le stesse immagini. Prendiamo ad esempio due immagini che traggono lo stesso soggetto ma a risoluzioni diverse oppure con luminosità differenti. Insomma ci vuole un'algotirmo un pò più corposo.

    Dai un'occhiata a questi concetti:
    Concetto1
    Concetto2
    Concetto3


    Dipende comunque dalle condizioni di verifica delle immagini, ma questo non lo possiamo ancora sapere....
    Sbagliare è umano, perseverare è diabolico.

  4. #4
    Grazie mille per la tempestività della risposta
    Non appena ho un po' di tempo la proverò subito questa funzione e vi saprò dire.

    Comunque per darvi una idea vi faccio l'upload di 2 immagini da confrontare:

    http://img573.imageshack.us/img573/3526/orso1.jpg
    http://img811.imageshack.us/img811/56/orso2.jpg

    Come si può vedere le 2 immagini differiscono per una barra nera posizionata in modo diverso nell'immagine e anche per la loro risoluzione.

    Ciao e grazie ancora.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da grimaldello
    Grazie mille per la tempestività della risposta
    Non appena ho un po' di tempo la proverò subito questa funzione e vi saprò dire.
    Ciao e grazie ancora.
    Se le dimensione dell'immagini sono diverse, come già ti dicevo, la funzione che ti ha postato Veronica non serve a niente a meno che tu non ridimensioni l'immagine, ma a quel punto cambierà anche il valore dei singoli pixel.
    Sbagliare è umano, perseverare è diabolico.

  6. #6
    Certamente hai ragione pirelli.
    Provando la funzione con le immagini a colori i risultati sono scarsissimi, tuttavia trasformando l'immagine in monocromatico (anche con risoluzini diverse fra le due immagini) i risultati sono abbastanza buoni. D'altronde a me basta che risultino uguali per una percentuale non altissima.

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    In questo caso, cioè in base alla percentuale che ti occorre, può essere più conveniente stabilire alcune aree di confronto e poi su queste scegliere un numero di pixel da confrontare. Esempio:

    Suddivido in modo 'logico' l'immagine in 6 aree, in ognuna di queste aree stabilisco di confrontare 30 pixel (quindi un totale di 180 pixel).
    E' solo un esempio, che poi sarai tu a decidere se modificarlo e come in base alla grandezza dell'immagine.

    In questo modo la lentezza della routine GetPixel() viene sopperita dall'esiguo numero di pixel da analizzare


  8. #8
    Grazie gibra per il consiglio.
    Adesso vedo di mettere bene in pratica tutti i consigli che mi avete dato e poi vi saprò dire se sono riuscito ad ottenere una buona soluzione al mio problema.

    Grazie ancora a tutti

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Per completezza ti allego un esempio di quello che ti avevo suggerito

    Sbagliare è umano, perseverare è diabolico.

  10. #10
    Grazie a voi ho praticamente risolto il problema del confronto fra le immagini.
    Tuattavia ora mi rimane da fare la cosa che credevo fosse più facile, che però in realtà è risultata essere difficile per me. Il problema che non riesco a risolvere riguarda il salvataggio in automatico della immagine dal sito web. Va detto che questa immagine può essere visualizzata solamente una volta fatto il login ad un sito. Se dal browser guardo le proprietà di questa immagine ottengo un indirizzo del tipo:

    "http://www.nomedelsito.com/image.php?hash=45d4be1d7b76ee42602d1ad2af259c97"

    Ho provato in vari modi a salvarla ma proprio non ci riesco

    Uno dei metodi con cui ho provato è questo:

    codice:
    Dim indirizzo_immagine As String
    indirizzo_immagine = WebBrowser1.Document.Forms(indice1).All(indice2).GetAttribute("src")
    My.Computer.Network.DownloadFile(indirizzo_immagine, "immagine.jpg")
    Però non ha dato esiti positivi.

    Ho visto che è possibile ottenere una collezione delle immagini come HtmlElementCollection attraverso la riga di codice:

    codice:
    Dim collezione As HtmlElementCollection
    collezione = WebBrowser1.Document.Images
    Però poi non avrei la minima idea su come salvare l'immagine che mi interessa dalla collezione.

    Spero che voi possiate aiutarmi.

    Grazie in anticipo

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 © 2025 vBulletin Solutions, Inc. All rights reserved.