EVision™ la magie de SetImagePtr()

Transcription

EVision™ la magie de SetImagePtr()
ELVITEC Sas
139, rue Philippe de Girard
84 120 Pertuis
France
Tél : (33) 04 90 09 25 80
Fax : (33) 04 90 79 34 38
Web : www.elvitec.fr
Email : [email protected]
EVision™ la magie de SetImagePtr()
Version du document : 040309_000_003
Article Technique
: OUI
Application Démo
: OUI
Code Snippet
: OUI
Source Code(*)
: OUI (* contrat Premium )
Résumé
Cet article présente la mise en œuvre de la librairie Euresys™ dans le contexte des
gestions de mémoire indépendantes, c’est à dire placées sous la responsabilité directe de
l’application ou d’une autre librairie ou pilote de périphérique.
EVision™ illustre par là son ouverture et sa versatilité.
Téléchargements
L’exécutable < eVisionSample1.exe > est en téléchargement libre sur le site FTP
d’ELVITEC.
OS Minimum : Windows2000 ou WindowsXP
PC minimum conseillé : PIV 2Ghz , 256 Mo Ram
Carte VGA Dual-Head récente type RADEAON™ 9000Pro 128Mo
[
Testé avec
PIV 2.53 Ghz, 512 Mo Ram,
PIV 3.06 Ghz HT 1Go Ram
ATI-RADEON 9000 Pro 128 Mo
NVIDIA-Quattro4 580 XGL
2 x Ecran 17”
]
Article Technique
La librairie eVision™, comme d’ailleurs la majorité des librairies-constructeurs ( par
exemple MIL™,…) dispose de son propre gestionnaire de mémoire : cette facilité peut
toutefois se révéler contraignante lorsque le développement doit adresser plusieurs
librairies, ou y mixer des algorithmes propriétaires, ou encore s’interfacer avec des
périphériques particuliers.
C’est ce contexte spécifique qui fait l’objet de cet article.
La mise en œuvre standard de eVision™, homogène à EasyMulticam et parfaitement
adaptée aux cartes d’acquisition d’Euresys n’est pas notre propos.
EVision™ C++ Reference Manual, PartII : General Library, pp 47-49 fournit les
informations fondamentales sur les classes ( les objets ) Eimage…. et EROI… et leur
documentation interne couvre pp 58-143.
Elvitec Sas – Siret : 444 341 309 00011 – APE 721 Z
Pour créer un objet Eimage… avec un buffer mémoire alloué de manière externe, il faut
utiliser la fonction membre < SetImagePtr() > décrite pp 68.
Void SetImagePtr(void* pImagePtr, INT32 n32BitsPerRow = 0) ;
Void SetImagePtr(INT32 n32Width, INT32 n32Height, void* pImagePtr,
INT32 n32BitsPerRow = 0) ;
Sets the pointer to an image buffer externally allocated. This overrides the
internally allocated image buffer of the Eimage. As long as the image accesses this
buffer it must not be deleted.
The overloaded function allows to specify the image size as the same time as the
image data pointer, thus combining the sequence of Eimage…::SetSize;
Eimage…::SetImagePtr in a single operation.
After a call to SetImagePtr(), GetImagePtr() will return this value.
Parameters
n32Width
width of the image in pixels
n32Height
height of the image in pixels
pImagePtr
pointer to a buffer large enough to hold the image
n32BitsPerRow total number of bits contained in a row, padding included. Using the
value 0 ( default) lets the image compute the appropriate value to
meet the Windows Bitmap requirements.
Remarks
An image has an associated pixel area reached through a pointer. This pointer
refers to the top left pixel of the image. The next pixels are stored contigously,
row by row, from top to bottom and from left to right. Padding at the end of a row
may be used (f.i to comply with the Windows Bitmap format).
Pour créer un objet Eimage… avec un buffer mémoire alloué de manière externe on peut
donc écrire :
1_ Allocation statique
EIMAGEBW8 m_Image;
m_pImage.SetImagePtr(640,480,(void*)pData,0);
2_ Allocation dynamique
EIMAGEBW8* m_pImage = new EIMAGEBW8;
m_pImage->SetImagePtr(640,480,(void*)pData,0);
// ......
delete p_pImage;
3_ Allocation dynamique
EIMAGEBW8* m_pImage = new EIMAGEBW8(640,480)
m_pImage->SetImagePtr(void*)pData,0);
// ......
delete p_pImage;
Nota : Dans le cas de l’allocation dynamqiue il est indispensable que les <runtime> de
l’application et de eVision sont homogènes ( cohérents ) : en pratique cela veut dire qu’il
ne faut pas mixer une version <release> et <debug> entre l’application et eVision.
La fonction SetImagePtr() N’EST PAS UNE FONCTION MEMBRE DE L’OBJET EROI… MAIS
SEULEMENT DE L’OBJET EImage…Pour disposer d’un objet EROI… il faut donc passer par
sa création propre depuis Eimage…
Elvitec Sas – Siret : 444 341 309 00011 – APE 721 Z
EImageBW8
EROIBW8
mTemp;
mEROIImageTemp;
mTemp.SetImagePtr(m_640,480,pData,0);
mEROIImageTemp.Attach(&mTemp);
mEROIImageTemp.SetSize(&mTemp);
A ce point, le développeur dispose de toutes les fonctionnalités de eVision™
depuis sa propre gestion de mémoire.
La démo < eVisionSample1.exe > utilise par exemple une séquence du type :
//
//
//
//
EROIImageBW8 est un objet EROI construit comme ci-dessus
mEROIImageTemp est un objet EROI construit comme ci-dessus
EROIImageBW8 utilise un buffer mémoire alloué via VirtualAlloc()
mEROIImageTemp utilise un buffer mémoire alloué via CreatDibSection()
EKernel
m_Kernel;
// Initialize the kernel (diagonal derivative)
m_Kernel.SetKernelData( 0.f, 0.f, -1.f,
0.f, 2.f, 0.f,
-1.f, 0.f, 0.f);
m_Kernel.SetGain(5.f);
m_Kernel.SetOffset(0);
m_Kernel.SetRectifier(0);
m_Kernel.SetOutsideValue(0);
ImgConvolKernel(&m_EROIImageBW8,&mEROIImageTemp, &m_Kernel);
m_EROIImageBW8.DrawFrame(hDC,E_FRAME_INSIDE,TRUE,1.f,0.f,0.f,0.f);
En Pratique les allocations mémoire « externes » sont généralement du type :
malloc() < ou mieux aligned_malloc() >
VirtualAlloc()
new()
CreateDIBSection()
Mais elles peuvent aussi être le résultat d’un pointeur alloué par une autre librairie de
traitement ou par le gestionnaire d’un pilote de périphérique : par exemple à partir des
buffers d’acquisition d’une carte autre qu’ Euresys™ et propres à ce système ( comme
pour MIL™) ou pour une camera IEEE1394 ou une système GigE ( voir Références ).
Conclusion :
L’allocation mémoire demeure flexible dès le moment où le développeur peut
effectivement faire correspondre des allocations de type système ou issues de ses buffers
d’acquisition à sa librairie eVision™.
Références
EVision C++ Reference Manual ( Euresys)
ELVITEC : Multicam pour développeur MIL™
ELVITEC : GigE Pleora & eVision
Elvitec Sas – Siret : 444 341 309 00011 – APE 721 Z

Documents pareils