Не могу понять логическую ошибку, связанную с установкой матрицы вращения

Я пытаюсь извлечь матрицу вращения 3x3 из имеющейся у меня матрицы позы 3x4. Однако два значения различаются, хотя у меня очень простой код, устанавливающий одно для другого. Я бьюсь головой о стену, потому что понятия не имею, почему это происходит. Вот код:

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 рядом с номером матрицы позы, и вы можете видеть, что в этих координатах числа не совпадают). Я не уверен, почему это происходит, может кто-нибудь, пожалуйста, помогите мне?


person ksivakumar    schedule 29.06.2015    source источник
comment
Mat rotvec = Mat::eye(3, 3, CV_32FC1) ‹-- это float Mat, вы не должны обращаться к нему с помощью: rotvec.at<double>(s, g)   -  person berak    schedule 29.06.2015
comment
Должен ли я использовать rotvec.at<float>(s, g)?   -  person ksivakumar    schedule 29.06.2015
comment
Я попробовал это, а также изменил ‹double› на ‹float›, когда распечатывал матрицу rotvec и все равно получал разные значения:/   -  person ksivakumar    schedule 29.06.2015
comment
Итак, изменил код, чтобы он лучше соответствовал моим целям: std::cout << "Creating rotation matrix" << std::endl; Mat rotvec = pose.clone(); rotvec = rotvec.colRange(0, rotvec.cols-1); for (int e = 0; e < rotvec.rows; e++) { for (int f = 0; f < rotvec.cols; f++) { std::cout << rotvec.at<double>(e,f); std::cout << " "; } std::cout << "\n" << std::endl; } Это немного помогло, но я все еще получаю одно число, которое находится в позиции 2x2. Более того, каждый раз, когда я запускаю код, число в этих двух матрицах меняется. Почему это?   -  person ksivakumar    schedule 29.06.2015


Ответы (1)


Решил мою проблему для всех, кто наткнется на это позже: я просто изменил тип мата на CV_64F (чтобы сделать его двойным) как для rotvec, так и для позы, и использовал все для отображения. Спасибо Бераку за то, что указали мне правильное направление.

person ksivakumar    schedule 01.07.2015