【问题标题】:Opencv .at method not working as intended?Opencv .at 方法没有按预期工作?
【发布时间】:2016-11-08 06:58:05
【问题描述】:

尝试执行一些简单的转换以使我的相机姿势处于更易于管理的坐标中,但我一直遇到一个问题:

    vector< Mat> newpoints; 

    Mat oldpoint =  Mat::zeros(4,1, CV_32F);

    oldpoint.at<float>(3,0) = 1.0;

    Mat translation = Mat::zeros(4, 4, CV_32F);
    Mat rotation = Mat::zeros(4, 4, CV_32F);
    Mat tmp_rot = Mat::zeros(3,3,CV_32F);
    Mat trans;
    Mat rota;

cout << "rearranging coords" << endl;

for(int i = 0; i < tvecs.size(); i++){
    trans = tvecs[i];
    rota = rvecs[i];

    translation.at<float>(0,0) = 1.0;
    translation.at<float>(1,1) = 1.0;
    translation.at<float>(2,2) = 1.0;
    translation.at<float>(3,3) = 1.0;

    translation.at<float>(0,3) = trans.at<float>(0);
    translation.at<float>(1,3) = trans.at<float>(1);
    translation.at<float>(2,3) = trans.at<float>(2);

    Rodrigues(rota, tmp_rot);

    rotation.at<float>(0,0) = tmp_rot.at<float>(0,0);
    rotation.at<float>(0,1) = tmp_rot.at<float>(0,1);
    rotation.at<float>(0,2) = tmp_rot.at<float>(0,2);
    rotation.at<float>(1,0) = tmp_rot.at<float>(1,0);
    rotation.at<float>(1,1) = tmp_rot.at<float>(1,1);
    rotation.at<float>(1,2) = tmp_rot.at<float>(1,2);
    rotation.at<float>(2,0) = tmp_rot.at<float>(2,0);
    rotation.at<float>(2,1) = tmp_rot.at<float>(2,1);
    rotation.at<float>(2,2) = tmp_rot.at<float>(2,2);
    rotation.at<float>(3,3) = 1.0;
}

当我在右侧使用 .at 时,for 中的值分配毫无意义。它们与原始矩阵中的值完全不同。

【问题讨论】:

  • 请检查 tmp_rot.depth() 或 tmp_rot.type()。我想它是 double 而不是 float 所以尝试 tmp_rot.at 到处
  • 就是这样。更改了“trans = tvecs[i]; rota = rvecs[i];”到 tvecs[i].convertTo(trans, CV_32F); rvecs[i].convertTo(rota, CV_32F);谢谢

标签: opencv mat


【解决方案1】:

就像 Micha 指出的那样,存在类型不匹配。

修正者:

    tvecs[i].convertTo(trans, CV_32F);
    rvecs[i].convertTo(rota, CV_32F);
    //trans = tvecs[i];
    //rota = rvecs[i];

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多