le 05-25-2009 07:35 AM
Bonjour,
Je suis en train de réaliser un système permettant de déplacer un capteur ccd linéaire avec précision et de faire l'acquisition des images.
J'ai réussi à faire un premier programme en utilisant visual studio c++, MFC et en m'inspirant des exemples de NI IMAQ pour faire l'acquisition d'images avec mon capteur.
Cependant, pour améliorer les performances de mon système, j'aurais besoin de pouvoir modifier le temps de pose pour mes acquisitions et de bien comprendre comment s'enregistrent les images depuis les buffers.
J'utilise un capteur Kodak KLI 4104 (kit d'évaluation avec timing board et imager board) relié à une carte d'acquisition NI PCI 1424.
Comme OS : Windows XP.
Comme environnement de programmation : Visual Studio 6, avec MFC.
Comme librairie pour accéder au capteur depuis le C++ : NI IMAQ fourni avec la carte d'acquisition.
Mon capteur me permet de prendre des images en niveaux de gris avec 12 bits par pixel. Si j'ai bien compris la documentation, je ne peux les sauvegarder sur le disque qu'en format png (avec imgSessionSaveBufferEx).
Et mes objectifs sont :
- accéder au(x) paramètre(s) qui permettent de modifier le temps de pose.
- savoir comment est faite la sauvegarde sur le disque : est-ce un png16 dont on n'utilise pas 4 bits ?
- comprendre pourquoi lorsque je sauvegarde une image de mon capteur en png avec NI MAX, lorsque je lis ses propriétés, il est écrit 32 bits par pixel.
Je vais continuer à chercher.
Si vous avez un élément de réponse, ou une piste à me donner, je suis tout ouïe.
Si je m'explique mal et qu'il me faut préciser plus d'éléments, indiquez-le moi.
Merci d'avance.
le 05-26-2009 08:46 AM
Bonjour,
Donc pour repondre déjà au temps de pose à savoir le nombre de frame par seconde en faite il faut considérer ceci:
while(!*stop && !error) {
t2 = GetTickCount();
// Get the frame after tne next Vertical Blank
errChk(imgGrab (Sid, &ImaqBuffer, TRUE));
// Display it using imgPlot
// Note that if you are using a board or camera with bitdepth greater
// that 8 bits, you need to set the flag parameter of imgPlot to match
// the bit depth of the camera. See the "snap imgPlot" sample.
imgPlot2 (ImaqSmplHwnd, ImaqBuffer, 0, 0, AcqWinWidth, AcqWinHeight,
CanvasLeft, CanvasTop, plotFlag);
// Calculate the number of frame per seconds every 10 frames
nbFrame++;
if (nbFrame>10){
sprintf(buffer, "%.2f", 1000.0 * (double)nbFrame / (double)(t2-t1));SetWindowText (HFrameRate, buffer);
t1 = t2;
nbFrame=0;
}
Vous faites une boucle et vous allez acquerir le plus d'images possible, à partir de là vous aurez le nombre max de frames par seconde, après si vous voulez moins de frames par seconde, il est possible d'y ajouter une fonction Sleep par exemple.
Ce qui veut dire aussi que plus votre CPU est utilisé est plus le nombre de frames sera faible.
Ensuite pour l'enregistrement, avez vous avez aussi utiliser l'API VISION (via le logiciel vision developement module), par exemple avec la fonction Writes an image to a PNG file.
Si vous n'utiliser pas l'API Vision vous avez en effet la fonction imgSessionSaveBufferEx, et pour ce qui du nombre de bit, vous avez cette fonction :
imgGetAttribute (Sid, IMG_ATTR_BITSPERPIXEL, &bitsPerPixel)
Qui permet de récuperer le nombre de bit du pixel, je vous invite alors de faire un point d'arret après cette fonction, à mon avis vous devez être dans ce cas la:
case 32:
// assumes that a 24 bits camera is a color camera.
// in this mode, even if the camera is 24 bits the board returns 32 bits values
plotFlag = IMGPLOT_COLOR_RGB32;
Cordialement.
Nacer M. | Certified LabVIEW Architecte
le 05-27-2009 01:43 PM
Bonjour, merci pour ces pistes.
En ce qui concerne la taille des fichiers sauvegardés : ils sont en fait sous 16 bits (l'information donnée par l'onglet propriétés de windows m'a induit en erreur.) Cependant, ma caméra a une résolution de 12 bits par pixel. J'ai donc vérifié les images prises avec une toolbox de Matlab. Ce qui me surprend c'est que les valeurs vont effectivement de 0 à 2^16. Il n'y a pas de 0000 ou 1111 en début ou en fin de chaque pixel (ce qui aurait indiqué un codage sous 12 bits et un remplissage jusqu'à 16 bits, il me semble).
Se peut-il que la conversion A/N faite par la caméra soit sous 12 bits et que la NI PCI 1424 transmette l'image en "étalant" sur 16 bits ? cela me paraît peu probable, mais je préfère me renseigner.
En ce qui concerne le temps d'exposition : il me semble que le temps d'exposition limite le nombre de frames par seconde, mais je ne crois pas que 10 frames par seconde impliquent en temps d'exposition de 0.1s.
De plus, en essayant de paramétrer une autre caméra avec NI MAX, j'ai vu qu'il y avait un paramètre "temps d'exposition" réglable dans l'onglet "Camera Attributes". J'ai donc consulté le fichier de configuration fourni avec la caméra, et il n'y a aucune trace du code permettant de régler ce temps. Alors qu'il est présent pour l'autre caméra. Je suis donc également en contact avec Kodak pour résoudre ce problème.
Merci pour votre aide.