为啥矩阵没有正确初始化/打印?
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 如何创建,初始化和打印多维数组(也称为矩阵)的示例。从计算机编程的基础知识