iPhoneで使われるUIImageとOpenCVで使われるIplImageの相互変換についてです。
少々気を付けないといけない事もありますが、簡単に出来ます。
まずはUIImageからIplImageにする場合です。
- (IplImage *)ToIplImage:(UIImage *)image { CGImageRef imageRef = image.CGImage; IplImage *iplimage; iplImage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef contextRef; contextRef = CGBitmapContextCreate( iplimage->imageData, iplimage->width, iplimage->height, iplimage->depth, iplimage->widthStep, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault); CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width, image.size.height), imageRef); CGContextRelease(contextRef); CGColorSpaceRelease(colorSpace); IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3); cvCvtColor(iplimage, ret, CV_RGBA2BGR); cvReleaseImage(&iplimage);
return ret; } |
渡されたUIImaageからCGImageを作成する。
渡された画像のイメージサイズでIplImageを作成する。
UIImageはRGBAの4チャンネルなので、IplImageを作成する時も4チャンネルの指定で作成します。
Contextを作成するためのColorspaceを作成する。
Contextを作成します。
第1引数にIplImageのデータを指すポインタを指定する事で画像の書き出し先がIplImageになります。
作成したContextに対して渡された画像を描画する。
IplImageに描かれたので、ColorspaceとContextはReleaseする。
OpenCVではRGBAではなくBGRで扱う方がいいので、BGRへと変換していきます。
変換元と変換先のポインタの書式が合っていないと変換出来ないので、BGR用のImageを作成して変換しないといけません。
不要になったIplImageはReleaseする。
続きを読む