2008年9月30日火曜日

OpenCVのナニカをQuartz ComposerのPatchに入れてみる

追記(2009/9/19):入出力の扱いはこっちがただしいかも.

追記(2009/3/1):入出力の扱いはこっちがただしいかも.

追記(2009/2/15):
コロッと書くのを忘れていたが,出力部に関してはこちらを参照のこと!

追記(2008/10/16):
修正してみた

追記(2008/10/03):
OpenCVをMacにいれるのはこちらの"やったこと/1.OpenCVを入れる"を参照してください.


という例にならんかな.まぁ前のエントリの勢いなだけです.
これ.
ポートレートのオリジナルはこちら(Photo by Joi)
ただ,この機能はそれなりに重たいので画像をクリックして右下をみてもらいたいのですが
0.84 FPS
….

それだけ.


以下記録.
1.ライブラリを入れる
zlib同様に/opt/local/libを開いてDnDしておく.
> pkg-config --cflags opencv --libs opencv
-I/opt/local/include/opencv -L/opt/local/lib -lcxcore -lcv -lhighgui -lcvaux -lml
>
の結果からとりあえず
libcv.dylib, libcxcore.dylib, libcvaux.dylib, libml.dylib, libhighgui.dylib
あたりになる.

2.ヘッダファイルの検索先を指定する
プロジェクトの情報/ビルド(タブ)/検索パス/ヘッダ検索パス
/opt/local/include/opencv
を追加する.

3.アーキーテクチャを指定する
portsがどうしているかわからないけどとりあえず自身のアーキテクチャしかどうにもできないらしい.(っていうかOpenCVが入れられるのがIntelのみなのかもしれない.)
ので,
プロジェクトの情報/ビルド(タブ)/アーキテクチャ/アーキテクチャ
Native Architecture of Build Machine
に切り替えておく.

4.画像の入出力まわり
あってるかわからんがこんな感じ.

...
@interface OpenCV_FaceDetectorPlugIn : QCPlugIn
{
...
}
...
@property(assign) id<QCPlugInInputImageSource> inputSourceImage;
@property(assign) id<QCPlugInOutputImageProvider> outputResultImage;
...
@end
//---------------------------------------------------------
...
@implementation OpenCV_FaceDetectorPlugIn
@dynamic inputSourceImage, outputResultImage;
...
- (BOOL) execute:(id<QCPlugInContext>)context atTime:(NSTimeInterval)time withArguments:(NSDictionary*)arguments
{
id<QCPlugInInputImageSource> image= self.inputSourceImage;
if (!image) {
return YES;
}
[image lockBufferRepresentationWithPixelFormat:QCPlugInPixelFormatBGRA8
colorSpace:[image imageColorSpace]
forBounds:[image imageBounds]];
void *p= malloc([image bufferBytesPerRow]*[image bufferPixelsHigh]);
memcpy(p, [image bufferBaseAddress], [image bufferBytesPerRow] * [image bufferPixelsHigh]);
IplImage *src_img = calloc(1, sizeof(IplImage));
{
src_img->nSize = sizeof(IplImage);
src_img->ID = 0;
src_img->nChannels = 4;
src_img->depth = IPL_DEPTH_8U;
src_img->dataOrder = 0;
src_img->origin = 0;
src_img->width = [image bufferPixelsWide];
src_img->height = [image bufferPixelsHigh];
src_img->roi = NULL;
src_img->maskROI = NULL;
src_img->imageData = p;
src_img->widthStep = [image bufferBytesPerRow];
src_img->imageDataOrigin= p;
}

[image unlockBufferRepresentation];

//op.

self.outputResultImage=
[context outputImageProviderFromBufferWithPixelFormat:QCPlugInPixelFormatBGRA8
pixelsWide:src_img->width
pixelsHigh:src_img->height
baseAddress:src_img->imageData
bytesPerRow:src_img->widthStep
releaseCallback:_BufferReleaseCallback
releaseContext:NULL
colorSpace:[image imageColorSpace]
shouldColorMatch:NO];
return YES;
}
...
@end
IplImageへの複写(ボールド体部)はほんとにこれでいいか不明で不安.

5.リソースへのアクセス(パスの取得)
 NSBundle* mainBundle = [NSBundle bundleWithIdentifier:@"com.yourcompany.OpenCV_FaceDetector"];
const char *cascade_name = [[mainBundle pathForResource:@"haarcascade_frontalface_default" ofType:@"xml"] UTF8String];

Identifierはプロジェクト内のInfo.plistにある"Bundle identifier"参照.

参考:こちらとかもスナップが豊富で参考になる.
XcodeでOpenCV開発 - MineAPの(開発)日記
http://d.hatena.ne.jp/MineAP/20080112/1200125226

0 件のコメント: