From f59a955bea1df94218d698a4a8b1d3507fd9153c Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Tue, 15 Jul 2025 13:25:40 +0300 Subject: [PATCH] Added command line option to select VideoCapture backend. --- apps/interactive-calibration/calibCommon.hpp | 1 + .../interactive-calibration/calibPipeline.cpp | 4 +-- apps/interactive-calibration/main.cpp | 26 ++++++++++++++++--- .../parametersController.cpp | 23 +++++++++++++++- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/apps/interactive-calibration/calibCommon.hpp b/apps/interactive-calibration/calibCommon.hpp index 73cb4ab9fc..ed6c3613d1 100644 --- a/apps/interactive-calibration/calibCommon.hpp +++ b/apps/interactive-calibration/calibCommon.hpp @@ -92,6 +92,7 @@ namespace calib std::string videoFileName; bool flipVertical; int camID; + int camBackend; int fps; cv::Size cameraResolution; int maxFramesNum; diff --git a/apps/interactive-calibration/calibPipeline.cpp b/apps/interactive-calibration/calibPipeline.cpp index ac54764e41..4eae5469d6 100644 --- a/apps/interactive-calibration/calibPipeline.cpp +++ b/apps/interactive-calibration/calibPipeline.cpp @@ -34,7 +34,7 @@ PipelineExitStatus CalibPipeline::start(std::vector > pr auto open_camera = [this] () { if(mCaptureParams.source == Camera) { - mCapture.open(mCaptureParams.camID); + mCapture.open(mCaptureParams.camID, mCaptureParams.camBackend); cv::Size maxRes = getCameraResolution(); cv::Size neededRes = mCaptureParams.cameraResolution; @@ -55,7 +55,7 @@ PipelineExitStatus CalibPipeline::start(std::vector > pr mCapture.set(cv::CAP_PROP_AUTOFOCUS, 0); } else if (mCaptureParams.source == File) - mCapture.open(mCaptureParams.videoFileName); + mCapture.open(mCaptureParams.videoFileName, mCaptureParams.camBackend); }; if(!mCapture.isOpened()) { diff --git a/apps/interactive-calibration/main.cpp b/apps/interactive-calibration/main.cpp index 92ea2a93ae..b9ec7e8805 100644 --- a/apps/interactive-calibration/main.cpp +++ b/apps/interactive-calibration/main.cpp @@ -6,7 +6,7 @@ #include #include #include - +#include #include #include @@ -23,9 +23,25 @@ using namespace calib; -const std::string keys = +static std::string getVideoIoBackendsString() +{ + std::string result; + auto backs = cv::videoio_registry::getBackends(); + for (const auto& b: backs) + { + if (!result.empty()) + result += ", "; + + result += cv::videoio_registry::getBackendName(b); + } + + return result; +} + +const char* keys = "{v | | Input from video file }" - "{ci | 0 | Default camera id }" + "{ci | 0 | Camera id }" + "{vb | | Video I/O back-end. One of: %s }" "{flip | false | Vertical flip of input frames }" "{t | circles | Template for calibration (circles, chessboard, dualCircles, charuco, symcircles) }" "{sz | 16.3 | Distance between two nearest centers of circles or squares on calibration board}" @@ -95,11 +111,13 @@ static void undistortButton(int state, void* data) int main(int argc, char** argv) { - cv::CommandLineParser parser(argc, argv, keys); + cv::CommandLineParser parser(argc, argv, cv::format(keys, getVideoIoBackendsString().c_str())); + if(parser.has("help")) { parser.printMessage(); return 0; } + std::cout << consoleHelp << std::endl; parametersController paramsController; diff --git a/apps/interactive-calibration/parametersController.cpp b/apps/interactive-calibration/parametersController.cpp index 4ce81f352a..90d24b04c9 100644 --- a/apps/interactive-calibration/parametersController.cpp +++ b/apps/interactive-calibration/parametersController.cpp @@ -4,7 +4,7 @@ #include "parametersController.hpp" #include - +#include #include template @@ -106,6 +106,27 @@ bool calib::parametersController::loadFromParser(cv::CommandLineParser &parser) mCapParams.camID = parser.get("ci"); } + mCapParams.camBackend = cv::CAP_ANY; + if (parser.has("vb")) + { + std::string backendName = parser.get("vb"); + auto backs = cv::videoio_registry::getBackends(); + bool backendSet = false; + for (const auto& b: backs) + { + if (backendName == cv::videoio_registry::getBackendName(b)) + { + mCapParams.camBackend = b; + backendSet = true; + } + } + if (!backendSet) + { + std::cout << "Unknown or unsupported backend " << backendName << std::endl; + return false; + } + } + std::string templateType = parser.get("t"); if(templateType.find("symcircles", 0) == 0) {