Я занимаюсь проектом, связанным с дополнением реальности, используя OpenCV и c ++.
В моем проекте, во-первых, я делаю изображение заранее определенного пользовательского шаблона (Некоторое изображение с определенным шаблоном, который я могу распознать позже). У меня есть трехмерная координата точек (центральные точки рисунка такие же, как точки на доске) на изображении с мировой координатой. Используя cv :: GetContoursFromBWImage , я могу получить координаты 2D-изображения соответствующих точек.
Используя эти 3D-2D точки, я использую cv :: calibrateCamera с флагом CV_CALIB_USE_INTRINSIC_GUESS , чтобы получить внутренний и внешний параметр камеры.
Теперь я хочу использовать этот параметр и найти двухмерные точки в изображении трехмерных координат, которые находятся между полем камеры и пользовательским рисунком. Используя cv :: projectPoints , я могу получить точность 2 мм при проецировании только тогда, когда моя 3D-точка находится вблизи или на плоскости шаблона. Но, когда я попробовал то же самое, задав 3D-точки между полями (между камерой и пространством рисунка, которое находится на расстоянии около 250 мм от плоскости рисунка и около 300 мм от источника камеры), результаты проецирования очень плохие (то есть 50 мм. ошибка).
Просто для понимания, я добавляю это изображение. Хотя это очень плохой рисунок, но я думаю, что этого достаточно для понимания.
Пожалуйста, предложите, что я делаю неправильно и что я должен делать.
Использование любой другой библиотеки для меня не проблема.
double error = cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs, CV_CALIB_USE_INTRINSIC_GUESS );
// objectPoints is 3D co-ordinate of points detected
// imagePoints is 2D co-ordinate of points in image
// By using above parameter, I am using below code for projection
projectPoints(objectPointsForPrediction, rvec, tvec, cameraMatrix, distCoeffs, imagePointsPredicted);