4

CvMatOpenCV (またはその C++ バージョン)の行配置がどのように機能するかを誰かが説明してくれませんかcv::Mat? たとえば、行列があるとしましょう

CvMat *cvmat = cvCreateMat(2,3,CV_8UC1);
cvSet2D( cvmat, 0, 0, cvScalar(1) );
cvSet2D( cvmat, 0, 1, cvScalar(2) );
cvSet2D( cvmat, 0, 2, cvScalar(3) );
cvSet2D( cvmat, 1, 0, cvScalar(4) );
cvSet2D( cvmat, 1, 1, cvScalar(5) );
cvSet2D( cvmat, 1, 2, cvScalar(6) );

のドキュメントによるとCvMat、行は 4 バイトでアラインする必要があります。つまり、行列の最初の行は 1 つのゼロでパディングし、2 番目の行はオフセット +4 から開始する必要があります)。しかし、このコードをデバッグすると、データは連続しており (つまりcvmat->data) [1,2,3,4,5,6]、4 バイトのアライメントは見られません。これはドキュメントのバグですか? or のデータの連続性を想定することは常に安全ですCvMatcv::Mat(行列が別の ofc の一部ではない場合)? または、メモリ アライメントの結果としてデータにギャップが生じる可能性のある特別な構成がいくつかありますか?

4

1 に答える 1

3

連続性を仮定するのは安全ではありません。連続性をチェックできるcv::Matメンバー関数があります(コメントにあるように、C APIにはそのためのマクロがあります):isContinuous

// returns true iff the matrix data is continuous
// (i.e. when there are no gaps between successive rows).
// similar to CV_IS_MAT_CONT(cvmat->type)
bool isContinuous() const;

step連続する行間のオフセットを通知するメンバーもあります。

// a distance between successive rows in bytes; includes the gap if any
size_t step;

したがって、8ビットのシングルチャネルイメージがあるとすると、(x、y)のピクセルはオフセットになりy * step + xます。

連続しないメモリになってしまう状況がいくつかあり、それらはメモリの配置に制限されていません。たとえば、と言うcv::Mat r = mat.col(0)と、データはコピーされませんがr、と同じメモリ領域を指し、mat「ヘッダー」が異なるだけなので、ある「ギャップ」には、列0にないマトリックスからのデータがあります。 。

于 2011-05-16T10:01:32.830 に答える