ARUnit8是ARToolKit中使用的图像格式,与OpenCV中惯用的IplImage中的图像互转的方式如下:
ARImageTo IplImage
IplImage*ARImageToIplImage(ARUint8*dataPtr,int xsize,int ysize)
{
UCHAR rgbTmp[3];
若ARUint8*dataPtr是四道通
IplImage* opencvImage=cvCreateImage(cvSize(xsize, ysize), IPL_DEPTH_8U, 4 );
memcpy(opencvImage->imageData, dataPtr, opencvImage->imageSize);
//若ARUint8*dataPtr是三道通
IplImage* cvimg = cvCreateImage(cvSize(xsize, ysize), IPL_DEPTH_8U, 3 );
for(int y=0; y < opencvImage->height; y++)
{
for(int x=0; x < opencvImage->width; x++)
{
rgbTmp[0] = opencvImage->imageData[opencvImage->widthStep * y + x*4]; // B
rgbTmp[1] = opencvImage->imageData[opencvImage->widthStep * y + x*4 + 1]; // G
rgbTmp[2] = opencvImage->imageData[opencvImage->widthStep * y + x*4 + 2]; // R
cvimg->imageData[cvimg->widthStep * y + x*3] = rgbTmp[0];
cvimg->imageData[cvimg->widthStep * y + x*3 + 1] = rgbTmp[1];
cvimg->imageData[cvimg->widthStep * y + x*3 + 2] = rgbTmp[2];
}
}
// cvShowImage("Image",cvimg);
// cvWaitKey(0);
return cvimg;
}
IplImage To ARImage
ARUint8*IplImageToARImage(IplImage*Image,int xsize,int ysize)
{
ARUint8 *dataPtr=new ARUint8[xsize*ysize*4];
UCHAR rgbTmp[3];
IplImage*opencvImage2=cvCreateImage(cvSize(xsize, ysize), IPL_DEPTH_8U, 4 );
for(int y=0; y < Image->height; y++)
{
for(int x=0; x < Image->width; x++)
{
rgbTmp[0] = Image->imageData[Image->widthStep * y + x*3]; // B
rgbTmp[1] = Image->imageData[Image->widthStep * y + x*3 + 1]; // G
rgbTmp[2] = Image->imageData[Image->widthStep * y + x*3 + 2]; // R
opencvImage2->imageData[opencvImage2->widthStep * y + x*4] = rgbTmp[0];
opencvImage2->imageData[opencvImage2->widthStep * y + x*4 + 1] = rgbTmp[1];
opencvImage2->imageData[opencvImage2->widthStep * y + x*4 + 2] = rgbTmp[2];
opencvImage2->imageData[opencvImage2->widthStep * y + x*4 + 3] = 255;
}
}
memcpy(dataPtr,opencvImage2->imageData, opencvImage2->imageSize);
///
// cvShowImage("cv", Image);
// cvShowImage("cv4", opencvImage2);
//cvWaitKey(0);
return dataPtr;
}