25

私は OpenCV と C++ を使用しています。私はこのような行列Xを持っています

Mat X = Mat::zeros(13,6,CV_32FC1);

そのサブマトリックス 4x3 だけを更新したいのですが、効率的な方法でそのマトリックスにアクセスする方法に疑問があります。

Mat mat43= Mat::eye(4,3,CV_32FC1);  //this is a submatrix at position (4,4)

要素ごとに変更する必要がありますか?

4

2 に答える 2

35

最も簡単な方法の 1 つは、次のように、更新する列/行の範囲を指すヘッダー マトリックスを設定することです。

Mat aux = X.colRange(4,7).rowRange(4,8); // you are pointing to submatrix 4x3 at X(4,4)

これで、マトリックスを aux にコピーできます (ただし、aux は単なるポインターであるため、実際には X にコピーします)。

mat43.copyTo(aux);

それでおしまい。

于 2012-07-26T07:09:51.320 に答える
13

最初に、元のマトリックスを指すマトリックスを作成する必要があります。

Mat orig(13,6,CV_32FC1, Scalar::all(0));

Mat roi(orig(cv::Rect(1,1,4,3))); // now, it points to the original matrix;

Mat otherMatrix = Mat::eye(4,3,CV_32FC1);

roi.setTo(5);                // OK
roi = 4.7f;                  // OK
otherMatrix.copyTo(roi);     // OK

別のマトリックスからの「=」記号を使用して直接帰属を伴う操作を行うと、roi マトリックス ソースが元のマトリックスからその別のマトリックスに変更されることに注意してください。

// Wrong. Roi will point to otherMatrix, and orig remains unchanged
roi = otherMatrix;            
于 2012-07-26T07:10:10.983 に答える