Я пытаюсь извлечь матрицу вращения 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 рядом с номером матрицы позы, и вы можете видеть, что в этих координатах числа не совпадают). Я не уверен, почему это происходит, может кто-нибудь, пожалуйста, помогите мне?
Mat rotvec = Mat::eye(3, 3, CV_32FC1)
‹-- это float Mat, вы не должны обращаться к нему с помощью:rotvec.at<double>(s, g)
- person berak   schedule 29.06.2015rotvec.at<float>(s, g)
? - person ksivakumar   schedule 29.06.2015std::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