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