1

独自の (内部) 画像処理ライブラリへの C# インターフェイスがあります。

インターフェイスは次のようになります。

void RGBConvert::ConvertFromRGBToYCbCr(                   
    int            ncols,        
    int            nrows,        
    IntPtr         rgb,         
    IntPtr         out)

IntPtr は、基になるメモリへのポインターです。私は Matlab から何度も .NET オブジェクトを呼び出しましたが、大きな C データ配列を C# に渡すことは私が行ったことではなく、行き止まりに達しています。

Matlab のマニュアル: http://www.mathworks.com/help/matlab/matlab_external/handling-net-data-in-matlab_bte9oxc-1.html#bte9o7y-1は、IntPtr がサポートされていないことを示しています。つまり、Unsigned8Bit 整数の配列を IntPtr に変換してメソッドに渡すわけではありません。(他のメカニズムを使用して IntPtr を構築すると、Matlab はそれを他の .NET オブジェクトと同様に処理して渡します。) では、Matlab データへのポインターを見つけて、このメソッドに渡すにはどうすればよいでしょうか?

明らかに、1 つのアプローチは、通常の Matlab C/C++ インターフェイスを使用して、matlab を「だまして」基になる配列データ構造へのポインターを明らかにし、そのポインターを IntPtr コンストラクターに渡すことです。次に、IntPtr を渡します。私たちは、「純粋な」C# 実装を持ち、C# インターフェイスに加えて C/C++ インターフェイスを持つ必要がないことを望んでいました。

もう 1 つの方法は、Matlab 呼び出しを使用して、matlab 配列を .NET 配列に変換することかもしれませんが、ConvertArrayそれでも生データを指す IntPtr が必要です。

ここでは無関係なメモリ コピーは気にしません。これはパフォーマンス クリティカルなコードではなく、実験用のコードです。

誰でもこの問題と推奨事項の経験がありますか?

考え?

4

1 に答える 1

0

MathLab 配列のアドレスを取得できない場合は、配列を受け取る (そして返す) メソッドでサードパーティ API をラップすることをお勧めします。

byte[] ConvertFromRGBToYCbCr(int ncols, int nrows, byte[] rgb)

次に、このような手法を使用して .net でこの配列のアドレスを取得し、元の RGBConvert メソッドを呼び出します。

于 2013-01-29T07:41:02.887 に答える