Я пытаюсь найти вектор поворота и перемещения для расчета положения камеры, используя функцию solvePnP в opencv . solvePnP функция требует 3D точек объекта , 2D точек изображения , матрица камеры для отправки со значением параметра.
Я вычислил ключевые точки входного изображения для изображения с камеры и ключевые элементы изображения поезда и матрицу камеры. Но мне нужно преобразовать входные точки 2D-изображения моей камеры в точки 3D-объекта. Как это сделать ? Я запутался в предметах. Я также рассчитал гомографию из изображения кадра камеры и изображения поезда совпадение ключевых точек функции . Есть ли способ найти точки 3D-объекта из гомография ?
Моя цель:
- Преобразование входных точек 2D-изображения моей камеры в точки 3D-объекта.
- Поиск положения камеры - вектор поворота и перемещения.
- Преобразование позы камеры в 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;
}
Как я могу решить эту проблему?