2015-06-29 2 views
0

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

+0

'Mat rotvec = Mat :: eye (3, 3, CV_32FC1)' <- это * float * Mat, вы не должны иметь к нему доступ: 'rotvec.at (s, g)' – berak

+0

Should Я использую 'rotvec.at (s, g)'? – ksivakumar

+0

yes;) ........ – berak

ответ

0

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