为啥矩阵没有正确初始化/打印?

Posted

技术标签:

【中文标题】为啥矩阵没有正确初始化/打印?【英文标题】:Why are the matrices not initialized/printed correctly?为什么矩阵没有正确初始化/打印? 【发布时间】:2016-10-12 15:44:08 【问题描述】:

我在玩 cv::Mat 并认为我的代码确实表现得很奇怪,尽管我遵循here 中描述的语法。

代码:

std::cout << "parameter for matrices: " << "x = " << X << " y = " << Y << " psi = " << Psi << std::endl;
double dataRot[] =  cos(Psi), -sin(Psi), sin(Psi), cos(Psi) ;
double dataTrans[] =  X, Y ;
cv::Mat matRot(2, 2, CV_32FC1, dataRot);
cv::Mat matTrans(2, 1, CV_32FC1, dataTrans);
std::cout << "matRot = " << matRot.at<double>(0,0) << "," << matRot.at<double>(0,1) << ";" << matRot.at<double>(1,0) << "," << matRot.at<double>(1,1) << std::endl;
std::cout << "matRot = " << matRot << std::endl;
std::cout << "matTrans = " << matTrans.at<double>(0,0) << "," << matTrans.at<double>(0,1) << std::endl;
std::cout << "matTrans = " << matTrans << std::endl;
matOut = matRot*matIn + matTrans*cv::Mat::ones(1, matIn.cols, CV_32FC1);

输出:

parameter for matrices: x = 20.5 y = 20 psi = 0
matRot = 1,-0;-0,0
matRot = [0, 1.875;
  0, -0]
matTrans = 20.5,20
matTrans = [0; 2.8203125]

为什么单位矩阵没有正确初始化? 为什么第二种打印矩阵的方法会产生错误的结果? 任何帮助表示赞赏。

【问题讨论】:

CV_32FC1 不是浮点格式(不是双精度)吗? 我猜“32”是指 32 位。这实际上意味着float,而不是double。 OpenCV 不是一个非常安全的库。 【参考方案1】:

由于您使用的是double,因此OpenCV 矩阵类型应该是CV_64FC1

cv::Mat matRot(2, 2, CV_64FC1, dataRot);
cv::Mat matTrans(2, 1, CV_64FC1, dataTrans);

为简单起见,您还可以使用:

cv::Matx22d matRot(cos(Psi), -sin(Psi), sin(Psi), cos(Psi));
cv::Matx21d matTrans(X, Y);

或:

cv::Mat1d matRot = (cv::Mat1d(2,2) << cos(Psi), -sin(Psi), sin(Psi), cos(Psi));
cv::Mat1d matTrans = (cv::Mat1d(2,1) << X, Y);

并访问以下值:

std::cout << matRot(row, col);

【讨论】:

以上是关于为啥矩阵没有正确初始化/打印?的主要内容,如果未能解决你的问题,请参考以下文章

bartender(条码打印软件) 9.4,我还装seagull license server了装后还是为啥不能打印?

csharp 如何创建,初始化和打印多维数组(也称为矩阵)的示例。从计算机编程的基础知识

csharp 如何创建,初始化和打印多维数组(也称为矩阵)的示例。从计算机编程的基础知识

为啥二维动态数组有初始值?

Opengl 未使用着色器正确绘制 - 矩阵设置/初始化问题?

如何在 C 中正确初始化模型矩阵?