From b581a62c89c52fab0444c2d6a3982d61c45a4939 Mon Sep 17 00:00:00 2001 From: matlabbe Date: Mon, 24 Sep 2018 15:09:12 -0400 Subject: [PATCH] Fixed build with opencv < 2.4.10 for missing fisheye model --- corelib/src/CameraModel.cpp | 6 +++++ corelib/src/Memory.cpp | 12 +++++++++ guilib/src/CalibrationDialog.cpp | 43 ++++++++++++++++++-------------- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/corelib/src/CameraModel.cpp b/corelib/src/CameraModel.cpp index fd19b2ee..08a92c7b 100644 --- a/corelib/src/CameraModel.cpp +++ b/corelib/src/CameraModel.cpp @@ -161,6 +161,7 @@ void CameraModel::initRectificationMap() UINFO("Initialize rectify map"); if(D_.cols == 6) { +#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) // Equidistant / FishEye // get only k parameters (k1,k2,p1,p2,k3,k4) cv::Mat D(1, 4, CV_64FC1); @@ -171,6 +172,11 @@ void CameraModel::initRectificationMap() cv::fisheye::initUndistortRectifyMap(K_, D, R_, P_, imageSize_, CV_32FC1, mapX_, mapY_); } else +#else + UWARN("Too old opencv version (%d,%d,%d) to support fisheye model (min 2.4.10 required)!", + CV_MAJOR_VERSION, CV_MINOR_VERSION, CV_SUBMINOR_VERSION); + } +#endif { // RadialTangential cv::initUndistortRectifyMap(K_, D_, R_, P_, imageSize_, CV_32FC1, mapX_, mapY_); diff --git a/corelib/src/Memory.cpp b/corelib/src/Memory.cpp index f36dc8f7..cc03c227 100644 --- a/corelib/src/Memory.cpp +++ b/corelib/src/Memory.cpp @@ -3883,6 +3883,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor cv::KeyPoint::convert(keypoints,pointsIn); if(decimatedData.cameraModels()[0].D_raw().cols == 6) { +#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) // Equidistant / FishEye // get only k parameters (k1,k2,p1,p2,k3,k4) cv::Mat D(1, 4, CV_64FC1); @@ -3897,6 +3898,11 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor decimatedData.cameraModels()[0].P()); } else +#else + UWARN("Too old opencv version (%d,%d,%d) to support fisheye model (min 2.4.10 required)!", + CV_MAJOR_VERSION, CV_MINOR_VERSION, CV_SUBMINOR_VERSION); + } +#endif { //RadialTangential cv::undistortPoints(pointsIn, pointsOut, @@ -3933,6 +3939,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor pointsIn.push_back(cv::Point2f(keypoints.at(i).pt.x-subImageWidth*cameraIndex, keypoints.at(i).pt.y)); if(decimatedData.cameraModels()[cameraIndex].D_raw().cols == 6) { +#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) // Equidistant / FishEye // get only k parameters (k1,k2,p1,p2,k3,k4) cv::Mat D(1, 4, CV_64FC1); @@ -3947,6 +3954,11 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor decimatedData.cameraModels()[cameraIndex].P()); } else +#else + UWARN("Too old opencv version (%d,%d,%d) to support fisheye model (min 2.4.10 required)!", + CV_MAJOR_VERSION, CV_MINOR_VERSION, CV_SUBMINOR_VERSION); + } +#endif { //RadialTangential cv::undistortPoints(pointsIn, pointsOut, diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp index 5206957b..eef6c8ac 100644 --- a/guilib/src/CalibrationDialog.cpp +++ b/guilib/src/CalibrationDialog.cpp @@ -101,6 +101,9 @@ CalibrationDialog::CalibrationDialog(bool stereo, const QString & savingDirector ui_->checkBox_switchImages->setChecked(switchImages); + ui_->checkBox_fisheye->setChecked(false); + ui_->checkBox_fisheye->setEnabled(false); + this->setStereoMode(stereo_); } @@ -707,7 +710,9 @@ void CalibrationDialog::calibrate() UINFO("calibrate!"); //Find intrinsic and extrinsic camera parameters double rms = 0.0; +#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) bool fishEye = ui_->checkBox_fisheye->isChecked(); + if(fishEye) { rms = cv::fisheye::calibrate(objectPoints, @@ -718,13 +723,17 @@ void CalibrationDialog::calibrate() rvecs, tvecs); } - rms = cv::calibrateCamera(objectPoints, - imagePoints_[id], - imageSize_[id], - K, - D, - rvecs, - tvecs); + else +#endif + { + rms = cv::calibrateCamera(objectPoints, + imagePoints_[id], + imageSize_[id], + K, + D, + rvecs, + tvecs); + } UINFO("Re-projection error reported by calibrateCamera: %f", rms); @@ -736,11 +745,13 @@ void CalibrationDialog::calibrate() for( i = 0; i < (int)objectPoints.size(); ++i ) { +#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) if(fishEye) { cv::fisheye::projectPoints( cv::Mat(objectPoints[i]), rvecs[i], tvecs[i], K, D, imagePoints2); } else +#endif { cv::projectPoints( cv::Mat(objectPoints[i]), rvecs[i], tvecs[i], K, D, imagePoints2); } @@ -760,6 +771,7 @@ void CalibrationDialog::calibrate() P.at(2,3) = 1; K.copyTo(P.colRange(0,3).rowRange(0,3)); +#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) if(fishEye) { // Convert to unified distortion model (k1,k2,p1,p2,k3,k4) @@ -768,7 +780,9 @@ void CalibrationDialog::calibrate() newD.at(0,1) = D.at(0,1); newD.at(0,4) = D.at(0,2); newD.at(0,5) = D.at(0,3); + D = newD; } +#endif std::cout << "K = " << K << std::endl; std::cout << "D = " << D << std::endl; @@ -905,6 +919,7 @@ StereoCameraModel CalibrationDialog::stereoCalibration(const CameraModel & left, objectPoints.resize(stereoImagePoints_[0].size(), objectPoints[0]); double rms = 0.0; +#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) bool fishEye = left.D_raw().cols == 6; // calibrate extrinsic if(fishEye) @@ -920,7 +935,7 @@ StereoCameraModel CalibrationDialog::stereoCalibration(const CameraModel & left, D_right.at(0,1) = right.D_raw().at(0,1); D_right.at(0,2) = right.D_raw().at(0,4); D_right.at(0,3) = right.D_raw().at(0,5); -#if CV_MAJOR_VERSION < 3 + rms = cv::fisheye::stereoCalibrate( objectPoints, stereoImagePoints_[0], @@ -930,19 +945,9 @@ StereoCameraModel CalibrationDialog::stereoCalibration(const CameraModel & left, imageSize, R, T, cv::CALIB_FIX_INTRINSIC, cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, 100, 1e-5)); -#else - rms = cv::fisheye::stereoCalibrate( - objectPoints, - stereoImagePoints_[0], - stereoImagePoints_[1], - left.K_raw(), D_left, - right.K_raw(), D_right, - imageSize, R, T, - cv::CALIB_FIX_INTRINSIC, - cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, 100, 1e-5)); -#endif } else +#endif { #if CV_MAJOR_VERSION < 3 rms = cv::stereoCalibrate(