Обратите внимание, что перевод оценивается с точностью до положительного скалярного фактора

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

Спасибо Вам!

 nayab13 нояб. 2017 г., 17:42
Возьмите одну или несколько подходящих пар объектов и примените 4 преобразования, чтобы проверить, какое преобразование является более подходящим.
 Althaf14 нояб. 2017 г., 04:48
Спасибо @nayab, но будет полезно, если вы можете предложить мне небольшой код, чтобы проверить это. Я чувствую, что все результаты проецируются в одну точку.

Ответы на вопрос(2)

которое можно использовать напрямую, в отличие от случая декомпозиции Essential Matrix?

Увы нет.

Ссылка для реализаций OpenCV, Malis & Vargas, говорит об этом на стр.8:

Обратите внимание, что перевод оценивается с точностью до положительного скалярного фактора

Решение Вопроса

filterHomographyDecompByVisibleRefpoints' от Vaesper. Вы можете проверить кодВот.

Вам просто нужно ввести матрицу вращения, нормали, полученные из декомпозиции HomographyMat, и точечные соответствия, используемые для получения матрицы гомогерапии. Вышеуказанная функция вернет 2 возможных решения. Вы можете увидеть больше об этой идее в ответе EbyaВот.

После получения 2-х возможных решений вам нужно будет как-то сделать некоторые проверки в зависимости от вашего случая, чтобы найти правильное решение. Поскольку я использовал матрицу тождественности для матрицы камеры, полученные значения перевода представлены в пикселях и их необходимо масштабировать с использованием какого-либо внешнего датчика. В моем случае расстояние между камерой и плоским объектом фиксировано по оси z, поэтому я только что рассчитал, что 1 пиксель представляет в мировых единицах.

 Ankit20 дек. 2017 г., 10:18
@FelixGoldberg, о да, я не упомянул свой случай полностью. Я фактически дал матрицу камеры как идентичность, поэтому в пикселях. Я отредактирую свой ответ.
 Felix Goldberg20 дек. 2017 г., 01:23
«Полученные значения перевода приведены в пикселях» - я не думаю, что вы правы в этом вопросе. R и T - внешняя поза камеры, они даны в мировых координатах (что-то вроде мм или м).

Ваш ответ на вопрос