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

アンマネージ関数にdelegateを渡すと落ちる

前回の記事の件で訂正。もう少し探っていくと、2重のdelegateでなくとも単にアンマネージ関数に空のdelegateを渡すだけでも落ちていました。お手上げ状態なのは相変わらずです。GCが発動すると落ちるということしかわかっていません。

そのアンマネージ関数というのは具体的に言ってしまうとOpenCVのcvSeqPartitionのことです。比較関数のデリゲートを指定してそれで分類するといった処理を行います。
http://opencv.jp/opencv-1.1.0/document/opencvref_cxcore_misc.html#decl_cvSeqPartition


ただしここで、(ちょっと癪ですが)cvSeqPartitionが使えないとどうしようもないかと聞かれると、そうではないはずです。CvSeqはC言語では便利ですが、C++STLや、ましてC#ではListをはじめとしたもっと有用な動的配列があるので、CvSeqはOpenCVの関数に渡すためにしぶしぶ使うというのが実情です。

OpenCvSharpでは、CvSeqと普通の配列(int[]など)とを相互に変換する機能があるので、CvSeqをマネージドな世界に落とし込んでしまえば大概は何とかなるような気もしています。

// CvSeq<int> -> int[]
int[] array = seq.ToArray();

// int[] -> CvSeq<int>
CvSeq<int> seq = CvSeq<int>.FromArray(array, SeqType.EltypeS32C1, storage); 

また、そもそもわざわざ変換しなくとも、CvSeqはIEnumerableインターフェイスを実装しているので、LINQを使って色々できたりもします。



本当にどうしようもなければ、ネイティブコードを呼ぶのをやめてマネージ側で実装するしかないかと思っています。


.NET Framework―プログラミングテクニックfor Visual Basic/C#〈Vol.7〉グラフィックス&イメージ(2)C#編

.NET Framework―プログラミングテクニックfor Visual Basic/C#〈Vol.7〉グラフィックス&イメージ(2)C#編