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する。
続いてIplImageからUIImageにする場合です。
前提として、渡されてくるIplImageはRGB形式とします。
- (UIImage *)ToUIImage:(IplImage *)image { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CFDataRef data = CFDataCreate(NULL, (UInt8 *)image->imageData, image->imageSize); CGDataProviderRef provider = CGDataProviderCreateWithCFData(data); CGImageRef imageRef = CGImageCreate(image->width, image->height, image->depth, image->depth * image->nChannels, image->widthStep, colorSpace, kCGImageAlphaNone | kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault); UIImage *ret = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef); CGDataProviderRelease(provider); CGColorSpaceRelease(colorSpace); CFRelease(data); return ret; } |
Colorspaceを作成する。
IplImageのデータとデータサイズ(Length)からCFDataを作成する。
作成したCFDataからProviderを作成する。
CGImageを作成する。
作成したCGImageからUIImageを作成する。
不要になった物をReleaseする。
これでUIImageとIplImageの相互変換が可能になります。
他の方法など知っている方や質問があればコメントいただけるとうれしいです。
本格オーディオを凌ぐクオリティサウンド。
iPod/iPhone対応のスピーカーシステム。 
|
SoundDock Series II digital music systemは、iPodやiPhoneのために開発された小型本格オーディオです。コンセントにつなぐだけで簡単に設置でき、リビングやキッチン、寝室など、お好きな場所で本格オーディオとして楽しめる、据え置きタイプのスピーカーシステムです。
中央のドック部分にiPodやiPhoneを置くだけのシンプル操作はそのまま。今まで気づかなかったかすかなサウンドまでクリアに再生、表情豊かな音楽がお部屋を満たします。 |