我很难在C ++中使用OpenCV将矩阵的子集复制到另一个更大的矩阵中。
我尝试了以下代码:
#include <opencv2/opencv.hpp>
void printMatrix(const cv::Mat &M, std::string matrix)
{
printf("Matrix \"%s\" is %i x %i\n", 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]
虽然表明复制操作没有做任何事情。
我发现了一个类似的帖子here,但是根据该帖子的建议将相关的行更新为以下内容仍会产生相同的输出。
//R0.copyTo(P0.colRange(0,2));
cv::Mat dest = P0.colRange(0,2);
printMatrix(P0, "P0 with R");
答案 0 :(得分:4)
您的代码不能为我编译。我在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
(并且您的范围不正确)。