From 535425982fb311aa2cde2c2c52e8ef148405f8ba Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Fri, 1 Apr 2011 18:29:32 +0000 Subject: [PATCH] extended libdc1394 backend (the patch is by Michael Joachimiak) --- .../include/opencv2/highgui/highgui_c.h | 27 +++- modules/highgui/src/cap_dc1394_v2.cpp | 138 ++++++++++++++++-- modules/python/defs | 1 - 3 files changed, 150 insertions(+), 16 deletions(-) diff --git a/modules/highgui/include/opencv2/highgui/highgui_c.h b/modules/highgui/include/opencv2/highgui/highgui_c.h index 0a6838d42..ecf8d27a9 100644 --- a/modules/highgui/include/opencv2/highgui/highgui_c.h +++ b/modules/highgui/include/opencv2/highgui/highgui_c.h @@ -315,6 +315,12 @@ CVAPI(void) cvReleaseCapture( CvCapture** capture ); enum { + // modes of the controlling registers (can be: auto, manual, auto single push, absolute Latter allowed with any other mode) + // every feature can have only one mode turned on at a time + CV_CAP_PROP_DC1394_OFF = -4, //turn the feature off (not controlled manually nor automatically) + CV_CAP_PROP_DC1394_MODE_MANUAL = -3, //set automatically when a value of the feature is set by the user + CV_CAP_PROP_DC1394_MODE_AUTO = -2, + CV_CAP_PROP_DC1394_MODE_ONE_PUSH_AUTO = -1, CV_CAP_PROP_POS_MSEC =0, CV_CAP_PROP_POS_FRAMES =1, CV_CAP_PROP_POS_AVI_RATIO =2, @@ -332,20 +338,29 @@ enum CV_CAP_PROP_GAIN =14, CV_CAP_PROP_EXPOSURE =15, CV_CAP_PROP_CONVERT_RGB =16, - CV_CAP_PROP_WHITE_BALANCE =17, + CV_CAP_PROP_WHITE_BALANCE_BLUE_U =17, CV_CAP_PROP_RECTIFICATION =18, CV_CAP_PROP_MONOCROME =19, - + CV_CAP_PROP_SHARPNESS =20, + CV_CAP_PROP_AUTO_EXPOSURE =21, // exposure control done by camera, + // user can adjust refernce level + // using this feature + CV_CAP_PROP_GAMMA =22, + CV_CAP_PROP_TEMPERATURE =23, + CV_CAP_PROP_TRIGGER =24, + CV_CAP_PROP_TRIGGER_DELAY =25, + CV_CAP_PROP_WHITE_BALANCE_RED_V =26, + CV_CAP_PROP_MAX_DC1394 =27, // OpenNI map generators CV_CAP_OPENNI_DEPTH_GENERATOR = 0, CV_CAP_OPENNI_IMAGE_GENERATOR = 1 << 31, CV_CAP_OPENNI_GENERATORS_MASK = 1 << 31, // Properties of cameras avalible through OpenNI interfaces - CV_CAP_PROP_OPENNI_OUTPUT_MODE = 20, - CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH = 21, // in mm - CV_CAP_PROP_OPENNI_BASELINE = 22, // in mm - CV_CAP_PROP_OPENNI_FOCAL_LENGTH = 23, // in pixels + CV_CAP_PROP_OPENNI_OUTPUT_MODE = 100, + CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH = 101, // in mm + CV_CAP_PROP_OPENNI_BASELINE = 102, // in mm + CV_CAP_PROP_OPENNI_FOCAL_LENGTH = 103, // in pixels CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CV_CAP_OPENNI_IMAGE_GENERATOR + CV_CAP_PROP_OPENNI_OUTPUT_MODE, CV_CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_BASELINE, CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_FOCAL_LENGTH diff --git a/modules/highgui/src/cap_dc1394_v2.cpp b/modules/highgui/src/cap_dc1394_v2.cpp index 12c0da647..b41b82f25 100644 --- a/modules/highgui/src/cap_dc1394_v2.cpp +++ b/modules/highgui/src/cap_dc1394_v2.cpp @@ -190,6 +190,7 @@ static CvDC1394 dc1394; class CvCaptureCAM_DC1394_v2_CPP : public CvCapture { public: + static int dc1394properties[CV_CAP_PROP_MAX_DC1394]; CvCaptureCAM_DC1394_v2_CPP(); virtual ~CvCaptureCAM_DC1394_v2_CPP() { @@ -236,8 +237,31 @@ protected: bool rectify; bool init_rectify; IplImage *maps[NIMG][2]; + dc1394featureset_t feature_set; +}; +//mapping CV_CAP_PROP_ to DC1394_FEATUREs +int CvCaptureCAM_DC1394_v2_CPP::dc1394properties[CV_CAP_PROP_MAX_DC1394] = { +-1, //no corresponding feature for CV_CAP_PROP_POS_MSEC +-1,-1,-1,-1, +DC1394_FEATURE_FRAME_RATE, //CV_CAP_PROP_FPS - fps can be set for format 7 only! +-1,-1,-1,-1, +DC1394_FEATURE_BRIGHTNESS,//CV_CAP_PROP_BRIGHTNESS 10 +-1, +DC1394_FEATURE_SATURATION,//CV_CAP_PROP_SATURATION +DC1394_FEATURE_HUE, +DC1394_FEATURE_GAIN, +DC1394_FEATURE_SHUTTER, //CV_CAP_PROP_EXPOSURE +-1,//CV_CAP_PROP_CONVERT_RGB +DC1394_FEATURE_WHITE_BALANCE, //corresponds to CV_CAP_PROP_WHITE_BALANCE_BLUE_U and CV_CAP_PROP_WHITE_BALANCE_RED_V, see set function to check these props are set +-1,-1, +DC1394_FEATURE_SHARPNESS, //20 +DC1394_FEATURE_EXPOSURE, //CV_CAP_PROP_AUTO_EXPOSURE - this is auto exposure according to the IIDC standard +DC1394_FEATURE_GAMMA, //CV_CAP_PROP_GAMMA +DC1394_FEATURE_TEMPERATURE, //CV_CAP_PROP_TEMPERATURE +DC1394_FEATURE_TRIGGER, //CV_CAP_PROP_TRIGGER +DC1394_FEATURE_TRIGGER_DELAY, //CV_CAP_PROP_TRIGGER_DELAY +DC1394_FEATURE_WHITE_BALANCE//CV_CAP_PROP_WHITE_BALANCE_RED_V }; - CvCaptureCAM_DC1394_v2_CPP::CvCaptureCAM_DC1394_v2_CPP() { guid = 0; @@ -411,7 +435,11 @@ bool CvCaptureCAM_DC1394_v2_CPP::open(int index) goto _exit_; cameraId = dcCam->vendor_id; - result = true; + //get all features + if (dc1394_feature_get_all(dcCam,&feature_set) == DC1394_SUCCESS) + result = true; + else + result = false; _exit_: if (cameraList) @@ -579,13 +607,27 @@ double CvCaptureCAM_DC1394_v2_CPP::getProperty(int propId) return fps; case CV_CAP_PROP_RECTIFICATION: return rectify ? 1 : 0; -// case CV_CAP_PROP_BRIGHTNESS : -// case CV_CAP_PROP_CONTRAST : -// case CV_CAP_PROP_WHITE_BALANCE : + case CV_CAP_PROP_WHITE_BALANCE_BLUE_U: + if (dc1394_feature_whitebalance_get_value(dcCam, + &feature_set.feature[DC1394_FEATURE_WHITE_BALANCE-DC1394_FEATURE_MIN].BU_value, + &feature_set.feature[DC1394_FEATURE_WHITE_BALANCE-DC1394_FEATURE_MIN].RV_value) == DC1394_SUCCESS) + return feature_set.feature[DC1394_FEATURE_WHITE_BALANCE-DC1394_FEATURE_MIN].BU_value; + break; + case CV_CAP_PROP_WHITE_BALANCE_RED_V: + if (dc1394_feature_whitebalance_get_value(dcCam, + &feature_set.feature[DC1394_FEATURE_WHITE_BALANCE-DC1394_FEATURE_MIN].BU_value, + &feature_set.feature[DC1394_FEATURE_WHITE_BALANCE-DC1394_FEATURE_MIN].RV_value) == DC1394_SUCCESS) + return feature_set.feature[DC1394_FEATURE_WHITE_BALANCE-DC1394_FEATURE_MIN].RV_value; + break; default: - ; + if (propId