Я использую OpenCV 2.4.2.
Мой проект состоит в 3D-идентификации лица.
Я пытаюсь создать 3D-модель из пары изображений, снятых некалиброванная камера.
Моя цель — получить некоторые 3D-функции для идентификации.
Я пытаюсь откалибровать и исправить камеру, но я не получил хорошие результаты.
Я сделал эти шаги:
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);
Прежде всего, первое обнаружение / идентификация не имеет ничего общего с трехмерной реконструкцией. Предположим, что вы действительно хотите выполнить 3D-реконструкцию объекта с одной некалиброванной камеры, у вас обычно есть два варианта:
1) сначала вы калибруете камеру, используя калибровочный шаблон (обычно шахматный рисунок); см. пример camera_calibration.cpp.
2) вы можете одновременно выполнять калибровку и выполнять 3D-реконструкцию, и самый простой процесс выглядит следующим образом: сначала извлекайте основные точки (функции), используя ЛЮБОЙ алгоритм обнаружения объектов (у каждого есть свои преимущества и недостатки, но с любым из них вы должны получить рабочие результаты), извлекать дескрипторы для найденных объектов, сопоставлять дескрипторы двух хорошо подготовленных фотографий, находить основную матрицу F, извлекать матрицы двух проекций (матрица 3×4) из F, триангулировать сопоставленные элементы и затем рекурсивно выполнять резекцию : используйте уже рассчитанные 3D-точки и сопоставленные объекты на новой фотографии для вычисления матрицы камеры (как внутренней, так и внешней матрицы), триангулируйте новые функции, внесенные новой фотографией, и выполняйте полную настройку всего реконструированного пространства (камеры и 3D очки).
Удачи!
3D-реконструкция без каких-либо внутренних данных — это боль, поверь мне. Я делаю то же самое с модифицированным планшетным сканером.
Вы также можете проверить следующий пост: 3d реконструкция из 2 изображений без информации о камере
Хотя я не уверен, что вы пытаетесь сделать с помощью этого метода для изображений лица, я вижу следующую проблему с вашим подходом.
Все хорошо, пока вы не найдете матрицы гомографии 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);