iPhone&Androidプログラミング記: iPhoneでOpenCVを使えるようにする(5)
英語─上達しないのは努力不足が原因ではなかった!
英語が話せない…を解決する博士開発の噂の英語教材!返品保証付!

2009年04月07日

iPhoneでOpenCVを使えるようにする(5)

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を置くだけのシンプル操作はそのまま。今まで気づかなかったかすかなサウンドまでクリアに再生、表情豊かな音楽がお部屋を満たします。


posted by ラキシス at 17:24 | Comment(0) | TrackBack(0) | OpenCV + iPhone | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。