Как автоматически рассчитать точки 3D-объекта и точки изображения из 2D-изображения Ключевые точки с помощью гомографии? - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь найти вектор поворота и перемещения для расчета положения камеры, используя функцию solvePnP в opencv . solvePnP функция требует 3D точек объекта , 2D точек изображения , матрица камеры для отправки со значением параметра.

Я вычислил ключевые точки входного изображения для изображения с камеры и ключевые элементы изображения поезда и матрицу камеры. Но мне нужно преобразовать входные точки 2D-изображения моей камеры в точки 3D-объекта. Как это сделать ? Я запутался в предметах. Я также рассчитал гомографию из изображения кадра камеры и изображения поезда совпадение ключевых точек функции . Есть ли способ найти точки 3D-объекта из гомография ?

Моя цель:

  1. Преобразование входных точек 2D-изображения моей камеры в точки 3D-объекта.
  2. Поиск положения камеры - вектор поворота и перемещения.
  3. Преобразование позы камеры в Scene-kit. Вектор поворота и перемещения позы камеры.

Я пытаюсь с этим кодом -

typedef struct CameraPose {
    SCNVector4 rotationVector;
    SCNVector3 translationVector; 
} CameraPose;


+ (CameraPose)findCameraPose: (NSArray<NSValue *> *) objectPoints imagePoints: (NSArray<NSValue *> *) imagePoints size: (CGSize) size {

    vector<Point3f> cvObjectPoints = [self convertObjectPoints:objectPoints];
    vector<Point2f> cvImagePoints = [self convertImagePoints:imagePoints withSize: size];

    cv::Mat distCoeffs(4,1,cv::DataType<double>::type, 0.0);
    cv::Mat rvec(3,1,cv::DataType<double>::type);
    cv::Mat tvec(3,1,cv::DataType<double>::type);
    cv::Mat cameraMatrix = [self intrinsicMatrixWithImageSize: size];

    cv::solvePnP(cvObjectPoints, cvImagePoints, cameraMatrix, distCoeffs, rvec, tvec);

    SCNVector4 rotationVector = SCNVector4Make(rvec.at<double>(0), rvec.at<double>(1), rvec.at<double>(2), norm(rvec));
    SCNVector3 translationVector = SCNVector3Make(tvec.at<double>(0), tvec.at<double>(1), tvec.at<double>(2));
    CameraPose result = CameraPose{rotationVector, translationVector};

    return result;
}

+ (vector<Point2f>) convertImagePoints: (NSArray<NSValue *> *) array withSize: (CGSize) size {
    vector<Point2f> points;
    for (NSValue * value in array) {
        CGPoint point = [value CGPointValue];
        points.push_back(Point2f(point.x - size.width/2, point.y - size.height/2));
    }
    return points;
}

+ (vector<Point3f>) convertObjectPoints: (NSArray<NSValue *> *) array {
    vector<Point3f> points;
    for (NSValue * value in array) {
        CGPoint point = [value CGPointValue];
        points.push_back(Point3f(point.x, 0.0, -point.y));
    }
    return points;
}

+ (cv::Mat) intrinsicMatrixWithImageSize: (CGSize) imageSize {
    double f = 0.84 * max(imageSize.width, imageSize.height);
    Mat result(3,3,cv::DataType<double>::type);
    cv::setIdentity(result);
    result.at<double>(0) = f;
    result.at<double>(4) = f;
    return result;
}

Как я могу решить эту проблему?

...