2009-04-15 13 views
2

So habe ich bereits ein Programm geschrieben, das das Bild von einer Webcam in einen Vektor namens pBuffer erfasst. Ich kann leicht Acess die RGB-Pixelinformation jeden Pixel, einfach durchDirectX und OpenCV

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

Kein Problem hier.

Der nächste Schritt ist jetzt ein IplImage * img, und füllen Sie es mit den Informationen des pBuffer ... eine Art von SetPixel.

Es gibt eine SetPixel Funktion auf dem Netz, das heißt:

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

, wo der Wert der pBuffer Information ist, x und y die Pixel coordinates.However ich kann das einfach nicht an die Arbeit. Irgendwelche Ideen?? Ich arbeite mit C++.

Antwort

1

Was Sie versuchen, was Sie tun können, wie dies tun (vorausgesetzt, Breite und Höhe sind die Bildabmessungen):

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]; 

Allerdings müssen Sie nicht auf die Daten kopieren. Sie können auch Ihre Bilddaten durch IplImage verwenden (pBuffer Annahme ist vom Typ char *, sonst müssen Sie es möglicherweise werfen):

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

die Daten in pBuffer BYTE ist jedoch ich es als ein int –

+0

BYTE Zugriff ist ein typedef für unsigned char, so können Sie es sicher in char umwandeln. Also der Code wird es: ipl_image_p-> imageData = (char *) pBuffer; –

+0

dude es funktioniert ... aber das Bild in IplImage erstellt ist auf den Kopf gestellt ... keine Ahnung warum? –