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

Chr*_*ian 23 opencv

假设我有一个矩阵

A = cv::Mat(3,3,CV_32F) 
Run Code Online (Sandbox Code Playgroud)

和一个矩阵

B = cv::Mat(2,2,CV_32F).
Run Code Online (Sandbox Code Playgroud)

假设A全部为零而B则全部为零.我想将B的值分配给A的左上角.我该怎么做?

我尝试了以下方法:

A(cv::Rect_<int>(0,0,2,2)) = B
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.但是,以这种方式将标量值指定给A的子矩阵确实有效:

A(cv::Rect_<int>(0,0,2,2)) = 1.0
Run Code Online (Sandbox Code Playgroud)

第一种方法有什么问题?

Chr*_*ian 36

我更喜欢单行,但这样做的诀窍:

cv::Mat tmp = A(cv::Rect(0,0,2,2));
B.copyTo(tmp);
Run Code Online (Sandbox Code Playgroud)


Tim*_* MB 14

修改后的答案

我相信你的第一个方法的原因

A(cv::Rect_<int>(0,0,2,2)) = B
Run Code Online (Sandbox Code Playgroud)

不起作用是因为赋值运算符=不复制值,而是修改矩阵的标题以指向另一个的子矩阵.因此,所有这一行都是创建一个指向A的子矩阵的临时头矩阵,然后将该临时矩阵的头部替换为B,然后忘记它.A和B中的数据保持不变.

你想要什么(虽然我没有测试过)

B.copyTo(A(cv::Rect_<int>(0,0,2,2)))
Run Code Online (Sandbox Code Playgroud)


use*_*094 5

您可以在一行中执行此操作:

B = A(cv::Rect(0,0,2,2)).clone();
Run Code Online (Sandbox Code Playgroud)