Обратите внимание, что перевод оценивается с точностью до положительного скалярного фактора
аюсь найти вращение и перевод из функции гомографии. Сначала я вычисляю соответствующие характерные точки и используюfindHomography()
Я вычислил матрицу гомографии. Затем, используяdecomposeHomographyMat()
Я получил четыре результата ротации и перевода.
Код, который я использовал ниже:
Mat frame_1, frame_2;
frame_1 = imread("img1.jpg", IMREAD_GRAYSCALE);
frame_2 = imread("img2.jpg", IMREAD_GRAYSCALE);
vector<KeyPoint> keypts_1, keypts_2;
Mat desc1, desc2;
Ptr<Feature2D> ORB = ORB::create(100 );
ORB->detectAndCompute(frame_1, noArray(), keypts_1, desc1);
ORB->detectAndCompute(frame_2, noArray(), keypts_2, desc2);
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
vector<DMatch> matches;
matcher->match(desc1, desc2, matches);
vector<Point2f>leftPts, rightPts;
for (size_t i = 0; i < matches.size(); i++)
{
//queryIdx is the left Image
leftPts.push_back(keypts_1[matches[i].queryIdx].pt);
//trainIdx is the right Image
rightPts.push_back(keypts_2[matches[i].trainIdx].pt);
}
Mat cameraMatrix = (Mat1d(3, 3) << 706.4034, 0, 277.2018, 0, 707.9991, 250.6182, 0, 0, 1);
Mat H = findHomography(leftPts, rightPts);
vector<Mat> R, t, n;
decomposeHomographyMat(H, cameraMatrix, R, t, n);
Теперь о том, как правильно вращать и переводить, как минимум, наиболее подходящий. Я даже проверил, является ли вращение допустимым, используя приведенную ниже функцию, и обнаружил, что все действительны.
bool isRotationMatrix(Mat &R)
{
Mat Rt;
transpose(R, Rt);
Mat shouldBeIdentity = Rt * R;
Mat I = Mat::eye(3, 3, shouldBeIdentity.type());
return norm(I, shouldBeIdentity) < 1e-6;
}
Пожалуйста, кто-нибудь подскажет мне, какую ценность я должен использовать. И является ли результирующий перевод масштабированным значением, которое можно использовать напрямую, в отличие от случая декомпозиции Essential Matrix? Я очень признателен, если кто-нибудь поможет мне найти это.
Спасибо Вам!