diff options
-rw-r--r-- | opentrack/opencv-calibration.hpp | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/opentrack/opencv-calibration.hpp b/opentrack/opencv-calibration.hpp index 71f30850..99e6d4c7 100644 --- a/opentrack/opencv-calibration.hpp +++ b/opentrack/opencv-calibration.hpp @@ -14,21 +14,31 @@ #include <opencv2/core.hpp> template<typename = void> -bool get_camera_calibration(const QString& camera_name, cv::Mat& intrinsics, cv::Mat& distortion, int w, int h) +bool get_camera_calibration(const QString& camera_name, cv::Mat& intrinsics, cv::Mat& distortion, int w, int h, int fov) { - QString pathname_ = QCoreApplication::applicationDirPath() + "/camera/" + camera_name + ".yml"; - std::string pathname = pathname_.toStdString(); - cv::FileStorage fs(pathname, cv::FileStorage::READ); - if (!fs.isOpened()) - return false; - cv::Mat intrinsics_, distortion_; - fs["camera_matrix"] >> intrinsics_; - fs["distortion_coefficients"] >> distortion_; - intrinsics_.at<double>(0, 0) *= w / 640.; - intrinsics_.at<double>(2, 0) *= w / 640.; - intrinsics_.at<double>(1, 1) *= h / 480.; - intrinsics_.at<double>(2, 1) *= h / 480.; - intrinsics = intrinsics_; - distortion = distortion_; - return true; + const QString pathnames[] = { + QCoreApplication::applicationDirPath() + "/camera/" + camera_name + "-" + QString::number(fov) + ".yml", + QCoreApplication::applicationDirPath() + "/camera/" + camera_name + ".yml", + }; + for (auto& pathname : pathnames) + { + cv::FileStorage fs(pathname.toStdString(), cv::FileStorage::READ); + if (!fs.isOpened()) + continue; + cv::Mat intrinsics_, distortion_; + fs["camera_matrix"] >> intrinsics_; + fs["distortion_coefficients"] >> distortion_; + int w_, h_; + fs["image_width"] >> w_; + fs["image_height"] >> h_; + double w__ = w_, h__ = h_; + intrinsics_.at<float>(0, 0) *= w / w__; + intrinsics_.at<float>(2, 0) *= w / w__; + intrinsics_.at<float>(1, 1) *= h / h__; + intrinsics_.at<float>(2, 1) *= h / h__; + intrinsics = intrinsics_; + distortion = distortion_; + return true; + } + return false; } |