web-dev-qa-db-ja.com

OpenCV 2.1:マトリックスを別のマトリックスのサブマトリックスに割り当てる方法は?

マトリックスがあると仮定します

A = cv::Mat(3,3,CV_32F) 

と行列

B = cv::Mat(2,2,CV_32F).

Aにすべて0があり、Bにすべて1があるとします。 Bの値をAの左上隅に割り当てたいのですが、どうすればよいですか?

私は以下を試しました:

A(cv::Rect_<int>(0,0,2,2)) = B

しかし、これはうまくいかないようです。ただし、この方法でAのsubrectにスカラー値を割り当てると機能します。

A(cv::Rect_<int>(0,0,2,2)) = 1.0

最初のアプローチの何が問題になっていますか?

23
Christian

私はワンライナーを好みますが、これでうまくいきます:

cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
37
Christian

修正された回答

あなたの最初の方法の理由を信じています

A(cv::Rect_<int>(0,0,2,2)) = B

動作しないのは、代入演算子=は値をコピーしませんが、マトリックスのヘッダーを変更して別のサブマトリックスを指すようにします。したがって、この行で行うことは、Aのサブマトリックスを指す一時的なヘッダーマトリックスを作成し、その一時的なマトリックスのヘッダーをBを指すように置き換えるだけです。次に、そのことを忘れます。 AとBのデータは変更されません。

あなたが欲しいもの(私はそれをテストしていませんが)は

B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
15
Tim MB

あなたはこれを1行で行うことができます:

B = A(cv::Rect(0,0,2,2)).clone();
4
user11094

ポインタを操作することを恐れないでください

const unsigned int row_size = col_size = 3;    
Mat A = Mat::one( row_size, col_size, CV_32F );
Mat B = Mat::zeros( row_size, col_size, CV_32F );

for(int i = 0; i < row_size; i++)
{
    float* Aitt = A.ptr<float>(i);
    float* Bitt = B.ptr<float>(i);

    for(int j = 0; j < ( col_size - i ); ++j)
        Aitt[j] = Bitt[j];
}

最初のアプローチの何が問題になっていますか?

多くのMatlab時間に

3