Ignore roll for face orientation filtering.
This commit is contained in:
parent
6f8d52695c
commit
465b0cbbae
4 changed files with 11 additions and 32 deletions
|
|
@ -312,21 +312,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-row sub-setting">
|
|
||||||
<label>
|
|
||||||
<span class="setting-label">Max Roll</span>
|
|
||||||
<span class="setting-hint">Maximum head tilt angle</span>
|
|
||||||
</label>
|
|
||||||
<div class="setting-control">
|
|
||||||
<input
|
|
||||||
type="range"
|
|
||||||
bind:value={config.processing.head_pose.max_roll}
|
|
||||||
min="5"
|
|
||||||
max="90"
|
|
||||||
step="5"
|
|
||||||
/>
|
|
||||||
<span class="value">{config.processing.head_pose.max_roll.toFixed(0)}°</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -641,12 +641,13 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_brightness_validation() {
|
fn test_brightness_validation() {
|
||||||
let mut config = BrightnessConfig::default();
|
let mut config = BrightnessConfig {
|
||||||
config.enabled = true;
|
enabled: true,
|
||||||
|
min_brightness: 0.1,
|
||||||
|
max_brightness: 0.9,
|
||||||
|
};
|
||||||
|
|
||||||
// Valid config
|
// Valid config
|
||||||
config.min_brightness = 0.1;
|
|
||||||
config.max_brightness = 0.9;
|
|
||||||
assert!(config.validate().is_ok());
|
assert!(config.validate().is_ok());
|
||||||
|
|
||||||
// Invalid: min >= max
|
// Invalid: min >= max
|
||||||
|
|
|
||||||
|
|
@ -161,8 +161,8 @@ mod tests {
|
||||||
fn test_input_format() {
|
fn test_input_format() {
|
||||||
// DMHead expects raw [0, 255] pixel values as floats, no normalization
|
// DMHead expects raw [0, 255] pixel values as floats, no normalization
|
||||||
// See: https://github.com/PINTO0309/DMHead/blob/main/demo_video.py
|
// See: https://github.com/PINTO0309/DMHead/blob/main/demo_video.py
|
||||||
assert_eq!(0_u8 as f32, 0.0);
|
assert_eq!(0_f32, 0.0);
|
||||||
assert_eq!(255_u8 as f32, 255.0);
|
assert_eq!(255_f32, 255.0);
|
||||||
assert_eq!(128_u8 as f32, 128.0);
|
assert_eq!(128_f32, 128.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -286,16 +286,9 @@ impl ProcessingStep for HeadPoseStep {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if pose.roll.abs() > head_pose_config.max_roll {
|
// Note: Roll is not checked for pass/fail - only used for visualization
|
||||||
return StepOutcome::Skip {
|
// Roll (head tilt) is less important for timelapse alignment since
|
||||||
ctx,
|
// the alignment step can handle rotated faces
|
||||||
reason: "head_turned".to_string(),
|
|
||||||
detail: Some(format!(
|
|
||||||
"Roll {:.1}° exceeds threshold {:.1}°",
|
|
||||||
pose.roll, head_pose_config.max_roll
|
|
||||||
)),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
StepOutcome::Continue(ctx)
|
StepOutcome::Continue(ctx)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue