mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-20 08:42:11 +08:00
camerad: add helper function get_gain_factor (#33594)
This commit is contained in:
@@ -60,20 +60,23 @@ public:
|
||||
void set_exposure_rect();
|
||||
void run();
|
||||
|
||||
float get_gain_factor() const {
|
||||
return (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight);
|
||||
}
|
||||
|
||||
void init() {
|
||||
fl_pix = cc.focal_len / sensor->pixel_size_mm;
|
||||
set_exposure_rect();
|
||||
|
||||
dc_gain_weight = sensor->dc_gain_min_weight;
|
||||
gain_idx = sensor->analog_gain_rec_idx;
|
||||
cur_ev[0] = cur_ev[1] = cur_ev[2] = (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight) * sensor->sensor_analog_gains[gain_idx] * exposure_time;
|
||||
cur_ev[0] = cur_ev[1] = cur_ev[2] = get_gain_factor() * sensor->sensor_analog_gains[gain_idx] * exposure_time;
|
||||
};
|
||||
|
||||
// TODO: this should move to SpectraCamera
|
||||
void handle_camera_event(void *evdat);
|
||||
};
|
||||
|
||||
|
||||
void CameraState::handle_camera_event(void *evdat) {
|
||||
if (!enabled) return;
|
||||
struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)evdat;
|
||||
@@ -113,7 +116,7 @@ void CameraState::handle_camera_event(void *evdat) {
|
||||
meta_data.request_id = real_id;
|
||||
meta_data.timestamp_sof = timestamp;
|
||||
exp_lock.lock();
|
||||
meta_data.gain = analog_gain_frac * (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight);
|
||||
meta_data.gain = analog_gain_frac * get_gain_factor();
|
||||
meta_data.high_conversion_gain = dc_gain_enabled;
|
||||
meta_data.integ_lines = exposure_time;
|
||||
meta_data.measured_grey_fraction = measured_grey_fraction;
|
||||
@@ -233,7 +236,7 @@ void CameraState::set_camera_exposure(float grey_frac) {
|
||||
// Simple brute force optimizer to choose sensor parameters
|
||||
// to reach desired EV
|
||||
for (int g = std::max((int)sensor->analog_gain_min_idx, gain_idx - 1); g <= std::min((int)sensor->analog_gain_max_idx, gain_idx + 1); g++) {
|
||||
float gain = sensor->sensor_analog_gains[g] * (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight);
|
||||
float gain = sensor->sensor_analog_gains[g] * get_gain_factor();
|
||||
|
||||
// Compute optimal time for given gain
|
||||
int t = std::clamp(int(std::round(desired_ev / gain)), sensor->exposure_time_min, sensor->exposure_time_max);
|
||||
@@ -257,7 +260,7 @@ void CameraState::set_camera_exposure(float grey_frac) {
|
||||
exposure_time = new_exp_t;
|
||||
dc_gain_enabled = enable_dc_gain;
|
||||
|
||||
float gain = analog_gain_frac * (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight);
|
||||
float gain = analog_gain_frac * get_gain_factor();
|
||||
cur_ev[buf.cur_frame_data.frame_id % 3] = exposure_time * gain;
|
||||
|
||||
exp_lock.unlock();
|
||||
|
||||
Reference in New Issue
Block a user