iOSでOpenCVのサンプルが動かない
OpenCVでどんなことができるんだろうなってのをみたくて、
画像処理 — OpenCV-CookBook
↑このあたりのサンプルで面白そうなのを片っ端からiPhone実機でテストしてるんだけど、たまにiOS特有の問題か(?)うまく動いてくれないことがあるのよ。
(1)UIImageからcv::Matへの変換
K-meansによるピクセル値のクラスタリング(減色)
↑この項のサンプルが動かなくてどういうことだよ?ってコードを調べるとどうもUIImageをcv::Matに変換する部分がまずいっぽい。上記チュートリアルサイトは別にiOSに限ったわけではないので、その辺りは自分で適切にする必要があったのよね。
どうやらCV_8UC3の画像が必要なのにUIImageから変換する部分でCV_8UC4でメモリ確保してる。符号無し8ビットの4チャンネルってやつ。アルファチャンネルが不要だからそこだけ削除すればいいんだろうけど、、、どうすんのよ?って調べてみたらこんなページが。
objective c - CGBitmapContextCreate for CV_8UC3 (to use in OpenCV) - Stack Overflow
これを参考に
(2)xmlファイルを読み込む
http://opencv.jp/cookbook/opencv_img.html#id40 顔を検出する
↑なぜかリンクを設定すると正常に表示されないので文字列だけ書いておくけど、、、
ここで分類器のxmlファイルを読み込む部分があるんだけど、どうやったらいいのかよくわらかず、、、
結局読み込みたいファイルをXcodeにドラッグ&ドロップして参照するようにして、こういう流れで。
画像処理 — OpenCV-CookBook
↑このあたりのサンプルで面白そうなのを片っ端からiPhone実機でテストしてるんだけど、たまにiOS特有の問題か(?)うまく動いてくれないことがあるのよ。
(1)UIImageからcv::Matへの変換
K-meansによるピクセル値のクラスタリング(減色)
↑この項のサンプルが動かなくてどういうことだよ?ってコードを調べるとどうもUIImageをcv::Matに変換する部分がまずいっぽい。上記チュートリアルサイトは別にiOSに限ったわけではないので、その辺りは自分で適切にする必要があったのよね。
どうやらCV_8UC3の画像が必要なのにUIImageから変換する部分でCV_8UC4でメモリ確保してる。符号無し8ビットの4チャンネルってやつ。アルファチャンネルが不要だからそこだけ削除すればいいんだろうけど、、、どうすんのよ?って調べてみたらこんなページが。
objective c - CGBitmapContextCreate for CV_8UC3 (to use in OpenCV) - Stack Overflow
これを参考に
cv::cvtColor(img , img , CV_RGBA2RGB);としてやればちゃんと動いてくれたよ。
(2)xmlファイルを読み込む
http://opencv.jp/cookbook/opencv_img.html#id40 顔を検出する
↑なぜかリンクを設定すると正常に表示されないので文字列だけ書いておくけど、、、
ここで分類器のxmlファイルを読み込む部分があるんだけど、どうやったらいいのかよくわらかず、、、
結局読み込みたいファイルをXcodeにドラッグ&ドロップして参照するようにして、こういう流れで。
{ NSString* resDir = [[NSBundle mainBundle] resourcePath]; const char *cascade_name = "haarcascade_frontalface_alt.xml"; char cascade_path[PATH_MAX]; sprintf(cascade_path, "%s/%s", [resDir cStringUsingEncoding:NSASCIIStringEncoding], cascade_name ); cv::CascadeClassifier cascade; if(!cascade.load(cascade_path)) { NSLog(@"loading failed"); return; } }
スポンサーサイト