videoio: add manual white-balance and implement it for V4L2

pull/12962/head
Pavel Rojtberg 6 years ago
parent 596ada51f3
commit afa0f80c61
  1. 2
      modules/videoio/include/opencv2/videoio.hpp
  2. 22
      modules/videoio/src/cap_v4l.cpp

@ -171,6 +171,8 @@ enum VideoCaptureProperties {
CAP_PROP_SAR_DEN =41, //!< Sample aspect ratio: num/den (den) CAP_PROP_SAR_DEN =41, //!< Sample aspect ratio: num/den (den)
CAP_PROP_BACKEND =42, //!< Current backend (enum VideoCaptureAPIs). Read-only property CAP_PROP_BACKEND =42, //!< Current backend (enum VideoCaptureAPIs). Read-only property
CAP_PROP_CHANNEL =43, //!< Video input or Channel Number (only for those cameras that support) CAP_PROP_CHANNEL =43, //!< Video input or Channel Number (only for those cameras that support)
CAP_PROP_AUTO_WB =44, //!< enable/ disable auto white-balance
CAP_PROP_WB_TEMPERATURE=45, //!< white-balance color temperature
#ifndef CV_DOXYGEN #ifndef CV_DOXYGEN
CV__CAP_PROP_LATEST CV__CAP_PROP_LATEST
#endif #endif

@ -1513,6 +1513,10 @@ static inline cv::String capPropertyName(int prop)
return "sar_num"; return "sar_num";
case cv::CAP_PROP_SAR_DEN: case cv::CAP_PROP_SAR_DEN:
return "sar_den"; return "sar_den";
case CAP_PROP_AUTO_WB:
return "auto wb";
case CAP_PROP_WB_TEMPERATURE:
return "wb temperature";
default: default:
return "unknown"; return "unknown";
} }
@ -1593,6 +1597,10 @@ static inline int capPropertyToV4L2(int prop)
return V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT; return V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT;
case cv::CAP_PROP_SAR_DEN: case cv::CAP_PROP_SAR_DEN:
return V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH; return V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH;
case CAP_PROP_AUTO_WB:
return V4L2_CID_AUTO_WHITE_BALANCE;
case CAP_PROP_WB_TEMPERATURE:
return V4L2_CID_WHITE_BALANCE_TEMPERATURE;
default: default:
break; break;
} }
@ -1631,10 +1639,18 @@ bool CvCaptureCAM_V4L::controlInfo(int property_id, __u32 &_v4l2id, cv::Range &r
_v4l2id = __u32(v4l2id); _v4l2id = __u32(v4l2id);
range = cv::Range(queryctrl.minimum, queryctrl.maximum); range = cv::Range(queryctrl.minimum, queryctrl.maximum);
if (normalizePropRange) { if (normalizePropRange) {
if (property_id == cv::CAP_PROP_AUTOFOCUS) switch(property_id)
range = Range(0, 1); {
else if (property_id == cv::CAP_PROP_AUTO_EXPOSURE) case CAP_PROP_WB_TEMPERATURE:
case CAP_PROP_AUTO_WB:
case CAP_PROP_AUTOFOCUS:
range = Range(0, 1); // do not convert
break;
case CAP_PROP_AUTO_EXPOSURE:
range = Range(0, 4); range = Range(0, 4);
default:
break;
}
} }
return true; return true;
} }

Loading…
Cancel
Save