おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

OpenCV の C++ Wapper の作成に挫折しかけ

最近、?そこそこ本格的?に画像処理を行う"とある"アプリケーションを作ることになりました。
(※どんなアプリケーションなのかは☆企業秘密☆です。…ホントかよ…)

そこで、色々な画像処理の関数が揃っていて便利そうな OpenCV を使うことにしました。ちょっと前にも、少しだけ使ってみたことがあるのですが、本格的に使うのは今回がはじめてでした。
で、
IplImage* cvCreateImage( CvSize size, int depth, int channels );
void cvReleaseImage( IplImage** image );
という、 OpenCV の関数を見るやいなや、"リソース管理はきっちりしなきゃな~"とか思いながら boost::shared_ptr を使って IplImage (OpenCV の画像を管理するオブジェクト) をラップし始めました。さらに、"こうしたほうが使いやすいかな~"とか色々やりまして、
IplImagePtr raw_img = LoadImage(argv[1]);
IplImagePtr ycc_img = CreateImage(raw_img->GetSize(), IPL_DEPTH_8U, 3);
CvtColor(raw_img, ycc_img, CV_BGR2YCrCb);
IplImagePtr y_plane = CreateImage(raw_img->GetSize(), IPL_DEPTH_8U, 1);
IplImagePtr cr_plane = CreateImage(raw_img->GetSize(), IPL_DEPTH_8U, 1);
IplImagePtr cb_plane = CreateImage(raw_img->GetSize(), IPL_DEPTH_8U, 1);
Split(ycc_img, y_plane, cr_plane, cb_plane);
な感じのコードは書けるくらいになりました。

OpenCV についてですが、 OpenCV の多数の関数は CvArr* (中身は typedef void CvArr;) という型の引数を持つ関数で、 IplImage* 型の画像を(暗黙に)キャストして突っ込むと言う感じです。 IplImage* 型以外にもマトリックスなどの型も突っ込めるます。しかし、どの型が突っ込めるかは関数によってまちまちで…(C++ でラップしようとすると)非常に困ります。

結局、"オブジェクト指向じゃない"というのが根本の問題なのです。また、エラー処理もユーザー指定のエラーハンドラを指定できるだけです。C++ でどうやって例外実装しましょう?

あと、 IplImage には色の深度やカラーチャンネルの数を示すメンバがあるのですが、例えば
void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );
という、エッジ検出などで使われるフィルタを呼び出すとき、 src と dst に指定する IplImage の色の深度とカラーチャンネルの数が一致していないと実行時エラーが発生します。設計の根本的な問題になってしまうのですが、テンプレートを使ってジェネリックに設計すれば、このようなエラーはコンパイル時に静的に検出できるのになぁと思ったりしました。

誰か、オブジェクト指向、且つ、ジェネリックプログラミングで、さらにSIMD命令に対応した高速な画像処理ライブラリ知りませんか~?

ちなみに、 OpenCV を C# で使おうという SharperCV というラッパーがあるのですが、こちらのプロジェクトは、 C# で使いたいオブジェクト指向のアプローチや構成は、 OpenCV のフラットなコードモデルにはないということで開発を停止してしまっているようです。



追記

ブログを書き終わった瞬間、見つけました。
STL like OpenCV wrapper
これは、名前的に、喉から手が出るほどほしいものっぽい。早速試してみよう。というか、もっとちゃんと探せば良かった。
ここ数日、ああでもないこうでもないと、ラップしていのは何だったのだろう?
  1. 2007/03/17(土) 00:18:19|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<gtkmm の描画機能について | ホーム | Turbo C++ 2006 をインストールしてみる>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/185-7d714ca4
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。