Problème alignement ou orientation ( OCR ARABE ) [Résolu]

karirax 8 Messages postés mercredi 14 janvier 2009Date d'inscription 21 juillet 2013 Dernière intervention - 20 juil. 2013 à 20:35 - Dernière réponse : jordane45 22919 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention
- 22 juil. 2013 à 00:30
salut Tous le monde

J'ai un petit problème pour aligner le texte capté de l'image box

j'ajoute les module de tesseract ( arabe, français, anglais, hindi )

j'ai trouvé le problème pour l'arabe moi même ( j'ai rien trouvé sur le net sauf le code qui j'ai réglé moi même en copiant le fichier anglais eng.tesseract_cube.nn en ara.tesseract_cube.nn et en modifiant l'option OEM_TESSERACT_ON*LY par OEM_CUBE_ONLY et ça va jouer )

Mon problème comme j'ai mentionné en haut c'est que le text généré est aligné de gauche à droite ( mot de gauche à droite et pas le positionnement)

Quelqu'un peut me dire ce que je doit rajouter pour résoudre ce petit problème.

merci

Imports Emgu.CV 'Imports Emgu.CV.Util
Imports Emgu.CV.OCR
Imports Emgu.Util
Imports Emgu.CV.Structure
 
Public Class Form1
    Dim OCRz As Tesseract = New Tesseract("tessdata", "ara", Tesseract.OcrEngineMode.OEM_CUBE_ONLY)          'OEM_TESSERACT_ON*LY)
    'OEM_TESSERACT_ONLY,           // Run Tesseract only - fastest
    'OEM_CUBE_ONLY,                // Run Cube only - better accuracy, but slower
    'OEM_TESSERACT_CUBE_COMBINED,  // Run both and combine results - best accuracy
    'OEM_DEFAULT                   // Specify this mode when calling init_*(),
    '                              // to indicate that any of the above modes
    '                              // should be automatically inferred from the
    '                              // variables in the language-specific config,
    '                              // command-line configs, or if not specified
    '                              // in any of the above should be set to the
    '                              // default OEM_TESSERACT_ONLY.
    Dim pic As Bitmap = New Bitmap(697, 206)
    Dim gfx As Graphics = Graphics.FromImage(pic)
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'If Windows XP
        gfx.CopyFromScreen(New Point(Me.Location.X + PictureBox1.Location.X + 4, Me.Location.Y + PictureBox1.Location.Y + 30), New Point(0, 0), pic.Size)
        PictureBox1.Image = pic
 
        'If Windows 7
        'gfx.CopyFromScreen(MousePositi*on, New Point(0, 0), pic.Size)
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OCRz.Recognize(New Image(Of Bgr, Byte)(pic))
        RichTextBox1.Text = OCRz.GetText
        RichTextBox1.SelectedText = RightToLeft
        RichTextBox1.SelectionAlignment = HorizontalAlignment.Right
        RichTextBox1.Font = New Font("Traditional Arabic", 14)
        RichTextBox1.SelectionFont = New Font(RichTextBox1.SelectionFont, FontStyle.Bold)
    End Sub
End Class


la phrase retournée est inversée ...

Exemple:

Ritchtextbox1 retournée : monde tous salut

j'aimerai qu'elle est : salut tous le monde

J'ai essayé pas mal des choses ( Split, Mid, strreverse, ...etc ) mais rien

merci
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
jordane45 22919 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 21 juil. 2013 à 01:50
1
Merci
Bonsoir,

Aucune réponse

Doucement, on est en week end...


Avec un SPLIT ça devrait fonctionner...

Je suppose que tu récupère le text avec la commande:
 OCRz.GetText


Donc tu pourrais utiliser un SPLIT
Dim strNew as String =""
Dim str As String = "monde tous salut"
Dim strarr() As String
strarr = str.Split(" "c)
For i=1 to strarr.length -1 step -1
    strNew=strNew & " " & strarr[i] 
Next

 RichTextBox1.Text = strNew




Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI

Merci jordane45 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de jordane45
Meilleure réponse
jordane45 22919 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 21 juil. 2013 à 22:27
1
Merci
Oula... pourquoi tu as modifié la boucle sur le tableau SPLIT ?

Remets :
 For i As Integer = strarr.Length - 1 To 0 Step -1


Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI

Merci jordane45 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de jordane45
Meilleure réponse
jordane45 22919 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 22 juil. 2013 à 00:30
1
Merci
mais j'aimerai que le 1er mot reste tel qu'il est ...

Je n'ai pas tout compris à ce que vous venez de marquer...

Par contre je pense que là il ne s'agit que de manipulation de chaines de caractères (pour enlever les retours à la ligne par exemple).

Je vous invite à regarder du côte de:
String.Replace, méthode

mais là, c'est une nouvelle question (donc faudra ouvrir un nouveau sujet sur le forum après avoir fait quelques essais avant de votre côté..)


Pensez bien à clôturer celui-ci =>
REPONSE ACCEPTEE

Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI

Merci jordane45 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de jordane45
karirax 8 Messages postés mercredi 14 janvier 2009Date d'inscription 21 juillet 2013 Dernière intervention - 21 juil. 2013 à 01:15
0
Merci
Aucune réponse
Commenter la réponse de karirax
karirax 8 Messages postés mercredi 14 janvier 2009Date d'inscription 21 juillet 2013 Dernière intervention - 21 juil. 2013 à 20:15
0
Merci
Salut Jordane et Mille merci d'être répondu plus vite :D

mais li y a 2 erreurs pour la conversion du type array vers string

Error 1 Operator '&' is not defined for types 'String' and '1-dimensional array of String'. C:\Documents and Settings\All Users\Documents\OCRKADIRO\OCRKADIRO\Form1.vb 48 22 OCRKADIRO

Error 2 End of statement expected. C:\Documents and Settings\All Users\Documents\OCRKADIRO\OCRKADIRO\Form1.vb 48 43 OCRKADIRO

et c'était exactement dans la boucle:

strNew = strNew & " " & strarr[i]

merci beaucoup
Commenter la réponse de karirax
jordane45 22919 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 21 juil. 2013 à 20:53
0
Merci
Désolé,
j'ai fait quelques erreurs de syntaxe...

        Dim strNew As String = ""
        Dim str As String = "monde tous salut"


        Dim strarr() As String
        strarr = str.Split(" ")
        For i = strarr.Length - 1 To 0 Step -1
            strNew = strNew & " " & strarr(i)
        Next

        Me.TextBox1.Text = strNew


    End Sub


* Les tableaux s'écrivent avec des parenthèses
strarr(i)

** La boucle FOR, vu qu'on va en "arrière" doit commencer par la valeur la plus haute.
For i = strarr.Length - 1 To 0 Step -1


Voila, comme ça, ça fonctionne mieux

Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI
Commenter la réponse de jordane45
karirax 8 Messages postés mercredi 14 janvier 2009Date d'inscription 21 juillet 2013 Dernière intervention - 21 juil. 2013 à 21:42
0
Merci
Re:

Merci encore Jordane mais maintenant il n'affiche rien sauf une tabulation ??

dans un 1er lancement il affiche seulement le dernier mot mais les autres non plus

je l'exécute encore une fois et boooom aucun mot affiché ????
Commenter la réponse de karirax
jordane45 22919 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 21 juil. 2013 à 21:56
0
Merci
As tu testé en mode Pas à pas ?
->> Est-ce que le programme se déroule correctement, tes variables ont-elles les bonnes valeurs ??


-> Tu peux nous montrer ton code tel qu'il est maintenant ?



Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI
Commenter la réponse de jordane45
karirax 8 Messages postés mercredi 14 janvier 2009Date d'inscription 21 juillet 2013 Dernière intervention - 21 juil. 2013 à 22:02
0
Merci
Re:

merci encore pour la réponse rapide

voici le code finale ( voire le bouton1 ):

Imports Emgu.CV 'Imports Emgu.CV.Util
Imports Emgu.CV.OCR
Imports Emgu.Util
Imports Emgu.CV.Structure

Public Class Form1
    Dim OCRa As Tesseract = New Tesseract("tessdata", "ara", Tesseract.OcrEngineMode.OEM_CUBE_ONLY)          'OEM_TESSERACT_ON­LY)
    'OEM_TESSERACT_ONLY,           // Run Tesseract only - fastest
    'OEM_CUBE_ONLY,                // Run Cube only - better accuracy, but slower
    'OEM_TESSERACT_CUBE_COMBINED,  // Run both and combine results - best accuracy
    'OEM_DEFAULT                   // Specify this mode when calling init_*(),
    '                              // to indicate that any of the above modes
    '                              // should be automatically inferred from the
    '                              // variables in the language-specific config,
    '                              // command-line configs, or if not specified
    '                              // in any of the above should be set to the
    '                              // default OEM_TESSERACT_ONLY.
    Dim OCRf As Tesseract = New Tesseract("tessdata", "fra", Tesseract.OcrEngineMode.OEM_TESSERACT_ONLY)
    Dim OCRg As Tesseract = New Tesseract("tessdata", "eng", Tesseract.OcrEngineMode.OEM_TESSERACT_ONLY)
    Dim pic As Bitmap = New Bitmap(697, 206)
    Dim gfx As Graphics = Graphics.FromImage(pic)

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'If Windows XP
        gfx.CopyFromScreen(New Point(Me.Location.X + PictureBox1.Location.X + 4, Me.Location.Y + PictureBox1.Location.Y + 30), New Point(0, 0), pic.Size)
        PictureBox1.Image = pic

        'If Windows 7
        'gfx.CopyFromScreen(MousePositi­on, New Point(0, 0), pic.Size)
    End Sub

    ' Pour l'arabe :
    ' =============
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OCRa.Recognize(New Image(Of Bgr, Byte)(pic))
        Me.RichTextBox1.RightToLeft = System.Windows.Forms.RightToLeft.Yes
        RichTextBox1.SelectedText = RightToLeft.Yes
        RichTextBox1.SelectionAlignment = HorizontalAlignment.Right
        RichTextBox1.Font = New Font("Traditional Arabic", 14)
        RichTextBox1.SelectionFont = New Font(RichTextBox1.SelectionFont, FontStyle.Bold)
        RichTextBox1.Text = OCRa.GetText()
        'RichTextBox1.Text = RichTextBox1.Rtf
        'RichTextBox.SpellCheck.IsEnabled = True

        Dim strNew As String = ""
        Dim str As String = OCRa.GetText().ToString
        Dim strarr() As String
        strarr = str.Split(" ")
        'strarr = str.Split(New Char() {" "c})
        For i As Integer = 1 To strarr.Length - 1 Step -2
            strNew = strNew & " " & strarr(i)
        Next
        'For Each word As String In strarr
        'strNew = strNew & " " & word
        'Next
        RichTextBox1.Text = strNew

        RichTextBox1.SaveFile(CurDir() & "Fichier.Rtf")
        'MsgBox(CurDir() & "Fichier.Rtf")
        'For i As Integer = Len(RichTextBox1.Text) To 0 Step -1
        'RichTextBox1.Text = RichTextBox1.Text & Microsoft.VisualBasic.Right(RichTextBox1.Text.ToString, i)
        'Next

        'RichTextBox1.Text = StrReverse(RichTextBox1.Text)

    End Sub

    ' Pour le français :
    ' ================

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        OCRf.Recognize(New Image(Of Bgr, Byte)(pic))
        Me.RichTextBox1.RightToLeft = System.Windows.Forms.RightToLeft.No
        RichTextBox1.Text = OCRf.GetText
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        OCRg.Recognize(New Image(Of Bgr, Byte)(pic))
        Me.RichTextBox1.RightToLeft = System.Windows.Forms.RightToLeft.No
        RichTextBox1.Text = OCRg.GetText
    End Sub

    ' Pour l'Anglais :
    ' ==============

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Me.Close()
    End Sub

    ' Bouton Apropos :
    ' ==============

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        MsgBox("هذا البرنامج من إعداد بلحسن عبد القادر من الجزائر - سعيدة -    " & vbCrLf & vbCrLf _
               & vbCrLf & "Email: kadiro.bel20@yahoo.fr                         " & vbCrLf, MsgBoxStyle.Information + MsgBoxStyle.MsgBoxRtlReading, "حول البرنامج")
    End Sub
End Class
Commenter la réponse de karirax
karirax 8 Messages postés mercredi 14 janvier 2009Date d'inscription 21 juillet 2013 Dernière intervention - 21 juil. 2013 à 23:19
0
Merci
Re:

Mille merci pour vous Jordane

Maintenant marche très bien sauf un petit problème:

si le texte est ( Exemple ) :

Monde Le Tous Salut

le text retourné maintenant est:
[b]
Salut

Tous Le Monde/b

C-à-d il y a une ligne entre le mot Salut et le reste du texte

si le texte contient plusieurs lignes:

[b]blabla
blibli bla bla/b

le texte retourné est:

[b]bla

bla blibli blabla/b

mais j'aimerai que le 1er mot reste tel qu'il est ...

Mais c'est pas grave s'il n'y a pas une solution

déjà votre solution est très fort et vous êtes le seul qui m a répondu et je vous dit encore et et

Cordialement

Karirax
Commenter la réponse de karirax

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.