在OpenCV 2.1中:如何将矩阵分配给另一个矩阵的子矩阵?

时间:2010-10-27 08:30:44

标签: opencv

假设我有一个矩阵

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

第一种方法有什么问题?

4 个答案:

答案 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时间