diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index 281d51eded..e5d9627343 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 ff0bc6f609..36339703e6 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