Acquisition d'un pixmap sur CCD compatible TWAIN

Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008 - 10 août 2007 à 11:58
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008 - 23 août 2007 à 14:39
Bonjour,

Pour les besoins de mon appli, je cherche à faire plusieurs acquisitions sur une CCD (videology) qui est compatible avec TWAIN. Je voudrais disposer d'un pointeur sur le pixmap obtenu (ce n'est pas le bitmap, mais bien l'objet mémoire correspondant à la suite des pixels de l'image) , pour pouvoir ensuite jouer avec mes pixels comme il me plait.

Je n'ai pas d'idée sur le moyen de réaliser cette acquisition de manière automatisée ( sans boite de dialogue ouverte ) et surtout, je n'arrive pas à acceder au pixmap directement.


Merci d'avance de vos idées



Devant un clavier comme un placebo devant un verre d'eau.

16 réponses

Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
10 août 2007 à 16:53
Merci WhiteHippo, j'avais vu ce source, effectivement, mais j'avais du le lire en diagonale ( et surtout je n'étais pas encore confronté à ce problème).

Est-ce que je me trompe si je dit que ce que j'ai appelé pixmap est ce qui est appelé DIB ici?, le pointeur que je cherche serait-alors un hDIB.
Et je n'ai plus qu'a trouver comment convertir un handle en pointeur.
Vrai?

Pour ma défense, je n'ai découvert Delphi que le mois dernier et mes cours d'informatiques se sont limité à des fonctions de tri et des calculs mathématiques. :)



Devant un clavier comme un placebo devant un verre d'eau.
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
13 août 2007 à 11:14
Il ya quelque chose qui m'intrigue, là: le passage d'une ligne à l'autre, dans la source de florenth, il utilise un

LastPixOffset := Integer(FastGetPixel(0, 1)) - Integer(FastGetPixel(Width - 1, 0)) - SizeOf(TBGR); <-- déja, le "- sizeOf(TBGR)", il recule d'un pixel?

pour passer de ligne en ligne en ligne avec
Inc(Integer(CurPix), FBmp.LastPixelOffset);

Alors que dans le code que j'étudie, l'accès direct aux pixels est faite par un "simple":
pOffset := PByte(dataCam16); pointeur sur la structure (Une série de 16 frames)
Inc(pOffset,i*camInfo.FrameSize); on déplace au ieme frame
Inc(pOffset,2*X+Y*camInfo.rowSize); <-- accede au pixel X,Y
pData := PWord(pOffset); le pointeur est retypéByte->Word
ShowPointValue(i,pData^); fonction d'affichage de la valeur

oui, bon, "simple", quoi. Quoiqu'il en soit, s'agit-il de 2 écoles de programmations, ou y a-t-il une différence dans le résultat?
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
13 août 2007 à 18:43
Attention le passage d'une ligne à l'autre se fait par :
    FLineOffset := Integer(ScanLine[1]) - Integer(FFirstPix);
Le code que tu m'as donné sert à :
  { Saut pour passer de l'adresse suivant le dernier pixel d'une
  ligne à l'adresse du premier pixel de la ligne d'après
  (compliqué mais ça simplifie les boucle "for")
  }
  FLastPixOffset : = Integer(FastGetPixel(0, 1))
   - Integer(FastGetPixel(Width - 1, 0)) - SizeOf(TBGR);

Florenth utilise une approche structurée (Méthode traditionelle de programmation en Delphi), alors que la seconde méthode est plus proche d'une adaptation de code C (Transtypage de pointeur, accès à un tableau à partir de son adresse)

En Delphi, on préférera toujours :
var
  T_Delphi : array[0..4,0..9] of Byte ; //  Accès à l'élément 2,3 par T_Delphi[2,3]
à
var
  T_C : ^Byte ; //  Accès à l'élément 2,3 par Inc(T_C,2+3*10)

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
14 août 2007 à 18:17
d'accord, je commence à voire clair dans cette histoire.

En farfouillant, dans les sources et les discussions, j'ai eu l'impression que l'accès par pointeur était plus rapide, au moins en ce qui concerne les images, que l'accès à un tableau de pixel (de très grande taille, du coup).
0

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

Posez votre question
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
14 août 2007 à 20:27
L'accès par pointeur est effectivement plus rapide mais il faut savoir ce que l'on veut, un code facile à relire ou bien un code super optimisé où la moindre modification se fera à chaque fois au prix de quelques touffes de cheveux en moins. Perso, je n'optimise que lorsque j'ai mon code complétement fonctionnel ( 1- On code simplement et efficacement, 2 - On fait fonctionner, 3 - On optimise si nécessaire et sous certaine conditions)

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
16 août 2007 à 11:57
héhé, je suis assez d'accord avec toi, sur l'ordre chronologique, le problème c'est la phase 4 :) ie: on récupère un code optimisé (par un autre) et on doit en modifer la racine.
[En fait, je suis un flemmard, je ne voudrais modifier que le processus d'acquisition, et que le reste du code n'ai pas à être retouché]

