Reconnaissance de caractères à partir d'un tracé souris

Soyez le premier à donner votre avis sur cette source.

Vue 6 461 fois - Téléchargée 946 fois

Description

Ce petit exemple montre comment on peut se lancer de facon simple dans la
reconnaissance de forme : il s'agit ici de tracer une forme ou une lettre à la souris puis de la sauver en tant que modèle.
Ensuite, on essaie de la reproduire avec la souris et la touche "GO" vous calcul la marge d'erreur avec l'original.

Une des applications directes pourrait etre de remplacer le senpiternel mot de passe par une signature souris !

Ci-joint une capture d'écran avec un exemple sur la lettre e + les sources.

email : joshrbz@yahoo.fr

Source / Exemple :


Option Explicit

Dim tabX(0 To 1000) As Single
Dim tabY(0 To 1000) As Single
Dim modX(0 To 1000) As Single
Dim modY(0 To 1000) As Single
Dim n As Integer
Dim maxN As Integer
Dim modN As Integer

Private Sub Compare()
    Dim i As Integer
    Dim j As Integer
    Dim lastJ As Integer
    Dim dX As Single
    Dim dY As Single
    Dim delta As Double
    Dim nb As Integer
    
    Me.Refresh
    Call DisplayAll
    
    dX = modX(0) - tabX(0)
    dY = modY(0) - tabY(0)
    delta = 0
    lastJ = 0
    nb = 0
    For i = 1 To modN
        j = CInt(i / modN * maxN)
        delta = delta + Sqr((modX(i) - tabX(j) - dX) ^ 2 + (modY(i) - tabY(j) - dY) ^ 2)
        lastJ = j
    Next i

    lblinfo.Caption = "Erreur = " & Format(delta / modN, "#.0000")

End Sub

Private Sub DisplayAll()
    Dim i As Integer
    Dim dX As Single
    Dim dY As Single
    dX = modX(0) - tabX(0)
    dY = modY(0) - tabY(0)
    
    i = 1
    While modX(i) > 0
        Me.Line (modX(i - 1), modY(i - 1))-(modX(i), modY(i)), vbGreen
        i = i + 1
    Wend
    
    i = 1
    While tabX(i) > 0
        Me.Line (tabX(i - 1) + dX, tabY(i - 1) + dY)-(tabX(i) + dX, tabY(i) + dY), vbGrayed
        i = i + 1
    Wend
    
End Sub

Private Sub Display()
    Dim i As Integer
    
    i = 1
    While tabX(i) > 0
        Me.Line (tabX(i - 1), tabY(i - 1))-(tabX(i), tabY(i)), vbGrayed
        i = i + 1
    Wend
    
    maxN = i
    lblinfo.Caption = maxN & " sur " & modN
End Sub

Private Sub SetAsModel()
    Dim i As Integer
    
    i = 0
    modN = maxN
    For i = 0 To 1000
        modX(i) = tabX(i)
        modY(i) = tabY(i)
    Next i
    
    lblinfo.Caption = "Modèle sauvé..."
End Sub

Private Sub Reset()
    Dim i As Integer
    
    For i = 0 To 1000
        tabX(i) = 0
        tabY(i) = 0
    Next i
    
    Me.Refresh
End Sub

Private Sub Command1_Click()
    Call Reset
End Sub

Private Sub Command2_Click()
    Call SetAsModel
End Sub

Private Sub Command3_Click()
    Call Compare
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        If n < 1000 Then
            Call Me.PSet(0, X, Y, vbBlack)
            tabX(n) = X
            tabY(n) = Y
            n = n + 1
        End If
    Else
        If n > 0 Then
            Call Display
            n = 0
        End If
    End If
End Sub

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

CAD9757
Messages postés
74
Date d'inscription
dimanche 17 août 2003
Statut
Membre
Dernière intervention
27 mars 2004

super ton truc ! mais si on trace la lettre dans un sens puis dans l'autre ça marche pô !
cs_max12
Messages postés
1491
Date d'inscription
dimanche 19 novembre 2000
Statut
Modérateur
Dernière intervention
7 juillet 2014

Tu devrais faire un enregistrement des modèles dans un fichier et faire une comparaison automatique. (Un peu comme Sensiva)

@+
cuq
Messages postés
345
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
21 mars 2008
1
Pour ceux que ca intéresse j'ai vu une source de ce type sur Planet-Source-Code

http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=42632&lngWId=1
TTMan
Messages postés
104
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
12 février 2007

Pas mal pour un début!! Joshrbz a un peu raison pour instaurer un genre de norme dans le tracé, genre comme pour les palm... (mais c'est juste une humble idée).
joshrbz
Messages postés
5
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
5 décembre 2003

Certes mais cette approche est très simple : distance entre les points des tracés.. Pour bien faire , il faudrait normaliser le modèle et le stimulus, comparer les orientations vectorielles, faire un réseau de neurones et que sais-je encore !
Bref, cette méthode a ses limites...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.