OpenCV Fisheye Calibration дает большую ошибку в идентичных точках
Я пытаюсь исправить "рыбий глаз" на изображении с помощью OpenCV.
Я не могу заставить шаг калибровки работать. Я попробовал приведенный ниже код для калибровки, и даже при одинаковых координатах x и y на входе и выходе возвращаемое среднеквадратичное значение составляет не менее 100.
std::vector<std::vector<cv::Point3d>> objpts;
std::vector<std::vector<cv::Point2d>> imgpts;
cv::Size img_size(1292,964); //dimension of input image in pixels
cv::Mat K, D;
std::vector<cv::Mat> rvecs, tvecs;
objpts.push_back(std::vector<cv::Point3d>());
imgpts.push_back(std::vector<cv::Point2d>());
//loading identical data into each
objpts[0].push_back(cv::Point3d(100, 100, 0));
objpts[0].push_back(cv::Point3d(0, 100, 0));
objpts[0].push_back(cv::Point3d(100, 0, 0));
objpts[0].push_back(cv::Point3d(0, 0, 0));
objpts[0].push_back(cv::Point3d(0, 50, 0));
imgpts[0].push_back(cv::Point2d(100, 100));
imgpts[0].push_back(cv::Point2d(0, 100));
imgpts[0].push_back(cv::Point2d(100, 0));
imgpts[0].push_back(cv::Point2d(0, 0));
imgpts[0].push_back(cv::Point2d(0, 50));
//ret changes depending on the points, but is always around 100-500
double ret = cv::fisheye::calibrate(objpts, imgpts, img_size, K, D, rvecs, tvecs);
//This produces the images seen below
cv::Mat im = cv::imread("env.jpg");
cv::Mat out;
cv::fisheye::undistortImage(im, out, K, D);
cv::imwrite("out_env.jpg", out);
Когда я пытаюсь использовать эти калиброванные матрицы K и D для искажения изображения, я получаю результаты, которые выглядят так:
Для справки вот исходное изображение:
У меня возникли похожие проблемы, когда я пытался использовать фактические координаты пикселей для изображений и физические размеры для объектов.
Использование opencv 3.4.5
Любая помощь приветствуется! Спасибо!