2009-04-15 8 views
2

J'ai donc déjà un programme qui capture l'image depuis une webcam, dans un vecteur appelé pBuffer. J'acess facilement les informations de pixels RVB de chaque pixel, par simpleDirectX et OpenCV

pBuffer[i]=R;pBuffer[i+1]=G;Buffer[i+2]=B.

Pas de problème ici.

La prochaine étape est maintenant de créer un IplImage * img, et de le remplir avec les informations du pBuffer ... une sorte de SetPixel.

Il y a une fonction SetPixel sur le web, qui est la suivante:

(((uchar*)(image­>imageData + image­>widthStep*(y))))[x * image­>nChannels + channel] = (uchar)value; 

où la valeur est l'information pBuffer, x et y travailler le pixel coordinates.However je ne peux tout simplement pas mettre cela. Des idées?? Je travaille avec C++.

Répondre

1

Ce que vous essayez de faire vous pouvez faire comme ceci (en supposant la largeur et la hauteur sont les dimensions de l'image):

CvSize size; 
size.height = height; 
size.width = width; 
IplImage* ipl_image_p = cvCreateImage(size, IPL_DEPTH_8U, 3); 

for (int y = 0; y < height; ++y) 
    for (int x = 0; x < width; ++x) 
     for (int channel = 0; channel < 3; ++channel) 
      *(ipl_image_p->imageData + ipl_image_p->widthStep * y + x * ipl_image_p->nChannels + channel) = pBuffer[x*y*3+channel]; 

Cependant, vous ne disposez pas de copier les données. Vous pouvez également utiliser vos données d'image par IplImage (en supposant pBuffer est de type char *, sinon vous devez peut-être de le jeter):

CvSize size; 
size.height = height ; 
size.width = width; 
IplImage* ipl_image_p = cvCreateImageHeader(size, IPL_DEPTH_8U, 3); 
ipl_image_p->imageData = pBuffer; 
ipl_image_p->imageDataOrigin = ipl_image_p->imageData; 
+0

les données pBuffer est BYTE mais je peux y accéder en tant que int –

+0

BYTE est un typedef pour char non signé, donc vous pouvez le lancer en char en toute sécurité. Donc le code devient: ipl_image_p-> imageData = (char *) pBuffer; –

+0

mec a travaillé ... mais l'image créée dans IplImage est à l'envers ... aucune idée pourquoi? –