Immagine OpenNi RGB a OpenCV BGR IPLIMAGE Conversione?
Domanda
L'immagine che si può ottenere da OpenNi Immagine Meta Data è disposta come immagine RGB. Vorrei convertirlo in iPLIMAGE OpenCV che per impostazione predefinita presuppone che i dati vengano archiviati come BGR. Uso il seguente codice:
XnUInt8 * pImage = new XnUInt8 [640*480*3];
memcpy(pImage,imageMD.Data(),640*480*3*sizeof(XnUInt8));
XnUInt8 temp;
for(size_t row=0; row<480; row++){
for(size_t col=0;col<3*640; col+=3){
size_t index = row*3*640+col;
temp = pImage[index];
pImage[index] = pImage[index+2];
pImage[index+2] = temp;
}
}
img->imageData = (char*) pImage;
Qual è il modo migliore (più veloce) in C/C ++ per eseguire questa conversione in modo tale che l'immagine RGB diventa BGR (in formato iplimage)?
Soluzione
Non è facile usare la funzione di conversione del colore di OpenCV?
imgColor->imageData = (char*) pImage;
cvCvtColor( imgColor, imgColor, CV_BGR2RGB);
Altri suggerimenti
Ci sono alcuni riferimenti interessanti là fuori.
Ad esempio, il QIMAGE A IPLIMAGE CONVERTION Mostrato qui, che converte anche RGB in BGR:
static IplImage* qImage2IplImage(const QImage& qImage)
{
int width = qImage.width();
int height = qImage.height();
// Creates a iplImage with 3 channels
IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
char * imgBuffer = img->imageData;
//Remove alpha channel
int jump = (qImage.hasAlphaChannel()) ? 4 : 3;
for (int y=0;y<img->height;y++)
{
QByteArray a((const char*)qImage.scanLine(y), qImage.bytesPerLine());
for (int i=0; i<a.size(); i+=jump)
{
//Swap from RGB to BGR
imgBuffer[2] = a[i];
imgBuffer[1] = a[i+1];
imgBuffer[0] = a[i+2];
imgBuffer+=3;
}
}
return img;
}
Ci sono diversi post qui Oltre a questo che mostrano come iterare sui dati di iPLIMAGE.
Potrebbe esserci più di questo (se la codifica non è aperta opinni_wrapper :: image :: rgb). Un buon esempio può essere trovato in Il file OpenNi_Image.cpp dove usano nella riga 170 la funzione riempimento.