OpenCV некалиброванная камера выпрямления для 3D реконструкции

Я использую OpenCV 2.4.2.

Мой проект состоит в 3D-идентификации лица.

Я пытаюсь создать 3D-модель из пары изображений, снятых некалиброванная камера.
Моя цель — получить некоторые 3D-функции для идентификации.

Я пытаюсь откалибровать и исправить камеру, но я не получил хорошие результаты.
Я сделал эти шаги:

  • Извлеченные функции SURF из 2 изображений
  • Найдены соответствия между двумя изображениями
  • Вычислил фундаментальную матрицу благодаря findFundamentalMat
  • Используемый stereoRectifyUncalibrated чтобы получить матрицы гомографии
  • Используемый warpPerspective с первым изображением и первой матрицей гомографии, чтобы увидеть результат.

Я получил очень плохой результат, и я не знаю, что делать сейчас …

Это правильный алгоритм? Любое предложение?

Какие 3D-функции я мог бы использовать для лучшей идентификации лица?

Вот код калибровки:

/// Conversione di 1 vettore di keypoints in 2 vettori di Point2f
vector<int> pointIndexesLeft;
vector<int> pointIndexesFront;

for (vector<DMatch>::iterator it= matches_FL.begin(); it!= matches_FL.end(); ++it) {
// Estrazione degli indici
pointIndexesLeft.push_back(it->queryIdx);
pointIndexesFront.push_back(it->trainIdx);
}

// Convrsione dei keypoints in Point2f
vector<cv::Point2f> selPointsLeft, selPointsFront;
KeyPoint::convert(keypoints_left,selPointsLeft,pointIndexesLeft);
KeyPoint::convert(keypoints_front,selPointsFront,pointIndexesFront);

// Calcolo della matrice fondamentale
Mat F = findFundamentalMat(
Mat(selPointsFront), // points in first image
Mat(selPointsLeft), // points in second image
CV_FM_RANSAC);       // 8-point method/// Rettifico la camera
Mat H1,H2;
stereoRectifyUncalibrated(selPointsFront, selPointsLeft, F, img_front.size(), H1, H2,3);

Mat out_right= Mat::zeros(img_front.rows, img_front.cols, img_front.depth());
Mat out_left= Mat::zeros(img_left.rows, img_left.cols, img_front.depth());

warpPerspective(img_front,out_right, H1, img_front.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);
warpPerspective(img_left,out_left, H2, img_left.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);

imshow("out_right", out_right);
imshow("out_left", out_left);

1

Решение

Прежде всего, первое обнаружение / идентификация не имеет ничего общего с трехмерной реконструкцией. Предположим, что вы действительно хотите выполнить 3D-реконструкцию объекта с одной некалиброванной камеры, у вас обычно есть два варианта:

1) сначала вы калибруете камеру, используя калибровочный шаблон (обычно шахматный рисунок); см. пример camera_calibration.cpp.

2) вы можете одновременно выполнять калибровку и выполнять 3D-реконструкцию, и самый простой процесс выглядит следующим образом: сначала извлекайте основные точки (функции), используя ЛЮБОЙ алгоритм обнаружения объектов (у каждого есть свои преимущества и недостатки, но с любым из них вы должны получить рабочие результаты), извлекать дескрипторы для найденных объектов, сопоставлять дескрипторы двух хорошо подготовленных фотографий, находить основную матрицу F, извлекать матрицы двух проекций (матрица 3×4) из F, триангулировать сопоставленные элементы и затем рекурсивно выполнять резекцию : используйте уже рассчитанные 3D-точки и сопоставленные объекты на новой фотографии для вычисления матрицы камеры (как внутренней, так и внешней матрицы), триангулируйте новые функции, внесенные новой фотографией, и выполняйте полную настройку всего реконструированного пространства (камеры и 3D очки).

Удачи!

2

Другие решения

3D-реконструкция без каких-либо внутренних данных — это боль, поверь мне. Я делаю то же самое с модифицированным планшетным сканером.

Вы также можете проверить следующий пост: 3d реконструкция из 2 изображений без информации о камере

0

Хотя я не уверен, что вы пытаетесь сделать с помощью этого метода для изображений лица, я вижу следующую проблему с вашим подходом.

Все хорошо, пока вы не найдете матрицы гомографии H1, H2, но после этого:

warpPerspective(img_front,out_right, H1, img_front.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);
warpPerspective(img_left,out_left, H2, img_left.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector