diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2015-07-20 08:08:58 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2015-07-20 08:08:58 +0200 |
commit | 8bf58b412d2b9c5cd3f1e1215c5ae9462d494888 (patch) | |
tree | 6f45efa943db858dd9d93aacc0012f523b2deaf2 | |
parent | faae0ab01dd6d9a7ffed39f36c053e236abbcc61 (diff) |
calibration: rewrite
- Intrinsics are floats, not doubles.
- Try searching for calibration filename with fov specified first, then
without fov.
- Grab image width and height from calibration file, don't asume 640x480
-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; } |