RGB Camera Control
This example shows how to control the ColorCamera, such as exposure, sensitivity, white balance, luma/chroma denoise, device-side crop, camera triggers, etc.An output is a full frame along with cropped frame (video
) which can be moved with WASD
keys.List of all controls:Command Line
1Uses 'WASD' controls to move the crop window, 'C' to capture a still image, 'T' to
2 trigger autofocus, 'IOKL,.NM' for manual exposure/focus/white-balance:
3Control: key[dec/inc] min..max
4exposure time: I O 1..33000 [us]
5sensitivity iso: K L100..1600
6focus: , . 0..255 [far..near]
7white balance: N M 1000..12000 (light color temperature K)
8
9 To go back to auto controls:
10'E' - autoexposure
11'F' - autofocus (continuous)
12'B' - auto white-balance
13
14 Other controls:
15'1' - AWB lock (true / false)
16'2' - AE lock (true / false)
17'3' - Select control: AWB mode
18'4' - Select control: AE compensation
19'5' - Select control: anti-banding/flicker mode
20'6' - Select control: effect mode
21'7' - Select control: brightness
22'8' - Select control: contrast
23'9' - Select control: saturation
24'0' - Select control: sharpness
25'[' - Select control: luma denoise
26']' - Select control: chroma denoise
27
28 For the 'Select control: ...' options, use these keys to modify the value:
29'-' or '_' to decrease
30'+' or '=' to increase
Similar samples:
Demo
Setup
Please run the install script to download all required dependencies. Please note that this script must be ran from git context, so you have to download the depthai-python repository first and then run the scriptCommand Line
1git clone https://github.com/luxonis/depthai-python.git
2cd depthai-python/examples
3python3 install_requirements.py
Source code
Python
C++
Python
PythonGitHub
1#!/usr/bin/env python3
2
3"""
4This example shows usage of Camera Control message as well as ColorCamera configInput to change crop x and y
5Uses 'WASD' controls to move the crop window, 'C' to capture a still image, 'T' to trigger autofocus, 'IOKL,.NM'
6for manual exposure/focus/white-balance:
7 Control: key[dec/inc] min..max
8 exposure time: I O 1..33000 [us]
9 sensitivity iso: K L 100..1600
10 focus: , . 0..255 [far..near]
11 white balance: N M 1000..12000 (light color temperature K)
12
13To go back to auto controls:
14 'E' - autoexposure
15 'F' - autofocus (continuous)
16 'B' - auto white-balance
17
18Other controls:
19 '1' - AWB lock (true / false)
20 '2' - AE lock (true / false)
21 '3' - Select control: AWB mode
22 '4' - Select control: AE compensation
23 '5' - Select control: anti-banding/flicker mode
24 '6' - Select control: effect mode
25 '7' - Select control: brightness
26 '8' - Select control: contrast
27 '9' - Select control: saturation
28 '0' - Select control: sharpness
29 '[' - Select control: luma denoise
30 ']' - Select control: chroma denoise
31
32For the 'Select control: ...' options, use these keys to modify the value:
33 '-' or '_' to decrease
34 '+' or '=' to increase
35
36'/' to toggle showing camera settings: exposure, ISO, lens position, color temperature
37"""
38
39import depthai as dai
40import cv2
41from itertools import cycle
42
43# Step size ('W','A','S','D' controls)
44STEP_SIZE = 8
45# Manual exposure/focus/white-balance set step
46EXP_STEP = 500 # us
47ISO_STEP = 50
48LENS_STEP = 3
49WB_STEP = 200
50
51def clamp(num, v0, v1):
52 return max(v0, min(num, v1))
53
54# Create pipeline
55pipeline = dai.Pipeline()
56
57# Define sources and outputs
58camRgb = pipeline.create(dai.node.ColorCamera)
59camRgb.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
60camRgb.setIspScale(2,3) # 1080P -> 720P
61stillEncoder = pipeline.create(dai.node.VideoEncoder)
62
63controlIn = pipeline.create(dai.node.XLinkIn)
64configIn = pipeline.create(dai.node.XLinkIn)
65ispOut = pipeline.create(dai.node.XLinkOut)
66videoOut = pipeline.create(dai.node.XLinkOut)
67stillMjpegOut = pipeline.create(dai.node.XLinkOut)
68
69controlIn.setStreamName('control')
70configIn.setStreamName('config')
71ispOut.setStreamName('isp')
72videoOut.setStreamName('video')
73stillMjpegOut.setStreamName('still')
74
75# Properties
76camRgb.setVideoSize(640,360)
77stillEncoder.setDefaultProfilePreset(1, dai.VideoEncoderProperties.Profile.MJPEG)
78
79# Linking
80camRgb.isp.link(ispOut.input)
81camRgb.still.link(stillEncoder.input)
82camRgb.video.link(videoOut.input)
83controlIn.out.link(camRgb.inputControl)
84configIn.out.link(camRgb.inputConfig)
85stillEncoder.bitstream.link(stillMjpegOut.input)
86
87# Connect to device and start pipeline
88with dai.Device(pipeline) as device:
89
90 # Get data queues
91 controlQueue = device.getInputQueue('control')
92 configQueue = device.getInputQueue('config')
93 ispQueue = device.getOutputQueue('isp')
94 videoQueue = device.getOutputQueue('video')
95 stillQueue = device.getOutputQueue('still')
96
97 # Max cropX & cropY
98 maxCropX = (camRgb.getIspWidth() - camRgb.getVideoWidth()) / camRgb.getIspWidth()
99 maxCropY = (camRgb.getIspHeight() - camRgb.getVideoHeight()) / camRgb.getIspHeight()
100 print(maxCropX, maxCropY, camRgb.getIspWidth(), camRgb.getVideoHeight())
101
102 # Default crop
103 cropX = 0
104 cropY = 0
105 sendCamConfig = True
106
107 # Defaults and limits for manual focus/exposure controls
108 lensPos = 150
109 expTime = 20000
110 sensIso = 800
111 wbManual = 4000
112 ae_comp = 0
113 ae_lock = False
114 awb_lock = False
115 saturation = 0
116 contrast = 0
117 brightness = 0
118 sharpness = 0
119 luma_denoise = 0
120 chroma_denoise = 0
121 control = 'none'
122 show = False
123
124 awb_mode = cycle([item for name, item in vars(dai.CameraControl.AutoWhiteBalanceMode).items() if name.isupper()])
125 anti_banding_mode = cycle([item for name, item in vars(dai.CameraControl.AntiBandingMode).items() if name.isupper()])
126 effect_mode = cycle([item for name, item in vars(dai.CameraControl.EffectMode).items() if name.isupper()])
127
128 while True:
129 vidFrames = videoQueue.tryGetAll()
130 for vidFrame in vidFrames:
131 cv2.imshow('video', vidFrame.getCvFrame())
132
133 ispFrames = ispQueue.tryGetAll()
134 for ispFrame in ispFrames:
135 if show:
136 txt = f"[{ispFrame.getSequenceNum()}] "
137 txt += f"Exposure: {ispFrame.getExposureTime().total_seconds()*1000:.3f} ms, "
138 txt += f"ISO: {ispFrame.getSensitivity()}, "
139 txt += f"Lens position: {ispFrame.getLensPosition()}, "
140 txt += f"Color temp: {ispFrame.getColorTemperature()} K"
141 print(txt)
142 cv2.imshow('isp', ispFrame.getCvFrame())
143
144 # Send new cfg to camera
145 if sendCamConfig:
146 cfg = dai.ImageManipConfig()
147 cfg.setCropRect(cropX, cropY, 0, 0)
148 configQueue.send(cfg)
149 print('Sending new crop - x: ', cropX, ' y: ', cropY)
150 sendCamConfig = False
151
152 stillFrames = stillQueue.tryGetAll()
153 for stillFrame in stillFrames:
154 # Decode JPEG
155 frame = cv2.imdecode(stillFrame.getData(), cv2.IMREAD_UNCHANGED)
156 # Display
157 cv2.imshow('still', frame)
158
159 # Update screen (1ms pooling rate)
160 key = cv2.waitKey(1)
161 if key == ord('q'):
162 break
163 elif key == ord('/'):
164 show = not show
165 if not show: print("Printing camera settings: OFF")
166 elif key == ord('c'):
167 ctrl = dai.CameraControl()
168 ctrl.setCaptureStill(True)
169 controlQueue.send(ctrl)
170 elif key == ord('t'):
171 print("Autofocus trigger (and disable continuous)")
172 ctrl = dai.CameraControl()
173 ctrl.setAutoFocusMode(dai.CameraControl.AutoFocusMode.AUTO)
174 ctrl.setAutoFocusTrigger()
175 controlQueue.send(ctrl)
176 elif key == ord('f'):
177 print("Autofocus enable, continuous")
178 ctrl = dai.CameraControl()
179 ctrl.setAutoFocusMode(dai.CameraControl.AutoFocusMode.CONTINUOUS_VIDEO)
180 controlQueue.send(ctrl)
181 elif key == ord('e'):
182 print("Autoexposure enable")
183 ctrl = dai.CameraControl()
184 ctrl.setAutoExposureEnable()
185 controlQueue.send(ctrl)
186 elif key == ord('b'):
187 print("Auto white-balance enable")
188 ctrl = dai.CameraControl()
189 ctrl.setAutoWhiteBalanceMode(dai.CameraControl.AutoWhiteBalanceMode.AUTO)
190 controlQueue.send(ctrl)
191 elif key in [ord(','), ord('.')]:
192 if key == ord(','): lensPos -= LENS_STEP
193 if key == ord('.'): lensPos += LENS_STEP
194 lensPos = clamp(lensPos, 0, 255)
195 print("Setting manual focus, lens position: ", lensPos)
196 ctrl = dai.CameraControl()
197 ctrl.setManualFocus(lensPos)
198 controlQueue.send(ctrl)
199 elif key in [ord('i'), ord('o'), ord('k'), ord('l')]:
200 if key == ord('i'): expTime -= EXP_STEP
201 if key == ord('o'): expTime += EXP_STEP
202 if key == ord('k'): sensIso -= ISO_STEP
203 if key == ord('l'): sensIso += ISO_STEP
204 expTime = clamp(expTime, 1, 33000)
205 sensIso = clamp(sensIso, 100, 1600)
206 print("Setting manual exposure, time: ", expTime, "iso: ", sensIso)
207 ctrl = dai.CameraControl()
208 ctrl.setManualExposure(expTime, sensIso)
209 controlQueue.send(ctrl)
210 elif key in [ord('n'), ord('m')]:
211 if key == ord('n'): wbManual -= WB_STEP
212 if key == ord('m'): wbManual += WB_STEP
213 wbManual = clamp(wbManual, 1000, 12000)
214 print("Setting manual white balance, temperature: ", wbManual, "K")
215 ctrl = dai.CameraControl()
216 ctrl.setManualWhiteBalance(wbManual)
217 controlQueue.send(ctrl)
218 elif key in [ord('w'), ord('a'), ord('s'), ord('d')]:
219 if key == ord('a'):
220 cropX = cropX - (maxCropX / camRgb.getResolutionWidth()) * STEP_SIZE
221 if cropX < 0: cropX = 0
222 elif key == ord('d'):
223 cropX = cropX + (maxCropX / camRgb.getResolutionWidth()) * STEP_SIZE
224 if cropX > maxCropX: cropX = maxCropX
225 elif key == ord('w'):
226 cropY = cropY - (maxCropY / camRgb.getResolutionHeight()) * STEP_SIZE
227 if cropY < 0: cropY = 0
228 elif key == ord('s'):
229 cropY = cropY + (maxCropY / camRgb.getResolutionHeight()) * STEP_SIZE
230 if cropY > maxCropY: cropY = maxCropY
231 sendCamConfig = True
232 elif key == ord('1'):
233 awb_lock = not awb_lock
234 print("Auto white balance lock:", awb_lock)
235 ctrl = dai.CameraControl()
236 ctrl.setAutoWhiteBalanceLock(awb_lock)
237 controlQueue.send(ctrl)
238 elif key == ord('2'):
239 ae_lock = not ae_lock
240 print("Auto exposure lock:", ae_lock)
241 ctrl = dai.CameraControl()
242 ctrl.setAutoExposureLock(ae_lock)
243 controlQueue.send(ctrl)
244 elif key >= 0 and chr(key) in '34567890[]':
245 if key == ord('3'): control = 'awb_mode'
246 elif key == ord('4'): control = 'ae_comp'
247 elif key == ord('5'): control = 'anti_banding_mode'
248 elif key == ord('6'): control = 'effect_mode'
249 elif key == ord('7'): control = 'brightness'
250 elif key == ord('8'): control = 'contrast'
251 elif key == ord('9'): control = 'saturation'
252 elif key == ord('0'): control = 'sharpness'
253 elif key == ord('['): control = 'luma_denoise'
254 elif key == ord(']'): control = 'chroma_denoise'
255 print("Selected control:", control)
256 elif key in [ord('-'), ord('_'), ord('+'), ord('=')]:
257 change = 0
258 if key in [ord('-'), ord('_')]: change = -1
259 if key in [ord('+'), ord('=')]: change = 1
260 ctrl = dai.CameraControl()
261 if control == 'none':
262 print("Please select a control first using keys 3..9 0 [ ]")
263 elif control == 'ae_comp':
264 ae_comp = clamp(ae_comp + change, -9, 9)
265 print("Auto exposure compensation:", ae_comp)
266 ctrl.setAutoExposureCompensation(ae_comp)
267 elif control == 'anti_banding_mode':
268 abm = next(anti_banding_mode)
269 print("Anti-banding mode:", abm)
270 ctrl.setAntiBandingMode(abm)
271 elif control == 'awb_mode':
272 awb = next(awb_mode)
273 print("Auto white balance mode:", awb)
274 ctrl.setAutoWhiteBalanceMode(awb)
275 elif control == 'effect_mode':
276 eff = next(effect_mode)
277 print("Effect mode:", eff)
278 ctrl.setEffectMode(eff)
279 elif control == 'brightness':
280 brightness = clamp(brightness + change, -10, 10)
281 print("Brightness:", brightness)
282 ctrl.setBrightness(brightness)
283 elif control == 'contrast':
284 contrast = clamp(contrast + change, -10, 10)
285 print("Contrast:", contrast)
286 ctrl.setContrast(contrast)
287 elif control == 'saturation':
288 saturation = clamp(saturation + change, -10, 10)
289 print("Saturation:", saturation)
290 ctrl.setSaturation(saturation)
291 elif control == 'sharpness':
292 sharpness = clamp(sharpness + change, 0, 4)
293 print("Sharpness:", sharpness)
294 ctrl.setSharpness(sharpness)
295 elif control == 'luma_denoise':
296 luma_denoise = clamp(luma_denoise + change, 0, 4)
297 print("Luma denoise:", luma_denoise)
298 ctrl.setLumaDenoise(luma_denoise)
299 elif control == 'chroma_denoise':
300 chroma_denoise = clamp(chroma_denoise + change, 0, 4)
301 print("Chroma denoise:", chroma_denoise)
302 ctrl.setChromaDenoise(chroma_denoise)
303 controlQueue.send(ctrl)
Pipeline
Need assistance?
Head over to Discussion Forum for technical support or any other questions you might have.