假设我有一个矩阵
A = cv::Mat(3,3,CV_32F)
和矩阵
B = cv::Mat(2,2,CV_32F).
假设A全部为零而B则全部为零。 我想将B的值分配给A的左上角。我该怎么办?
我尝试了以下内容:
A(cv::Rect_<int>(0,0,2,2)) = B
但这似乎不起作用。但是,以这种方式将标量值指定给A的子矩阵确实有效:
A(cv::Rect_<int>(0,0,2,2)) = 1.0
第一种方法有什么问题?
答案 0 :(得分:36)
我更喜欢单行,但这样做的诀窍是:
cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
答案 1 :(得分:14)
我相信你的第一个方法的原因
A(cv::Rect_<int>(0,0,2,2)) = B
不起作用是因为赋值运算符=
不复制值,而是修改矩阵的标题以指向另一个的子矩阵。因此,所有这一行都是创建一个指向A的子矩阵的临时标头矩阵,然后将该临时矩阵的标题替换为B,然后忘记它。 A和B中的数据保持不变。
你想要的是什么(虽然我没有测试过)是
B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
答案 2 :(得分:4)
您可以在以下行中执行此操作:
B = A(cv::Rect(0,0,2,2)).clone();
答案 3 :(得分:3)
不要害怕使用指针
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时间