IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

GetPixel est très lente


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 92
    Par défaut GetPixel est très lente
    Bonjour,

    J'ai besoin de vos lumières pour optimiser la vitesse d'exécution d'un programme.

    - But du programme :

    Mon programme est un OCR, il scanne certains pixels de l'écran par exemple les pixels en (100;100), (103;98) et (105;101) avec ça je suis capable de savoir si il s'agit d'un caractère 1 à 9 qui est inscrit dans cette partie d'écran. Ces caractères ne faisant pas partis de mon programme lui-même mais d'un programme écrit en java tournant dans une page html.
    Le but c'est de récupérer les données d'un autre logiciel. Et ça marche. Sauf que...

    Il est très lent sur mon nouveau PC (résolution native 3200x1080) alors qu'avec mon ancien PC tous était immédiat (1600x900)... En réduisant la résolution ça ne résout même pas mon problème!
    J'ai déterminé que c'était la fonction GetPixel() qui était très lente en Ultra Haute Définition. Si je la met en remarques // tout le reste redevient fluide...

    Bon avant d'utilise GetPixel() il faut appeler une fonction telle que GetDC(NULL) qui fournit un handle sur un Device Context, un Device context contient entre autre un bloc de bits avec les couleurs de chaque pixels, et ça c'est énorme en 3200x1080.
    Ce bloc de bits est forcément réactualisé lors de l'appel de GetPixel, d'où sa lenteur évidente.

    Le soucis c'est que mon Device Context est appliqué sur la totalité de l'écran donc 3200x1080 alors que je sais exactement où pointer sur les bons caractères. Un Device Context sur un bloc de pixels de 100x200 me suffirait amplement, sauf que je ne sais pas comment isolé seulement cette zone plutôt que l'écran en entier.

    Il y a bien un moyen d'accéder à une zone restreinte mais il faut connaitre le handle de la fenêtre cible, et ça je ne peux pas. C'est un programme java affiché par une page html.
    Le mieux serait de délimiter une zone sans aucun rapport avec une fenêtre en particulier, mais je sèche.

    Avez vous de conseils ou suggestions ?

    Merci

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,
    Si tu ne dis pas de quelle bibliothèque tu tire ton GetPixel(), ca va être délicat de t'aider.

    Cependant, c'est typiquement le cas où je me demande si l'OCR est le bon choix.
    La donnée transite forcément puisque l'applet java l'affiche. Il suffit d'écouter au bon endroit.
    L'écran n'est pas le meilleur.

    Il y a plusieurs autres pistes explorables:
    • englober l'applet dans une autre, qui enregistrerait ce que tu veux (sorte de keylogger)
    • sniffer le réseau
    • sniffer la RAM
    • utiliser un jre modifié pour enregistrer les chaines de caractères affichées.
    • utiliser un meilleur service web.
    • éventuellement, faire de l'OCR sur une image réduite (telle qu'obtenue avec Alt+PrintScreen)


    Mais vraiment, l'OCR n'est pas une bonne solution pour obtenir une information fournie par un programme.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 92
    Par défaut
    Oui je me suis tourné vers un OCR par défaut d'autres solutions.

    Le Keylogger aurait été la meilleur solution forcément, j'en ai déjà écrit 2 ou 3 mais qui écoutaient les messages provenant d'une application Win32 pas d'une applet Java, ça j'ignore vraiment comment faire.

    Par contre j'ai pensé à une solution pour mon OCR. Je pense savoir comment créer une zoneDC quelconque indépendante de dimensions voulues et de positions voulues.

    J'ai créé un programme tiers qui n'est autre qu'un rectangle vide (Background transparent) avec une bordure de 1 pixel.
    Mon programme principal va lancer ce second programme avec CreateProcess() ou ShellExecuteExA() puis retrouver son handle avec FindWindow et son ClassName, je pourai ainsi le manipuler et le déplacer où bon me chante mais surtout je pourrai créer un Device Context à partir de cette petite zone et non à partir de l'écran entier en utilisant : GetDC(hProgZoneDC) au lieu de GetDC(0); La fenêtre étant transparente, les pixels sous cette fenêtre resteront ceux du vrai programme cible situé sous-elle.

    Voilà l'idée, je suis en train...
    Je vous dirai si ça fonctionne....

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si c'est le GetPixel() Win32, la bonne solution c'est de copier les pixels que tu veux en gros vers un bitmap spécial pour lequel tu as un accès direct au buffer des pixels: Un tel bitmap s'obtient avec la fonction CreateDIBSection() (qui permet également de spécifier le format dudit bitmap).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Dans le cadre de Win32, il me semble avoir lu que GetPixel sur le contexte de l'écran attends que l'image en cours de calcul soit terminée avant d'y accéder.
    Sur une malchance, il attend alors une frame à chaque pas de la boucle de lecture.
    soit une seconde par 60 pixels...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 92
    Par défaut
    Ahhhh !!!

    Mon idée ne fonctionne pas !
    Ma fenêtre transparente est en fait crée de la façon suivante, une image Bitmap avec une couleur 0xFF0000 considérée comme un mask pour lequel ces pixels sont affichés en transparent.

    Et donc, bien que ma zoneDC soit transparente (à l'écran), en fait son Device Context ne l'est pas lui ! il reste en 0xFF0000 ! et forcément mon programme principal ne détecte pas les caractères souhaités car la fenêtre transparente agit en fait comme une fenêtre opaque.



    Bon je change de solution, je vais étudier la piste CreateDIBSection()

    Merci. Je continuerai ce thread quand j'aurai avancé dans mes tests.

Discussions similaires

  1. mon programme est très lent
    Par kawther dans le forum Images
    Réponses: 4
    Dernier message: 08/04/2010, 12h28
  2. [Hijackthis] Internet est très lent
    Par adn56 dans le forum Sécurité
    Réponses: 0
    Dernier message: 19/10/2008, 18h37
  3. Réponses: 12
    Dernier message: 24/07/2007, 11h09
  4. [WS2003] Mon serveur est très lent
    Par beegees dans le forum Windows Serveur
    Réponses: 13
    Dernier message: 29/03/2007, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo