无法找出涉及设置旋转矩阵的逻辑错误
Can't Figure out Logic Error involving Setting Rotation Matrix
我正在尝试从我拥有的 3x4 姿势矩阵中提取 3x3 旋转矩阵。但是,即使我使用非常简单的代码将一个值设置为另一个值,两个值还是不同的。我正在用头撞墙,因为我不知道为什么会这样。这是代码:
std::cout << "Camera pose matrix from optical flow homography" << std::endl;
for (int e = 0; e < pose.rows; e++) {
for (int f = 0; f < pose.cols; f++) {
std::cout << pose.at<double>(e,f) << " " << e << " " << f;
std::cout << " ";
}
std::cout << "\n" << std::endl;
}
std::cout << "Creating rotation matrix" << std::endl;
Mat rotvec = Mat::eye(3, 3, CV_32FC1);
for (int s = 0; s < pose.rows; s++) {
for (int g = 0; g < pose.cols-1; g++) {
rotvec.at<double>(s, g) = pose.at<double>(s,g);
std::cout << rotvec.at<double>(s,g) << " " << s << " " << g;
std::cout << " ";
}
std::cout << "\n" << std::endl;
}
std::cout << "Rotation matrix" << std::endl;
for (int e = 0; e < pose.rows; e++) {
for (int f = 0; f < pose.cols-1; f++) {
std::cout << rotvec.at<double>(e,f) << " " << e << " " << f;
std::cout << " ";
std::cout << pose.at<double>(e,f) << " " << e << " " << f;
std::cout << " ";
}
std::cout << "\n" << std::endl;
}
这是输出:
Camera pose matrix from optical flow homography
5.26354e-315 0 0 0 0 1 0.0078125 0 2 0 0 3
0.0078125 1 0 0 1 1 0 1 2 5.26354e-315 1 3
0 2 0 5.26354e-315 2 1 1.97626e-323 2 2 7.64868e-309 2 3
Creating rotation matrix
5.26354e-315 0 0 0 0 1 0.0078125 0 2
0.0078125 1 0 0 1 1 0 1 2
0 2 0 5.26354e-315 2 1 1.97626e-323 2 2
Rotation matrix
5.26354e-315 0 0 5.26354e-315 0 0 0 0 1 0 0 1 5.26354e-315 0 2 0.0078125 0 2
0.0078125 1 0 0.0078125 1 0 0 1 1 0 1 1 0.0078125 1 2 0 1 2
0 2 0 0 2 0 5.26354e-315 2 1 5.26354e-315 2 1 1.97626e-323 2 2 1.97626e-323 2 2
在这里你可以看到我正在尝试将姿势的前三列保存到 rotvec 矩阵中。当我实际将旋转矩阵设置为等于这三列的姿势时,我得到了正确的矩阵,因为第二个矩阵等于第一个矩阵的前三列。但是,当我再次检查旋转矩阵时,(第三矩阵)它与我在坐标 (0, 2) 和 (1, 2) 上需要的输出不同。 (我在姿势矩阵编号旁边输出了 rotvec 矩阵编号,您可以在这些坐标处看到数字不匹配)。我不确定为什么会这样,有人可以帮帮我吗?
为后来偶然发现此问题的其他人解决了我的问题:我只是将 Mat 类型更改为 CV_64F(使其成为双倍),用于 rotvec 和 pose,并全部用于显示。感谢 berak 为我指明了正确的方向。
我正在尝试从我拥有的 3x4 姿势矩阵中提取 3x3 旋转矩阵。但是,即使我使用非常简单的代码将一个值设置为另一个值,两个值还是不同的。我正在用头撞墙,因为我不知道为什么会这样。这是代码:
std::cout << "Camera pose matrix from optical flow homography" << std::endl;
for (int e = 0; e < pose.rows; e++) {
for (int f = 0; f < pose.cols; f++) {
std::cout << pose.at<double>(e,f) << " " << e << " " << f;
std::cout << " ";
}
std::cout << "\n" << std::endl;
}
std::cout << "Creating rotation matrix" << std::endl;
Mat rotvec = Mat::eye(3, 3, CV_32FC1);
for (int s = 0; s < pose.rows; s++) {
for (int g = 0; g < pose.cols-1; g++) {
rotvec.at<double>(s, g) = pose.at<double>(s,g);
std::cout << rotvec.at<double>(s,g) << " " << s << " " << g;
std::cout << " ";
}
std::cout << "\n" << std::endl;
}
std::cout << "Rotation matrix" << std::endl;
for (int e = 0; e < pose.rows; e++) {
for (int f = 0; f < pose.cols-1; f++) {
std::cout << rotvec.at<double>(e,f) << " " << e << " " << f;
std::cout << " ";
std::cout << pose.at<double>(e,f) << " " << e << " " << f;
std::cout << " ";
}
std::cout << "\n" << std::endl;
}
这是输出:
Camera pose matrix from optical flow homography
5.26354e-315 0 0 0 0 1 0.0078125 0 2 0 0 3
0.0078125 1 0 0 1 1 0 1 2 5.26354e-315 1 3
0 2 0 5.26354e-315 2 1 1.97626e-323 2 2 7.64868e-309 2 3
Creating rotation matrix
5.26354e-315 0 0 0 0 1 0.0078125 0 2
0.0078125 1 0 0 1 1 0 1 2
0 2 0 5.26354e-315 2 1 1.97626e-323 2 2
Rotation matrix
5.26354e-315 0 0 5.26354e-315 0 0 0 0 1 0 0 1 5.26354e-315 0 2 0.0078125 0 2
0.0078125 1 0 0.0078125 1 0 0 1 1 0 1 1 0.0078125 1 2 0 1 2
0 2 0 0 2 0 5.26354e-315 2 1 5.26354e-315 2 1 1.97626e-323 2 2 1.97626e-323 2 2
在这里你可以看到我正在尝试将姿势的前三列保存到 rotvec 矩阵中。当我实际将旋转矩阵设置为等于这三列的姿势时,我得到了正确的矩阵,因为第二个矩阵等于第一个矩阵的前三列。但是,当我再次检查旋转矩阵时,(第三矩阵)它与我在坐标 (0, 2) 和 (1, 2) 上需要的输出不同。 (我在姿势矩阵编号旁边输出了 rotvec 矩阵编号,您可以在这些坐标处看到数字不匹配)。我不确定为什么会这样,有人可以帮帮我吗?
为后来偶然发现此问题的其他人解决了我的问题:我只是将 Mat 类型更改为 CV_64F(使其成为双倍),用于 rotvec 和 pose,并全部用于显示。感谢 berak 为我指明了正确的方向。