PointCloud от две неизкривени изображения

Искам да направя някаква структура от движение с помощта на OpenCV. Това трябва да се случи на Android. В момента разполагам с cameraMatrix (вътрешни параметри) и коефициентите на изкривяване от калибрирането на камерата.

Сега потребителят трябва да вземе 2 изображения от сградата и приложението трябва да генерира pointcloud. Забележка: потребителят може също така да завърти леко камерата на смартфона, докато се движи от едната страна на сградата...

Към настоящия момент имам следната информация:

  • неизкривеното ляво изображение
  • неизкривеното дясно изображение
  • списък с добри съвпадения с помощта на SIFT
  • хомографската матрица
  • фундаменталната матрица

Търсих в интернет и сега съм много объркан как да продължа... Някои казват, че трябва да използвам stereoRectify за получаване на Q и да използвам Q с reprojectImageTo3D() за получаване на pointCloud.

Други казват, че трябва да използвам stereoRectifyUncalibrated и да използвам H1 и H2 от този метод, за да запълня всички параметри на triangulatePoints. В triangulatePoints имам нужда от projectionMatrix на всяка камера/изображение, но според моите разбирания това изглежда определено погрешно.

Така че за мен има някои проблеми:

  • Как да получа R и T (завъртане и транслация) от цялата информация, която вече имам
  • Ако използвам stereoRectify, първите 4 параметъра са cameraMatrix1, distortionCoeff1, cameraMatrix2, distortionCoeff2) - Ако нямам стереокамера като Kinect, равни ли са ameraMatrix1 и cameraMatrix2 за моята настройка (моно камера на смартфон)
  • Как мога да получа Q (предполагам, че ако имам R и T, мога да го получа от stereoRectify)
  • Има ли друг начин за получаване на projectioMatrices за всяка камера, за да мога да използвам метода на триангулация, предоставен от OpenCV

Знам, че това са много въпроси, но гугълът ме обърка, така че трябва да изясня нещата. Надявам се някой да ми помогне с проблемите ми.

Благодаря

PS, тъй като това са по-теоретични въпроси, не публикувах някакъв код. Ако искате/трябва да видите кода или стойностите на калибрирането на камерата ми, просто попитайте и аз ще ги добавя към публикацията си.


person glethien    schedule 26.03.2014    source източник


Отговори (2)


Написах нещо за използването на оптичния поток на Farneback за структура от движение преди. Можете да прочетете подробности тук.

Но ето кодовия фрагмент, той е донякъде работеща, но не страхотна реализация. Надявам се, че можете да го използвате като справка.

/* Try to find essential matrix from the points */
Mat fundamental = findFundamentalMat( left_points, right_points, FM_RANSAC, 0.2, 0.99 );
Mat essential   = cam_matrix.t() * fundamental * cam_matrix;

/* Find the projection matrix between those two images */
SVD svd( essential );
static const Mat W = (Mat_<double>(3, 3) <<
                     0, -1, 0,
                     1, 0, 0,
                     0, 0, 1);

static const Mat W_inv = W.inv();

Mat_<double> R1 = svd.u * W * svd.vt;
Mat_<double> T1 = svd.u.col( 2 );

Mat_<double> R2 = svd.u * W_inv * svd.vt;
Mat_<double> T2 = -svd.u.col( 2 );

static const Mat P1 = Mat::eye(3, 4, CV_64FC1 );
Mat P2 =( Mat_<double>(3, 4) <<
         R1(0, 0), R1(0, 1), R1(0, 2), T1(0),
         R1(1, 0), R1(1, 1), R1(1, 2), T1(1),
         R1(2, 0), R1(2, 1), R1(2, 2), T1(2));

/*  Triangulate the points to find the 3D homogenous points in the world space
    Note that each column of the 'out' matrix corresponds to the 3d homogenous point
 */
Mat out;
triangulatePoints( P1, P2, left_points, right_points, out );

/* Since it's homogenous (x, y, z, w) coord, divide by w to get (x, y, z, 1) */
vector<Mat> splitted = {
    out.row(0) / out.row(3),
    out.row(1) / out.row(3),
    out.row(2) / out.row(3)
};

merge( splitted, out );

return out;
person sub_o    schedule 28.03.2014
comment
Да, мисля, че забравих. Тук е: subokita. com/2014/03/26/ - person sub_o; 30.03.2014

Това не е OpenCV, но ето пример за точно това, което искате:

http://boofcv.org/index.php?title=Example_Stereo_Single_Camera

Тук има демонстрационно приложение за Android, което включва този код:

https://play.google.com/store/apps/details?id=org.boofcv.android

person lessthanoptimal    schedule 26.03.2014
comment
Това не отговаря на въпросите ми. - person glethien; 27.03.2014
comment
(свива рамене) Прави това, което поискате, само че не е в избраната от вас библиотека. Въпреки това, ще трябва да погледнете източника на библиотеката, за да получите математиката. - person lessthanoptimal; 27.03.2014
comment
Книгата Multiple View Geometry in Computer Vision покрива този материал доста добре. В момента го нямам до себе си, но погледнете нагоре, разлагайки основната матрица. Ще ви е необходима вградената матрица на камерата, за да получите основното от основната матрица. - person lessthanoptimal; 27.03.2014