From b91f173680af92498a8bd2517fc7c524c2eae640 Mon Sep 17 00:00:00 2001 From: rogday Date: Thu, 30 Jun 2022 23:31:52 +0300 Subject: [PATCH] Merge pull request #22147 from rogday:zoom_factor Add zoom factor to interactive calibration tool * add zoom factor * address review comments --- apps/interactive-calibration/calibCommon.hpp | 1 + apps/interactive-calibration/calibPipeline.cpp | 13 +++++++++++-- apps/interactive-calibration/frameProcessor.cpp | 12 +++++++++++- apps/interactive-calibration/frameProcessor.hpp | 1 + apps/interactive-calibration/main.cpp | 1 + .../parametersController.cpp | 1 + 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/interactive-calibration/calibCommon.hpp b/apps/interactive-calibration/calibCommon.hpp index 617c17dbcf..f3fffa1729 100644 --- a/apps/interactive-calibration/calibCommon.hpp +++ b/apps/interactive-calibration/calibCommon.hpp @@ -94,6 +94,7 @@ namespace calib int maxFramesNum; int minFramesNum; bool saveFrames; + float zoom; captureParameters() { diff --git a/apps/interactive-calibration/calibPipeline.cpp b/apps/interactive-calibration/calibPipeline.cpp index a92dbffc2f..3b0eedffec 100644 --- a/apps/interactive-calibration/calibPipeline.cpp +++ b/apps/interactive-calibration/calibPipeline.cpp @@ -5,6 +5,7 @@ #include "calibPipeline.hpp" #include +#include #include @@ -58,7 +59,7 @@ PipelineExitStatus CalibPipeline::start(std::vector > pr if(!mCapture.isOpened()) throw std::runtime_error("Unable to open video source"); - cv::Mat frame, processedFrame; + cv::Mat frame, processedFrame, resizedFrame; while(mCapture.grab()) { mCapture.retrieve(frame); if(mCaptureParams.flipVertical) @@ -67,7 +68,15 @@ PipelineExitStatus CalibPipeline::start(std::vector > pr frame.copyTo(processedFrame); for (std::vector >::iterator it = processors.begin(); it != processors.end(); ++it) processedFrame = (*it)->processFrame(processedFrame); - cv::imshow(mainWindowName, processedFrame); + if (std::fabs(mCaptureParams.zoom - 1.) > 0.001f) + { + cv::resize(processedFrame, resizedFrame, cv::Size(), mCaptureParams.zoom, mCaptureParams.zoom); + } + else + { + resizedFrame = std::move(processedFrame); + } + cv::imshow(mainWindowName, resizedFrame); char key = (char)cv::waitKey(CAP_DELAY); if(key == 27) // esc diff --git a/apps/interactive-calibration/frameProcessor.cpp b/apps/interactive-calibration/frameProcessor.cpp index 2c2a1cd5aa..aa164f2a43 100644 --- a/apps/interactive-calibration/frameProcessor.cpp +++ b/apps/interactive-calibration/frameProcessor.cpp @@ -201,7 +201,16 @@ void CalibProcessor::showCaptureMessage(const cv::Mat& frame, const std::string double textSize = VIDEO_TEXT_SIZE * frame.cols / (double) IMAGE_MAX_WIDTH; cv::bitwise_not(frame, frame); cv::putText(frame, message, textOrigin, 1, textSize, cv::Scalar(0,0,255), 2, cv::LINE_AA); - cv::imshow(mainWindowName, frame); + cv::Mat resized; + if (std::fabs(mZoom - 1.) > 0.001f) + { + cv::resize(frame, resized, cv::Size(), mZoom, mZoom); + } + else + { + resized = frame; + } + cv::imshow(mainWindowName, resized); cv::waitKey(300); } @@ -267,6 +276,7 @@ CalibProcessor::CalibProcessor(cv::Ptr data, captureParameters mSquareSize = capParams.squareSize; mTemplDist = capParams.templDst; mSaveFrames = capParams.saveFrames; + mZoom = capParams.zoom; switch(mBoardType) { diff --git a/apps/interactive-calibration/frameProcessor.hpp b/apps/interactive-calibration/frameProcessor.hpp index 88e87f7b98..e048f84320 100644 --- a/apps/interactive-calibration/frameProcessor.hpp +++ b/apps/interactive-calibration/frameProcessor.hpp @@ -51,6 +51,7 @@ protected: float mSquareSize; float mTemplDist; bool mSaveFrames; + float mZoom; bool detectAndParseChessboard(const cv::Mat& frame); bool detectAndParseChAruco(const cv::Mat& frame); diff --git a/apps/interactive-calibration/main.cpp b/apps/interactive-calibration/main.cpp index b5c3642bb6..c2a6aa7298 100644 --- a/apps/interactive-calibration/main.cpp +++ b/apps/interactive-calibration/main.cpp @@ -41,6 +41,7 @@ const std::string keys = "{d | 0.8 | Min delay between captures}" "{pf | defaultConfig.xml| Advanced application parameters}" "{save_frames | false | Save frames that contribute to final calibration}" + "{zoom | 1 | Zoom factor applied to the image}" "{help | | Print help}"; bool calib::showOverlayMessage(const std::string& message) diff --git a/apps/interactive-calibration/parametersController.cpp b/apps/interactive-calibration/parametersController.cpp index 5659b0e469..b5a01b1ea8 100644 --- a/apps/interactive-calibration/parametersController.cpp +++ b/apps/interactive-calibration/parametersController.cpp @@ -90,6 +90,7 @@ bool calib::parametersController::loadFromParser(cv::CommandLineParser &parser) mCapParams.squareSize = parser.get("sz"); mCapParams.templDst = parser.get("dst"); mCapParams.saveFrames = parser.has("save_frames"); + mCapParams.zoom = parser.get("zoom"); if(!checkAssertion(mCapParams.squareSize > 0, "Distance between corners or circles must be positive")) return false;