Commit a56bd1fb authored by Vladislav Sovrasov's avatar Vladislav Sovrasov

Make aruco dependency optional for interactive calibration app

parent 8abd1634
set(OPENCV_INTERACTIVECALIBRATION_DEPS opencv_core opencv_imgproc opencv_features2d opencv_aruco opencv_highgui opencv_calib3d opencv_videoio) set(OPENCV_INTERACTIVECALIBRATION_DEPS opencv_core opencv_imgproc opencv_features2d opencv_highgui opencv_calib3d opencv_videoio)
if(${BUILD_opencv_aruco})
list(APPEND OPENCV_INTERACTIVECALIBRATION_DEPS opencv_aruco)
endif()
ocv_check_dependencies(${OPENCV_INTERACTIVECALIBRATION_DEPS}) ocv_check_dependencies(${OPENCV_INTERACTIVECALIBRATION_DEPS})
if(NOT OCV_DEPENDENCIES_FOUND) if(NOT OCV_DEPENDENCIES_FOUND)
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <opencv2/calib3d.hpp> #include <opencv2/calib3d.hpp>
#include <opencv2/imgproc.hpp> #include <opencv2/imgproc.hpp>
#include <opencv2/aruco/charuco.hpp>
#include <opencv2/highgui.hpp> #include <opencv2/highgui.hpp>
#include <vector> #include <vector>
...@@ -75,6 +74,7 @@ bool CalibProcessor::detectAndParseChessboard(const cv::Mat &frame) ...@@ -75,6 +74,7 @@ bool CalibProcessor::detectAndParseChessboard(const cv::Mat &frame)
bool CalibProcessor::detectAndParseChAruco(const cv::Mat &frame) bool CalibProcessor::detectAndParseChAruco(const cv::Mat &frame)
{ {
#ifdef HAVE_OPENCV_ARUCO
cv::Ptr<cv::aruco::Board> board = mCharucoBoard.staticCast<cv::aruco::Board>(); cv::Ptr<cv::aruco::Board> board = mCharucoBoard.staticCast<cv::aruco::Board>();
std::vector<std::vector<cv::Point2f> > corners, rejected; std::vector<std::vector<cv::Point2f> > corners, rejected;
...@@ -95,14 +95,16 @@ bool CalibProcessor::detectAndParseChAruco(const cv::Mat &frame) ...@@ -95,14 +95,16 @@ bool CalibProcessor::detectAndParseChAruco(const cv::Mat &frame)
} }
centerX /= currentCharucoCorners.size[0]; centerX /= currentCharucoCorners.size[0];
centerY /= currentCharucoCorners.size[0]; centerY /= currentCharucoCorners.size[0];
//cv::circle(frame, cv::Point2f(centerX, centerY), 10, cv::Scalar(0, 255, 0), 10);
mTemplateLocations.insert(mTemplateLocations.begin(), cv::Point2f(centerX, centerY)); mTemplateLocations.insert(mTemplateLocations.begin(), cv::Point2f(centerX, centerY));
cv::aruco::drawDetectedCornersCharuco(frame, currentCharucoCorners, currentCharucoIds); cv::aruco::drawDetectedCornersCharuco(frame, currentCharucoCorners, currentCharucoIds);
mCurrentCharucoCorners = currentCharucoCorners; mCurrentCharucoCorners = currentCharucoCorners;
mCurrentCharucoIds = currentCharucoIds; mCurrentCharucoIds = currentCharucoIds;
return true; return true;
} }
#else
(void)frame;
#endif
return false; return false;
} }
...@@ -231,6 +233,7 @@ bool CalibProcessor::checkLastFrame() ...@@ -231,6 +233,7 @@ bool CalibProcessor::checkLastFrame()
} }
} }
else { else {
#ifdef HAVE_OPENCV_ARUCO
cv::Mat r, t, angles; cv::Mat r, t, angles;
std::vector<cv::Point3f> allObjPoints; std::vector<cv::Point3f> allObjPoints;
allObjPoints.reserve(mCurrentCharucoIds.total()); allObjPoints.reserve(mCurrentCharucoIds.total());
...@@ -248,6 +251,7 @@ bool CalibProcessor::checkLastFrame() ...@@ -248,6 +251,7 @@ bool CalibProcessor::checkLastFrame()
mCalibData->allCharucoCorners.pop_back(); mCalibData->allCharucoCorners.pop_back();
mCalibData->allCharucoIds.pop_back(); mCalibData->allCharucoIds.pop_back();
} }
#endif
} }
return isFrameBad; return isFrameBad;
} }
...@@ -266,10 +270,12 @@ CalibProcessor::CalibProcessor(cv::Ptr<calibrationData> data, captureParameters ...@@ -266,10 +270,12 @@ CalibProcessor::CalibProcessor(cv::Ptr<calibrationData> data, captureParameters
switch(mBoardType) switch(mBoardType)
{ {
case chAruco: case chAruco:
#ifdef HAVE_OPENCV_ARUCO
mArucoDictionary = cv::aruco::getPredefinedDictionary( mArucoDictionary = cv::aruco::getPredefinedDictionary(
cv::aruco::PREDEFINED_DICTIONARY_NAME(capParams.charucoDictName)); cv::aruco::PREDEFINED_DICTIONARY_NAME(capParams.charucoDictName));
mCharucoBoard = cv::aruco::CharucoBoard::create(mBoardSize.width, mBoardSize.height, capParams.charucoSquareLenght, mCharucoBoard = cv::aruco::CharucoBoard::create(mBoardSize.width, mBoardSize.height, capParams.charucoSquareLenght,
capParams.charucoMarkerSize, mArucoDictionary); capParams.charucoMarkerSize, mArucoDictionary);
#endif
break; break;
case AcirclesGrid: case AcirclesGrid:
mBlobDetectorPtr = cv::SimpleBlobDetector::create(); mBlobDetectorPtr = cv::SimpleBlobDetector::create();
......
...@@ -6,8 +6,10 @@ ...@@ -6,8 +6,10 @@
#define FRAME_PROCESSOR_HPP #define FRAME_PROCESSOR_HPP
#include <opencv2/core.hpp> #include <opencv2/core.hpp>
#include <opencv2/aruco/charuco.hpp>
#include <opencv2/calib3d.hpp> #include <opencv2/calib3d.hpp>
#ifdef HAVE_OPENCV_ARUCO
#include <opencv2/aruco/charuco.hpp>
#endif
#include "calibCommon.hpp" #include "calibCommon.hpp"
#include "calibController.hpp" #include "calibController.hpp"
...@@ -37,8 +39,10 @@ protected: ...@@ -37,8 +39,10 @@ protected:
cv::Mat mCurrentCharucoIds; cv::Mat mCurrentCharucoIds;
cv::Ptr<cv::SimpleBlobDetector> mBlobDetectorPtr; cv::Ptr<cv::SimpleBlobDetector> mBlobDetectorPtr;
#ifdef HAVE_OPENCV_ARUCO
cv::Ptr<cv::aruco::Dictionary> mArucoDictionary; cv::Ptr<cv::aruco::Dictionary> mArucoDictionary;
cv::Ptr<cv::aruco::CharucoBoard> mCharucoBoard; cv::Ptr<cv::aruco::CharucoBoard> mCharucoBoard;
#endif
int mNeededFramesNum; int mNeededFramesNum;
unsigned mDelayBetweenCaptures; unsigned mDelayBetweenCaptures;
......
...@@ -4,10 +4,13 @@ ...@@ -4,10 +4,13 @@
#include <opencv2/core.hpp> #include <opencv2/core.hpp>
#include <opencv2/calib3d.hpp> #include <opencv2/calib3d.hpp>
#include <opencv2/aruco/charuco.hpp>
#include <opencv2/cvconfig.h> #include <opencv2/cvconfig.h>
#include <opencv2/highgui.hpp> #include <opencv2/highgui.hpp>
#ifdef HAVE_OPENCV_ARUCO
#include <opencv2/aruco/charuco.hpp>
#endif
#include <string> #include <string>
#include <vector> #include <vector>
#include <stdexcept> #include <stdexcept>
...@@ -50,31 +53,27 @@ bool calib::showOverlayMessage(const std::string& message) ...@@ -50,31 +53,27 @@ bool calib::showOverlayMessage(const std::string& message)
#endif #endif
} }
static void deleteButton(int state, void* data) static void deleteButton(int, void* data)
{ {
state++; //to avoid gcc warnings
(static_cast<cv::Ptr<calibDataController>*>(data))->get()->deleteLastFrame(); (static_cast<cv::Ptr<calibDataController>*>(data))->get()->deleteLastFrame();
calib::showOverlayMessage("Last frame deleted"); calib::showOverlayMessage("Last frame deleted");
} }
static void deleteAllButton(int state, void* data) static void deleteAllButton(int, void* data)
{ {
state++;
(static_cast<cv::Ptr<calibDataController>*>(data))->get()->deleteAllData(); (static_cast<cv::Ptr<calibDataController>*>(data))->get()->deleteAllData();
calib::showOverlayMessage("All frames deleted"); calib::showOverlayMessage("All frames deleted");
} }
static void saveCurrentParamsButton(int state, void* data) static void saveCurrentParamsButton(int, void* data)
{ {
state++;
if((static_cast<cv::Ptr<calibDataController>*>(data))->get()->saveCurrentCameraParameters()) if((static_cast<cv::Ptr<calibDataController>*>(data))->get()->saveCurrentCameraParameters())
calib::showOverlayMessage("Calibration parameters saved"); calib::showOverlayMessage("Calibration parameters saved");
} }
#ifdef HAVE_QT #ifdef HAVE_QT
static void switchVisualizationModeButton(int state, void* data) static void switchVisualizationModeButton(int, void* data)
{ {
state++;
ShowProcessor* processor = static_cast<ShowProcessor*>(((cv::Ptr<FrameProcessor>*)data)->get()); ShowProcessor* processor = static_cast<ShowProcessor*>(((cv::Ptr<FrameProcessor>*)data)->get());
processor->switchVisualizationMode(); processor->switchVisualizationMode();
} }
...@@ -103,6 +102,11 @@ int main(int argc, char** argv) ...@@ -103,6 +102,11 @@ int main(int argc, char** argv)
captureParameters capParams = paramsController.getCaptureParameters(); captureParameters capParams = paramsController.getCaptureParameters();
internalParameters intParams = paramsController.getInternalParameters(); internalParameters intParams = paramsController.getInternalParameters();
#ifndef HAVE_OPENCV_ARUCO
if(capParams.board == chAruco)
CV_Error(cv::Error::StsNotImplemented, "Aruco module is disabled in current build configuration."
" Consider usage of another calibration pattern\n");
#endif
cv::TermCriteria solverTermCrit = cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, cv::TermCriteria solverTermCrit = cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS,
intParams.solverMaxIters, intParams.solverEps); intParams.solverMaxIters, intParams.solverEps);
...@@ -172,6 +176,7 @@ int main(int argc, char** argv) ...@@ -172,6 +176,7 @@ int main(int argc, char** argv)
calibrationFlags, solverTermCrit); calibrationFlags, solverTermCrit);
} }
else { else {
#ifdef HAVE_OPENCV_ARUCO
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::Ptr<cv::aruco::Dictionary> dictionary =
cv::aruco::getPredefinedDictionary(cv::aruco::PREDEFINED_DICTIONARY_NAME(capParams.charucoDictName)); cv::aruco::getPredefinedDictionary(cv::aruco::PREDEFINED_DICTIONARY_NAME(capParams.charucoDictName));
cv::Ptr<cv::aruco::CharucoBoard> charucoboard = cv::Ptr<cv::aruco::CharucoBoard> charucoboard =
...@@ -183,6 +188,7 @@ int main(int argc, char** argv) ...@@ -183,6 +188,7 @@ int main(int argc, char** argv)
globalData->cameraMatrix, globalData->distCoeffs, globalData->cameraMatrix, globalData->distCoeffs,
cv::noArray(), cv::noArray(), globalData->stdDeviations, cv::noArray(), cv::noArray(), cv::noArray(), globalData->stdDeviations, cv::noArray(),
globalData->perViewErrors, calibrationFlags, solverTermCrit); globalData->perViewErrors, calibrationFlags, solverTermCrit);
#endif
} }
dataController->updateUndistortMap(); dataController->updateUndistortMap();
dataController->printParametersToConsole(std::cout); dataController->printParametersToConsole(std::cout);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment