Skip to content

Commit 0f8d11e

Browse files
dudeofeapiedar
andcommitted
Added manual exposure settings
Co-authored-by: Benn Snyder <[email protected]> Signed-off-by: Benn Snyder <[email protected]> Reviewed-by: Benn Snyder <[email protected]>
1 parent 478b68b commit 0f8d11e

File tree

5 files changed

+91
-2
lines changed

5 files changed

+91
-2
lines changed

CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ include (FindOS)
4646
include (SetupDirectories)
4747

4848
set (PROJECT_VER_MAJOR 0)
49-
set (PROJECT_VER_MINOR 6)
50-
set (PROJECT_VER_PATCH 5)
49+
set (PROJECT_VER_MINOR 7)
50+
set (PROJECT_VER_PATCH 0)
5151
set (PROJECT_VER
5252
"${PROJECT_VER_MAJOR}.${PROJECT_VER_MINOR}.${PROJECT_VER_PATCH}")
5353
set (PROJECT_APIVER

examples/glview.c

+2
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ void keyPressed(unsigned char key, int x, int y)
217217
if (key == 'e') {
218218
static freenect_flag_value auto_exposure = FREENECT_ON;
219219
freenect_set_flag(f_dev, FREENECT_AUTO_EXPOSURE, auto_exposure);
220+
freenect_set_flag(f_dev, FREENECT_AUTO_FLICKER, auto_exposure);
221+
freenect_set_flag(f_dev, FREENECT_AUTO_WHITE_BALANCE, auto_exposure);
220222
auto_exposure = auto_exposure ? FREENECT_OFF : FREENECT_ON;
221223
}
222224
if (key == 'b') {

include/libfreenect.h

+29
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ typedef enum {
110110
typedef enum {
111111
// values written to the CMOS register
112112
FREENECT_AUTO_EXPOSURE = 1 << 14,
113+
FREENECT_AUTO_FLICKER = 1 << 7,
113114
FREENECT_AUTO_WHITE_BALANCE = 1 << 1,
114115
FREENECT_RAW_COLOR = 1 << 4,
115116
// arbitrary bitfields to support flag combination
@@ -670,6 +671,34 @@ FREENECTAPI int freenect_set_depth_mode(freenect_device* dev, const freenect_fra
670671
*/
671672
FREENECTAPI int freenect_set_flag(freenect_device *dev, freenect_flag flag, freenect_flag_value value);
672673

674+
/**
675+
* Get the current exposure in microseconds
676+
*
677+
* @param dev Device to set exposure
678+
* @param time_us exposure time in microseconds
679+
*
680+
* @return 0 on success, < 0 if error
681+
*/
682+
FREENECTAPI int freenect_get_exposure(freenect_device *dev, int *time_us);
683+
684+
/**
685+
* Sets a static exposure time in microseconds
686+
* note: you must turn off auto-exposure before calling this function
687+
*
688+
* Sample usage with 33.333ms exposure:
689+
*
690+
* freenect_set_flag(fn_dev, FREENECT_AUTO_EXPOSURE, FREENECT_OFF);
691+
* freenect_set_flag(fn_dev, FREENECT_AUTO_FLICKER, FREENECT_OFF);
692+
* freenect_set_flag(fn_dev, FREENECT_AUTO_WHITE_BALANCE, FREENECT_OFF);
693+
* freenect_set_exposure(fn_dev, 33333);
694+
*
695+
* @param dev Device to set exposure
696+
* @param time_us exposure time in microseconds
697+
*
698+
* @return 0 on success, < 0 if error
699+
*/
700+
FREENECTAPI int freenect_set_exposure(freenect_device *dev, int time_us);
701+
673702
/**
674703
* Returns the brightness of the IR sensor.
675704
*

src/flags.c

+52
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,58 @@ int freenect_set_flag(freenect_device *dev, freenect_flag flag, freenect_flag_va
9393
return write_cmos_register(dev, 0x0106, cmos_value);
9494
}
9595

96+
int freenect_get_exposure(freenect_device *dev, int *time_us)
97+
{
98+
freenect_context *ctx = dev->parent;
99+
100+
uint16_t shutter_width = read_cmos_register(dev, 0x0009);
101+
if (shutter_width == UINT16_MAX)
102+
{
103+
return -1;
104+
}
105+
switch (dev->video_format) {
106+
case FREENECT_VIDEO_RGB:
107+
case FREENECT_VIDEO_BAYER:
108+
*time_us = shutter_width * SHUTTER_WIDTH_TO_EXP_RGB;
109+
break;
110+
case FREENECT_VIDEO_YUV_RGB:
111+
case FREENECT_VIDEO_YUV_RAW:
112+
*time_us = shutter_width * SHUTTER_WIDTH_TO_EXP_YUV;
113+
break;
114+
case FREENECT_VIDEO_DUMMY:
115+
case FREENECT_VIDEO_IR_8BIT:
116+
case FREENECT_VIDEO_IR_10BIT:
117+
case FREENECT_VIDEO_IR_10BIT_PACKED:
118+
FN_WARNING("Could not get exposure, invalid video format");
119+
return -1;
120+
}
121+
return 0;
122+
}
123+
124+
int freenect_set_exposure(freenect_device *dev, int time_us)
125+
{
126+
freenect_context *ctx = dev->parent;
127+
128+
uint16_t cmos_value = 0;
129+
switch (dev->video_format) {
130+
case FREENECT_VIDEO_RGB:
131+
case FREENECT_VIDEO_BAYER:
132+
cmos_value = time_us / SHUTTER_WIDTH_TO_EXP_RGB;
133+
break;
134+
case FREENECT_VIDEO_YUV_RGB:
135+
case FREENECT_VIDEO_YUV_RAW:
136+
cmos_value = time_us / SHUTTER_WIDTH_TO_EXP_YUV;
137+
break;
138+
case FREENECT_VIDEO_DUMMY:
139+
case FREENECT_VIDEO_IR_8BIT:
140+
case FREENECT_VIDEO_IR_10BIT:
141+
case FREENECT_VIDEO_IR_10BIT_PACKED:
142+
FN_WARNING("Could not set exposure, invalid video format");
143+
return -1;
144+
}
145+
return write_cmos_register(dev, 0x0009, cmos_value);;
146+
}
147+
96148
int freenect_get_ir_brightness(freenect_device *dev)
97149
{
98150
freenect_context *ctx = dev->parent;

src/freenect_internal.h

+6
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ static inline int32_t fn_le32s(int32_t s)
148148
#define PID_K4W_AUDIO_ALT_1 0x02c3
149149
#define PID_K4W_AUDIO_ALT_2 0x02bb
150150

151+
// Conversion from shutter width to exposure in microseconds
152+
// Measured using camtest.c with various very long exposure times
153+
// TODO: calculate this from camera registers instead of magic numbers
154+
#define SHUTTER_WIDTH_TO_EXP_RGB 54.21
155+
#define SHUTTER_WIDTH_TO_EXP_YUV 63.25
156+
151157
typedef struct {
152158
int running;
153159
uint8_t flag;

0 commit comments

Comments
 (0)