J'espère avoir assez de cheveux....
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
20 août 2007 à 14:45
Toujours dans le même problème.
Je vais probablement avoir besoin d'une gestion assez "bas niveau" de TWAIN, pour l'instant je fesais confiance à DelphiTwain, et j'ai regardé MultiTwain, mais ils me semblent plus adaptés à un usage one-click, où l'acquisition se fait soit directement dans un objet complexe, soit à travers une série de fenêtres utilisateur.
Vu qu'il me faut carrément un acces direct par pointeur aux pixels, y at-il une bibliothèque plus adaptée?

J'ai vu EZTwain, mais je n'ai trouvé que peu de doc sur son utilisation Delphi; et les constantes TWAIN ne sont pas définies
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
20 août 2007 à 15:51
Je comprends pas ton problème.

Si tu utilises DelphiTwain, chaque acquisition, par l'événement OnTwainAcquire est alors transféré dans une image de type TBitmap; tu peux donc utiliser la propriété ScanLines[0] de cette image comme le pointeur sur le premier des pixels de l'image.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
20 août 2007 à 16:13
Sauf que a chaque acquisition, on a droit à la fenêtre utilisateur de la caméra.
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
20 août 2007 à 17:00
Ok, j'avais pas compris cela. Bon je jette un coup d'oeil et je te tiens au courant.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
20 août 2007 à 17:18
Je viens de trouver une librairie qui s'appelle AcquireImage, j'ai l'impression qu'elle permet de gérer soi-même le statut de TWAIN, et elle vient avec un TWAINh qui est la traduction du .h de TWAIN, donc, cela permettrait l'acces aux commandes "brutes" de TWAIN (une fois que j'aurai compris comment elles fonctionnent).


En fait, si j'ai bien saisi, la fenêtre utilisateur vient carrément de la source elle-meme, et pas simplement de TWAIN, donc, pour s'en débarasser, il faudrait définir les paramètres manuellement (d'ou le recours aux commandes brutes de TWAIN: DS_Entry et DSM_Entry), et lui forcer la main pour qu'il ne se pose pas de question.
Je crois que à la base, TWAIN n'est pas pensé pour les caméra, mais plutot pour une acquisition image par image (scanner, appareils photo...) destinée à être stockées, et traitées à postériori. Alors que moi , forcément, j'essai de faire un traitement "en ligne"...

En tout cas, merci de ton aide qui , en plus d'être précieuse, me permet de ne pas désespérer malgrès la tâche.
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
20 août 2007 à 22:45
J'ai regardé, rien de plus simple pour supprimer la fenetre utilisateur, il suffit simplement de rajouter :
  Twain.Source[CurrentSource].ShowUI := false ;
ou encore de le spécifier au moment de l'activation de la source, comme dans l'exemple fourni, (Le full Interfaces).
Le menu File->Show User Interface sert à désactiver la fenêtre des paramêtres. Cela est fait par le code :
  Twain.Source[CurrentSource].EnableSource(ItemShowInterface.Checked, FALSE);

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
21 août 2007 à 14:58
En effet, ca marche! Hum , par contre, l'acquisition est pour l'instant une vraie galère pour moi sous DelphiTwain, je pense que j'ai du passer à coté de quelque chose: la gestion systématique par un event OnTWAINAcquire n'est pas des plus légère, d'autant qu'à chaque image, je recharge TWAIN de zero...


Je m'attarde un peu sur TAcquireImage, qui semble assez légère ( à première vue ) et qui me donne directement un Hbitmap, dont je devrai quand même virer le header.
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
22 août 2007 à 16:56
Je commence à voir où je vais!

j'utilise donc AcquireImage, avec sa méthode un peu arnaque de AcquireBitmap (un aqcuirenative, envoyé dans un presse-papier pour l'adaptation, puis collé dans un bitmap), et je récupère un pointeur sur scanline[0]. Je parcours ensuite le pixmap par incrémentations grace aux infos récupérées au paravant de la caméra.

C'est un peu par désespoir de cause: c'est assez lent, et on est obligé de revenir à l'état 2 de TWAIN après chaque acquisition. Mais ça a l'avantage d'être à peu près clair. D'ici que je trouve mieux.


Y aurait-il une solution pour garder l'état 4 ( Source Open) entre 2 acquisitions? Pour l'instant, je n'ai réussi qu'a planter la machine en essayant.
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
23 août 2007 à 13:30
La caméra que j'utilise est concue (en théorie) pour le dialogue TWAIN, et je dois récupérer des informations de la caméra, et fixer certains paramètres (pixeltype, par exemple).

Je soupçonne qu'elle ne répond pas tout à fait correctement aux standards: la démo présente des images bizarres, et la webcam manivelle ne se lance meme pas.

Je précise qu'il s'agit d'une caméra d'OEM, donc ce n'est pas une webcam qu'on trouverai à la fnac ou à carrefour.
0
Wavyrn Messages postés 20 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 1 août 2008
23 août 2007 à 14:39
bon, par contre, tu as raison, je me suis un peu précipité: TAcquireImage ne me permet pas de gérer les "capabilities" de la caméra, je n'arrive même pas à utiliser getImageInfo :c

bon, je regarde multitwain, même si ça semble bien vieux (1998)
0
Rejoignez-nous