0

プレーンな C インターフェイスを提供する DLL 内で OpenCV を使用しています。C++ オブジェクトを呼び出し元のアプリケーションに渡すことはできません。

この DLL の一部は、後のパターン認識のために基準学習を実行します。これにより、キーポイントのリストと Mat オブジェクトが生成されます。これらのデータは、呼び出し元のアプリケーションによって保存される必要があります。

プレーンな C 構造体を使用すれば、DLL インターフェイスを介してキーポイントを渡すことは問題ありません。そのようなキーポイントのメンバーは簡単に変換できます。しかし、cv::Mat のどの部分が本当に必要なのかわかりません。または、より正確に言うと、私のマットオブジェクトは、メモリ領域を指すメンバー「データ」を使用しますが、含まれるデータの量がわかりません。

私の質問: cv::Mat オブジェクトをプレーンな C スタイルの構造に変換するにはどうすればよいですか? データ フィールドの正確な長さを推定するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

1

画像データに生のポインターを渡す必要がある場合、最悪の場合、画像データが連続していない可能性があるため、ポインター マジックを使用してコピーを行う必要があります。このチュートリアルで詳しく説明されています。

int channels = I.channels();

int nRows = I.rows * channels;
int nCols = I.cols;

if (I.isContinuous())
{
    nCols *= nRows;
    nRows = 1;
}

int i,j;
uchar* p;
for( i = 0; i < nRows; ++i)
{
    p = I.ptr<uchar>(i);
    // And here "p" points to "nCols" components
    // row size = nCols * channels * component size (1 byte usually)
}
于 2012-09-27T15:25:10.683 に答える
1

簡単な方法は、cv::Mat を従来の OpenCV C 構造である IplImage に変換することです。

cv::Mat mat = imread(...);
IplImage img(mat); // hope it's the correct syntax...

Mat パラメータのより詳細な説明:

  • data: データへのポインタ
  • 行、列: ...
  • type() - データ型:
  • channels() - チャネル数
  • step() - イメージ内の 2 つの連続する行の間のストライド (バイト単位)。「ギャップがある場合はそれを含めます」
  • CV_ELEM_SIZE(cvmat->type) と同様の size_t elemSize()
  • size_t elemSize1() は、要素チャネルのサイズをバイト単位で返します。

データ フィールドの長さの計算方法は次のとおりです。

Mat::rows * Mat::step()
于 2012-09-27T14:09:17.603 に答える