Skip to content

Commit 00185d2

Browse files
committed
Added manual exposure settings
1 parent f6de60f commit 00185d2

4 files changed

Lines changed: 81 additions & 0 deletions

File tree

examples/glview.c

100644100755
Lines changed: 2 additions & 0 deletions
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

100644100755
Lines changed: 29 additions & 0 deletions
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

100644100755
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,50 @@ 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+
if (dev->video_format == FREENECT_VIDEO_RGB || dev->video_format == FREENECT_VIDEO_RGB)
106+
{
107+
*time_us = shutter_width * SHUTTER_WIDTH_TO_EXP_RGB;
108+
}
109+
else if (dev->video_format == FREENECT_VIDEO_RGB || dev->video_format == FREENECT_VIDEO_RGB)
110+
{
111+
*time_us = shutter_width * SHUTTER_WIDTH_TO_EXP_RGB;
112+
}
113+
else {
114+
FN_WARNING("Could not get exposure, invalid video format");
115+
return -1;
116+
}
117+
return 0;
118+
}
119+
120+
int freenect_set_exposure(freenect_device *dev, int time_us)
121+
{
122+
freenect_context *ctx = dev->parent;
123+
124+
uint16_t cmos_value = 0;
125+
if (dev->video_format == FREENECT_VIDEO_RGB || dev->video_format == FREENECT_VIDEO_RGB)
126+
{
127+
cmos_value = time_us / SHUTTER_WIDTH_TO_EXP_RGB;
128+
}
129+
else if (dev->video_format == FREENECT_VIDEO_RGB || dev->video_format == FREENECT_VIDEO_RGB)
130+
{
131+
cmos_value = time_us / SHUTTER_WIDTH_TO_EXP_RGB;
132+
}
133+
else {
134+
FN_WARNING("Could not set exposure, invalid video format");
135+
return -1;
136+
}
137+
return write_cmos_register(dev, 0x0009, cmos_value);;
138+
}
139+
96140
int freenect_get_ir_brightness(freenect_device *dev)
97141
{
98142
freenect_context *ctx = dev->parent;

src/freenect_internal.h

100644100755
Lines changed: 6 additions & 0 deletions
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)