From 4395c1b9f8145bd3f6433048e9b089c021008dd3 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sun, 4 Nov 2018 17:27:05 +0000 Subject: [PATCH] videoio: backport "VideoCapture(int index, int apiPreference)" interface --- modules/videoio/include/opencv2/videoio.hpp | 12 ++++++++++++ modules/videoio/src/cap.cpp | 26 ++++++++++++++++++-------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index 281d51e..e5d9627 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -649,6 +649,18 @@ public: */ CV_WRAP VideoCapture(int index); + /** @overload + @brief Opens a camera for video capturing + + @param index id of the video capturing device to open. To open default camera using default backend just pass 0. + (to backward compatibility usage of camera_id + domain_offset (CAP_*) is valid when apiPreference is CAP_ANY) + @param apiPreference preferred Capture API backends to use. Can be used to enforce a specific reader + implementation if multiple are available: e.g. cv::CAP_DSHOW or cv::CAP_MSMF or cv::CAP_V4L2. + + @sa The list of supported API backends cv::VideoCaptureAPIs + */ + CV_WRAP VideoCapture(int index, int apiPreference); + /** @brief Default destructor The method first calls VideoCapture::release to close the already opened file or camera. diff --git a/modules/videoio/src/cap.cpp b/modules/videoio/src/cap.cpp index ff0bc6f..3633970 100644 --- a/modules/videoio/src/cap.cpp +++ b/modules/videoio/src/cap.cpp @@ -75,6 +75,12 @@ VideoCapture::VideoCapture(int index) open(index); } +VideoCapture::VideoCapture(int index, int apiPreference) +{ + CV_TRACE_FUNCTION(); + open(index, apiPreference); +} + VideoCapture::~VideoCapture() { CV_TRACE_FUNCTION(); @@ -127,6 +133,17 @@ bool VideoCapture::open(int cameraNum, int apiPreference) if (isOpened()) release(); + if (apiPreference == CAP_ANY) + { + // interpret preferred interface (0 = autodetect) + int backendID = (cameraNum / 100) * 100; + if (backendID) + { + cameraNum %= 100; + apiPreference = backendID; + } + } + const std::vector backends = cv::videoio_registry::getAvailableBackends_CaptureByIndex(); for (size_t i = 0; i < backends.size(); i++) { @@ -156,14 +173,7 @@ bool VideoCapture::open(int index) { CV_TRACE_FUNCTION(); - // interpret preferred interface (0 = autodetect) - int backendID = (index / 100) * 100; - if (backendID) - { - index %= 100; - } - - return open(index, backendID); + return open(index, CAP_ANY); } bool VideoCapture::isOpened() const -- 2.7.4