【问题标题】:Can't Figure out Logic Error involving Setting Rotation Matrix无法弄清楚涉及设置旋转矩阵的逻辑错误
【发布时间】:2015-06-29 18:32:21
【问题描述】:

我正在尝试从我拥有的 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 rotvec = Mat::eye(3, 3, CV_32FC1) float 垫子,你不能使用:rotvec.at&lt;double&gt;(s, g)
  • 我应该使用rotvec.at&lt;float&gt;(s, g)吗?
  • 我试过这个,当我打印出 rotvec 矩阵并且仍然得到不同的值时,也将 更改为 :/
  • 好的,所以修改了代码以更好地适应我的目的:std::cout &lt;&lt; "Creating rotation matrix" &lt;&lt; std::endl; Mat rotvec = pose.clone(); rotvec = rotvec.colRange(0, rotvec.cols-1); for (int e = 0; e &lt; rotvec.rows; e++) { for (int f = 0; f &lt; rotvec.cols; f++) { std::cout &lt;&lt; rotvec.at&lt;double&gt;(e,f); std::cout &lt;&lt; " "; } std::cout &lt;&lt; "\n" &lt;&lt; std::endl; } 这有点帮助,但我仍然得到一个数字,即 2x2 位置的那个。此外,每次我运行代码时,这两个矩阵中的数字都会发生变化。这是为什么呢?

标签: opencv rotation logic mat


【解决方案1】:

为后来偶然发现此问题的其他人解决了我的问题:我只是将 rotvec 和姿势的 Mat 类型更改为 CV_64F(使其加倍),并使用 all 来显示。感谢 berak 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多