diff --git a/modules/highgui/src/cap_dc1394_v2.cpp b/modules/highgui/src/cap_dc1394_v2.cpp index 405c01a45f76af21fe69a86f94690b78e1d1cb6d..12c0da647d44b4cb694971165c4bf2fb22613ded 100644 --- a/modules/highgui/src/cap_dc1394_v2.cpp +++ b/modules/highgui/src/cap_dc1394_v2.cpp @@ -219,6 +219,7 @@ protected: double fps; int nDMABufs; bool started; + int userMode; enum { VIDERE = 0x5505 }; @@ -257,6 +258,7 @@ CvCaptureCAM_DC1394_v2_CPP::CvCaptureCAM_DC1394_v2_CPP() frameC = 0; nimages = 1; rectify = false; + userMode = -1; } @@ -277,7 +279,7 @@ bool CvCaptureCAM_DC1394_v2_CPP::startCapture() DC1394_ISO_SPEED_3200); } - if (frameWidth > 0 || frameHeight > 0) + if (userMode == -1 && (frameWidth > 0 || frameHeight > 0)) { dc1394video_mode_t bestMode = (dc1394video_mode_t) - 1; dc1394video_modes_t videoModes; @@ -321,6 +323,17 @@ bool CvCaptureCAM_DC1394_v2_CPP::startCapture() if ((int)bestMode >= 0) code = dc1394_video_set_mode(dcCam, bestMode); } + + if (userMode > 0) + { + dc1394video_modes_t videoModes; + dc1394_video_get_supported_modes(dcCam, &videoModes); + if (userMode < videoModes.num) + { + dc1394video_mode_t mode = videoModes.modes[userMode]; + code = dc1394_video_set_mode(dcCam, mode); + } + } if (fps > 0) { @@ -601,6 +614,9 @@ bool CvCaptureCAM_DC1394_v2_CPP::setProperty(int propId, double value) return false; rectify = fabs(value) > FLT_EPSILON; break; + case CV_CAP_PROP_MODE: + userMode = cvRound(value); + break; default: return false; }