マトリックスがあると仮定します
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
最初のアプローチの何が問題になっていますか?
私はワンライナーを好みますが、これでうまくいきます:
cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
あなたの最初の方法の理由を信じています
A(cv::Rect_<int>(0,0,2,2)) = B
動作しないのは、代入演算子=
は値をコピーしませんが、マトリックスのヘッダーを変更して別のサブマトリックスを指すようにします。したがって、この行で行うことは、Aのサブマトリックスを指す一時的なヘッダーマトリックスを作成し、その一時的なマトリックスのヘッダーをBを指すように置き換えるだけです。次に、そのことを忘れます。 AとBのデータは変更されません。
あなたが欲しいもの(私はそれをテストしていませんが)は
B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
あなたはこれを1行で行うことができます:
B = A(cv::Rect(0,0,2,2)).clone();
ポインタを操作することを恐れないでください
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時間に