将一个矩阵复制到另一个矩阵的子集

Copy a matrix to a subset of another matrix

本文关键字:另一个 子集 复制 一个      更新时间:2023-10-16

我在c++中使用OpenCV将矩阵的子集复制到另一个更大的矩阵中有困难。

我尝试了以下代码:

#include <opencv2/opencv.hpp>
void printMatrix(const cv::Mat &M, std::string matrix)
{
    printf("Matrix "%s" is %i x %in", matrix.c_str(), M.rows, M.cols);
    std::cout << M << std::endl;
}
int main(int argc, char ** argv)
{
    cv::Mat P0(3, 4, CV_32F);
    printMatrix(P0, "P0 Initial");
    cv::Mat R0 = cv::Mat::eye(3,3,CV_32F);
    printMatrix(R0, "R0 I");
    R0.copyTo(P0.colRange(0,2));
    printMatrix(P0, "P0 with R");
    return 0;
}

生成以下输出:

Matrix "P0 Initial" is 3 x 4
[-4.3160208e+008, -4.3160208e+008, -4.3160208e+008, -4.3160208e+008;
-4.3160208e+008, -4.3160208e+008, -4.3160208e+008, -4.3160208e+008;
-4.3160208e+008, -4.3160208e+008, -4.3160208e+008, -4.3160208e+008]
Matrix "R0 I" is 3 x 3
[1, 0, 0;
0, 1, 0;
0, 0, 1]
Matrix "P0 with R" is 3 x 4
[-4.3160208e+008, -4.3160208e+008, -4.3160208e+008, -4.3160208e+008;
-4.3160208e+008, -4.3160208e+008, -4.3160208e+008, -4.3160208e+008;
-4.3160208e+008, -4.3160208e+008, -4.3160208e+008, -4.3160208e+008]

While表示复制操作没有做任何操作。

我在这里发现了一个类似的帖子,但根据该帖子的建议将相关行更新为以下内容仍然产生相同的输出。

//R0.copyTo(P0.colRange(0,2));
cv::Mat dest = P0.colRange(0,2);
printMatrix(P0, "P0 with R");

你的代码不能为我编译。我在R0.copyTo(P0.colRange(0,2));得到一个错误(如果我尝试R0.copyTo(P0.colRange(0,3));有正确的范围。)但这确实适用于我:

    cv::Mat dest(P0.colRange(0,3));
    R0.copyTo(dest);
    printMatrix(P0, "P0 with R");

你几乎有它在你的最后一个代码示例,但你遗漏了copyTo(和你的范围是不正确的)。