Параллельная настройка пучка (PBA)

Я пытаюсь выполнить Bundle Adjustment (BA) для последовательности стереоизображений (класс Step) взято с той же камеры.

каждый Step оставил & правые изображения (выпрямленные и синхронизированные), сгенерированная карта глубины, ключевые точки + дескрипторы левого изображения & 2 матрицы 4×4 — 1 для локального (плоскость изображения) глобального (трехмерный мир) и его обратного (T_L2G и T_G2L соответственно).

Шаги регистрируются относительно первого изображения.

Я пытаюсь запустить BA на результат, чтобы уточнить преобразование, и я пытаюсь использовать PBA (https://grail.cs.washington.edu/projects/mcba/)

Код для настройки камер:

for (int i = 0; i < steps.size(); i++)
{
Step& step = steps[i];

cv::Mat& T_G2L = step.T_G2L;

cv::Mat R;
cv::Mat t;

T_G2L(cv::Rect(0, 0, 3, 3)).copyTo(R);
T_G2L(cv::Rect(3, 0, 1, 3)).copyTo(t);
CameraT camera;

// Camera Parameters
camera.SetFocalLength((double)m_focalLength); // Same camera, global focal length
camera.SetTranslation((float*)t.data);
camera.SetMatrixRotation((float*)R.data);

if (i == 0)
{
camera.SetConstantCamera();
}

camera_data.push_back(camera);
}

Затем я генерирую глобальную ключевую точку, выполняя все пары изображений и сопоставляя
(в настоящее время используется SURF).

Затем, Генерация данных точек BA:

for (size_t i = 0; i < globalKps.size(); i++)
{
cv::Point3d& globalPoint = globalKps[i].AbsolutePoint;
cv::Point3f globalPointF((float)globalPoint.x, (float)globalPoint.y, (float)globalPoint.z);
int num_obs = 0;

std::vector < std::pair<int/*stepID*/, int/*KP_ID*/>>& localKps = globalKps[i].LocalKeypoints;
if (localKps.size() >= 2)
{
Point3D pointData;
pointData.SetPoint((float*)&globalPointF);
// For this point, set all the measurements
for (size_t j = 0; j < localKps.size(); j++)
{
int& stepID = localKps[j].first;
int& kpID = localKps[j].second;

int cameraID = stepsLUT[stepID];

Step& step = steps[cameraID];

cv::Point3d p3d = step.KeypointToLocal(kpID);

Point2D measurement = Point2D(p3d.x, p3d.y);
measurements.push_back(measurement);
camidx.push_back(cameraID);
ptidx.push_back((int)point_data.size());

}
point_data.push_back(pointData);
}
}

Затем, запустив БА:

ParallelBA pba(ParallelBA::PBA_CPU_FLOAT);
pba.SetFixedIntrinsics(true); // Same camera with known intrinsics

pba.SetCameraData(camera_data.size(), &camera_data[0]);                        //set camera parameters
pba.SetPointData(point_data.size(), &point_data[0]);                            //set 3D point data
pba.SetProjection(measurements.size(), &measurements[0], &ptidx[0], &camidx[0]);//set the projections

pba.SetNextBundleMode(ParallelBA::BUNDLE_ONLY_MOTION);

pba.RunBundleAdjustment();    //run bundle adjustment, and camera_data/point_data will be

Затем, где я сталкиваюсь с проблемами, извлекая данные обратно из PBA:

for (int i = 1/*First camera is stationary*/; i < camera_data.size(); i++)
{
Step& step = steps[i];

CameraT& camera = camera_data[i];
int type = CV_32F;
cv::Mat t(3, 1, type);
cv::Mat R(3, 3, type);
cv::Mat T_L2G = cv::Mat::eye(4, 4, type);
cv::Mat T_G2L = cv::Mat::eye(4, 4, type);

camera.GetTranslation((float*)t.data);
camera.GetMatrixRotation((float*)R.data);

t.copyTo(T_G2L(TranslationRect));
R.copyTo(T_G2L(RotationRect));cv::invert(T_G2L, T_L2G);

step.SetTransformation(T_L2G); // Step expects local 2 global transformation
}

Все идет так, как я ожидаю. PBA сообщает об относительно небольшой начальной ошибке (в настоящее время тестируется с небольшим количеством попарно зарегистрированных изображений, поэтому ошибка не должна быть слишком большой), а после запуска сообщает о меньшей. (Быстро сходится, обычно меньше 3 итераций)

Однако, когда я сбрасываю ключевые точки, используя только что найденные преобразования, облака, кажется, отодвигаются друг от друга.

(Я также пробовал переключаться между T_G2L & T_L2G, чтобы «приблизить их». Не работает)

Мне интересно, если я что-то упускаю, используя это.

4

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]