プログラム / 2009/06/08 (Mon) / 編集 |
OpenCV(lplImage)とARToolKit(ARUint8)の相互変換
[見習い日記]ARToolkitとOpenCVの相互画像変換より4ちゃんねるのIplImageをARToolKit用の画像に変換する方法(以下引用です。トラックバック等は必ず「http://d.hatena.ne.jp/narai/20081207/1228637893」へ)ARUint8 *dataPtr;
IplImage *image_opencv, *gray_opencv;
//ARToolkit→OpenCV
image_opencv = cvCreateImage(cvSize(arImXsize, arImYsize), IPL_DEPTH_8U, 4);
memcpy(image_opencv->imageData, dataPtr, image_opencv->imageSize);
//何らかの処理
gray_opencv = cvCreateImage(cvSize(arImXsize, arImYsize), IPL_DEPTH_8U, 1);
cvCvtColor(image_opencv, gray_opencv, CV_BGRA2GRAY);
cvAdaptiveThreshold(gray_opencv, gray_opencv, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 11, 10);
cvCvtColor(gray_opencv, image_opencv, CV_GRAY2BGRA);
//OpenCV→ARToolkit
dataPtr = (ARUint8*)(image_opencv->imageData);
[programming memo]ARToolKit:IplImageとの相互変換より3ちゃんねるのIplImageをARToolKit用の画像に変換する方法(以下引用です。トラックバック等は必ず「http://progmemo.blogspot.com/2009/04/artoolkitiplimage.html」へ)
//flagが-1なら逆変換 void ARtoIpl(IplImage* ipl, ARUint8* arimg,int flag){ int width = ipl->width; //ARのImageも同じ幅とする int height = ipl->height; //ARのImageも同じ高さとする int ARWidthStep = width * 4; for(int j = 0; j < height; j++){ for(int i = 0; i < width; i++){ t0 = ipl->widthStep * j + i * ipl->nChannels; t1 = ARWidthStep * j + i * 4; for(int c = 0; c <>nChannels; c++){ if(flag == -1) arimg[t1 + c] = ipl->imageData[t0 + c]; else ipl->imageData[t0 + c] = arimg[t1 + c]; } } }
IPL_DEPTH_8Uでdepthを8(256諧調)にするのと、4チャンネルの画像にすることが大事なのかな?でも4チャンネル目は0らしい
PR