読者です 読者をやめる 読者になる 読者になる

OpenCvSharp2

C#で書き直していましたがおそらく全て終わりました。拡張メソッドを使うことで結構省力化できたように思います。大体C++/CLI実装と互換性はあるんじゃないかと思いますが、やや変えてる部分はあります。
また、なんとコミッタさんが現れたため、未実装の関数も続々追加されています。


C++/CLIは完全にやめたわけではなく、まだ主に構造体のメンバにアクセスする用途で使っています。C#のstructだけでマーシャリングすることも可能ではありますが、C#とCの構造体とでいかに同期をとるかが課題となってきます。


ptrにネイティブの構造体(例えばIplImage)のポインタがIntPtr型で入っているとします。このときにptrからIplImageのwidthの値を取得する方法を考えます。
その1、ポインタからC#の構造体に変換する方法。

int w = ((IplImage)Marshal.PtrToStructure(ptr, typeof(IplImage))).width;

しかし、ただ幅の値を取りたいだけなのに構造体全部をコピーしてくるのは何だか無駄に思えます。


その2、Marshal.OffsetOfで目的のメンバ変数のオフセットにある値を持ってくる方法。

IntPtr offset = Marshal.OffsetOf(typeof(IplImage), "width");
int w = Marshal.ReadInt32(ptr, offset.ToInt32());

ただし、Marshal.OffsetOfは遅いそうです。また、doubleやfloatだと面倒です。それに何より、これで大丈夫なの?という感じで、何か不安です。


基本的に、ラッパーといえどもネイティブのヘッダファイルを書き写して実装、ということは極力したくないというのがあります。極力自前のものは無いほうが安全ですし、OpenCVのバージョンが変わってあたふたすることになるかもしれません。そうなると、やはりC++/CLIで直接ネイティブの構造体から値をとってくるのが簡単だし予想外のことも起きないという結論に達しました。ただ、この辺はまだまだ奥が深そうなので、良い方法が見つかればまた心変わりするかもしれません。

C#とOpenCVの融合プログラミング―ライブラリのラッパーDLLを利用する

C#とOpenCVの融合プログラミング―ライブラリのラッパーDLLを利用する

広告を非表示にする