Reconnaissance de caractère: comment ne charger qu'une partie de l'ecran?

Résolu
dieu360 Messages postés 30 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 10 septembre 2011 - 12 août 2011 à 15:28
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 13 août 2011 à 07:44
bonjour,
j'ai déjà posté plusieurs sujet sur ce forum pour m'aider dans mon projet, et votre aide a été efficace et je vous en remercie encore. Mon programme de reconnaissance de caractère marche, le problème, c'est qu'il est trop lent, car, comme on me l'avait déjà fait remarquer, il sur-sollicite la carte graphique.
C'est de la reconnaissance de caractère sur un site internet, donc pour avoir le dc de l'ecran, j'utilise GetDC(0). Comme je l'ai dit, cela fonctionne, mais c'est trop lent.

J'ai cru comprendre qu'il y avait un moyen de ne charger que la partie de l'ecran dont j'avais besoin, ce qui réglerait peut etre le problème de la lenteur. Mais je n'ai pas trouvé comment faire pour ne charger qu'une seule partie. S'agit-il de la meme API mais avec d'autres paramètres? ou d'une API différente?

7 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 août 2011 à 19:45
Bonjour,
Je te propose le petit test suivant (clair)
Sur un Form : une picturebox picture et un bouton de commande command1
ce code :
Private Type BITMAPINFOHEADER '40 bytes
        biSize As Long
        biWidth As Long
        biHeight As Long
        biPlanes As Integer
        biBitCount As Integer
        biCompression As Long
        biSizeImage As Long
        biXPelsPerMeter As Long
        biYPelsPerMeter As Long
        biClrUsed As Long
        biClrImportant As Long
End Type
Private Type BITMAPINFO
        bmiHeader As BITMAPINFOHEADER
End Type
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SetDIBitsToDevice Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Dim iBitmap As Long, iDC As Long

Private Sub Command1_Click()
    Me.Hide
    Picture1.AutoRedraw = True
    Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
    With bi24BitInfo.bmiHeader
        .biBitCount = 24
        .biCompression = BI_RGB
        .biPlanes = 1
        .biSize = Len(bi24BitInfo.bmiHeader)
        .biWidth = 2000 '<<<<====== c'est ici que tu définis la largeur à garder
        .biHeight = 2000 '<<<<====== c'est ici que tu définis la hauteur à garder
    End With
    ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
    iDC = CreateCompatibleDC(0)
    iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
    SelectObject iDC, iBitmap
    agauche = 200
    enhaut = 150
    BitBlt iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, GetDC(0), agauche, enhaut, vbSrcCopy
    GetDIBits iDC, iBitmap, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
    SetDIBitsToDevice Picture1.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
    DeleteDC iDC
    DeleteObject iBitmap
    Me.Show
End Sub



Tu lances, puis réduis tout ce qui n'est pas ton Form (tu auras ainsi un exemple clair : celui de ton bureau)
Bien !
Clique maintenant sur command1 et vois ce que tu as dans la picturebox (un morceau de ton écran.
Lis ensuite attentivement le code et intéresse-toi plus particuli_èrement à :
.biWidth = 2000 '<<<<====== c'est ici que tu définis la largeur à garder
.biHeight = 2000 '<<<<====== c'est ici que tu définis la hauteur à garder
agauche = 200
enhaut = 150
amuse-toi à les faiure varier, relance, vois, etc...
Tu devrais normalement vite "piger"
Bon Week-end

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
12 août 2011 à 15:42
Je tien par commencer en disant que c pas trop mon domaine. Je me permet de t'ecrir car a la lecture de ton poste l'algo. suivant m'est venu à lespris.

1)Généré une chaîne de caractère
2)Sauvé la chaine dans un champs invisible
3)Afficher (Selement là) la chaine dans un picture box
4)Laisser l'utilisateur entrer du texte dans un champ
5)L'utlisateur clique sur un bouton
6)Récupérer la valeur entrer par l'utilisateur par un GET
7)Comparais la valeur utilisateur par la valeur que nous avons garder
8)Si les valeurs sont égaux en va plus loin si non en retourne au poin 4

Comme cela tu affiche que une seul foi et tu na plus à solicité ta carte graphique.

Bon c peut être naif comme algo. mais il me semble viable.
0
dieu360 Messages postés 30 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 10 septembre 2011
12 août 2011 à 15:56
je ne suis pas sûr d'avoir compris ton algorithme en fait. Je ne suis pas l'administrateur du site. Je cherche juste à récupérer des valeurs numériques affichées sur un site internet. Et il me semblait qu'utiliser la reconnaissance graphique de caractère était le moyen le plus simple.
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
12 août 2011 à 16:04
Tu dis "Je ne suis pas l'administrateur du site." Soooooooooooooooooooorrrrrrryyyyyyyyyyy!!!!
Je n'avais par compris cela!

Bon, je te laisse. Tout mes excuses
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dieu360 Messages postés 30 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 10 septembre 2011
12 août 2011 à 16:17
pas de problème;)
mais quelqu'un aurait-il la réponse à ma question svp?? :D
0
dieu360 Messages postés 30 Date d'inscription lundi 30 mai 2011 Statut Membre Dernière intervention 10 septembre 2011
12 août 2011 à 20:30
okay merci pour ton aide ucfoutu, mais avec ce systeme, je suis obligé de remettre à chaque fois le focus sur le form1 pour utiliser la fonction getpixel? ou ce n'est pas la peine?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 août 2011 à 07:44
mais avec ce systeme, je suis obligé de remettre à chaque fois le focus sur le form1 pour utiliser la fonction getpixel? ou ce n'est pas la peine?

Il n'est absolument pas nécessaire que le Form soit visible. Je ne l'ai rendue visible dans l'exemple, que pour que tu puisses voir ce que contenait la pictureBox (une partie de l'écran)
La fonction GetPixel doit et peut travailler uniquement sur le contenu de la PictureBox, visible ou non.
Je te précise enfin que tout ce qui se trouve dans l'évènement click de command1 agirait de la même manière , placé dans une routine. Cette dernière (si je me rappelle bien ton autre discussion) doit donc être appelée de temps à autre, à chaque "changement de page", que ce soit par un timer ou par un autre procédé.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous