From f825b4d1abe24a51db4d6e0f4ffed977668cc94b Mon Sep 17 00:00:00 2001 From: dai-xin <1150445919@qq.com> Date: Mon, 9 Dec 2024 17:55:46 +0800 Subject: [PATCH] Resolve the issue of slow camera opening when using dshow as the backend for VideoCapture. --- modules/videoio/src/cap_dshow.cpp | 16 +++++++++++++--- modules/videoio/src/cap_dshow.hpp | 2 +- modules/videoio/src/cap_interface.hpp | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/modules/videoio/src/cap_dshow.cpp b/modules/videoio/src/cap_dshow.cpp index d46bb08a0d..c383e478de 100644 --- a/modules/videoio/src/cap_dshow.cpp +++ b/modules/videoio/src/cap_dshow.cpp @@ -3360,7 +3360,7 @@ namespace cv { videoInput VideoCapture_DShow::g_VI; -VideoCapture_DShow::VideoCapture_DShow(int index) +VideoCapture_DShow::VideoCapture_DShow(int index, const VideoCaptureParameters& params) : m_index(-1) , m_width(-1) , m_height(-1) @@ -3370,6 +3370,16 @@ VideoCapture_DShow::VideoCapture_DShow(int index) , m_convertRGBSet(true) { CoInitialize(0); + + if (!params.empty()) { + int tmpW = params.get(CV_CAP_PROP_FRAME_WIDTH, -1); + int tmpH = params.get(CV_CAP_PROP_FRAME_HEIGHT, -1); + int tmpFOURCC = params.get(CV_CAP_PROP_FOURCC, -1); + if (tmpW != -1 && tmpH != -1) { + g_VI.setupDeviceFourcc(index, tmpW, tmpH, tmpFOURCC); + } + } + open(index); } VideoCapture_DShow::~VideoCapture_DShow() @@ -3675,9 +3685,9 @@ void VideoCapture_DShow::close() m_convertRGBSet = true; } -Ptr create_DShow_capture(int index) +Ptr create_DShow_capture(int index, const VideoCaptureParameters& params) { - return makePtr(index); + return makePtr(index, params); } diff --git a/modules/videoio/src/cap_dshow.hpp b/modules/videoio/src/cap_dshow.hpp index 9a3b9da3bd..732ba81d8d 100644 --- a/modules/videoio/src/cap_dshow.hpp +++ b/modules/videoio/src/cap_dshow.hpp @@ -21,7 +21,7 @@ namespace cv class VideoCapture_DShow : public IVideoCapture { public: - VideoCapture_DShow(int index); + VideoCapture_DShow(int index, const VideoCaptureParameters& params); virtual ~VideoCapture_DShow(); virtual double getProperty(int propIdx) const CV_OVERRIDE; diff --git a/modules/videoio/src/cap_interface.hpp b/modules/videoio/src/cap_interface.hpp index a57564b11e..5bd2d41419 100644 --- a/modules/videoio/src/cap_interface.hpp +++ b/modules/videoio/src/cap_interface.hpp @@ -355,7 +355,7 @@ Ptr cvCreateVideoWriter_MSMF(const std::string& filename, int four double fps, const Size& frameSize, const VideoWriterParameters& params); -Ptr create_DShow_capture(int index); +Ptr create_DShow_capture(int index, const VideoCaptureParameters& params); Ptr create_V4L_capture_cam(int index); Ptr create_V4L_capture_file(const std::string &filename);