Fix focal len autofill after browser adjustments

Don't update the camera-based perspective focal length and crop factor
parameters when making other adjustments using the file browser or batch
editor.

Closes #6402
This commit is contained in:
Lawrence Lee 2022-01-08 12:02:25 -08:00
parent 690fab3d08
commit 9c5ce0d9bb
3 changed files with 70 additions and 18 deletions

View File

@ -468,8 +468,8 @@ bool ImProcFunctions::transCoord (int W, int H, const std::vector<Coord2D> &src,
double hpcospt = (hpdeg >= 0 ? 1.0 : -1.0) * cos (hpteta), hptanpt = tan (hpteta);
// Camera-based.
const double f =
((params->perspective.camera_focal_length > 0) ? params->perspective.camera_focal_length : 24.0)
* ((params->perspective.camera_crop_factor > 0) ? params->perspective.camera_crop_factor : 1.0)
((params->perspective.camera_focal_length > 0) ? params->perspective.camera_focal_length : PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH)
* ((params->perspective.camera_crop_factor > 0) ? params->perspective.camera_crop_factor : PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR)
* (maxRadius / sqrt(18.0*18.0 + 12.0*12.0));
const double p_camera_yaw = params->perspective.camera_yaw / 180.0 * rtengine::RT_PI;
const double p_camera_pitch = params->perspective.camera_pitch / 180.0 * rtengine::RT_PI;
@ -1162,8 +1162,8 @@ void ImProcFunctions::transformGeneral(bool highQuality, Imagefloat *original, I
const double hptanpt = tan(hpteta);
// Camera-based.
const double f =
((params->perspective.camera_focal_length > 0) ? params->perspective.camera_focal_length : 24.0)
* ((params->perspective.camera_crop_factor > 0) ? params->perspective.camera_crop_factor : 1.0)
((params->perspective.camera_focal_length > 0) ? params->perspective.camera_focal_length : PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH)
* ((params->perspective.camera_crop_factor > 0) ? params->perspective.camera_crop_factor : PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR)
* (maxRadius / sqrt(18.0*18.0 + 12.0*12.0));
const double p_camera_yaw = params->perspective.camera_yaw / 180.0 * rtengine::RT_PI;
const double p_camera_pitch = params->perspective.camera_pitch / 180.0 * rtengine::RT_PI;

View File

@ -949,11 +949,22 @@ struct LensProfParams {
* Parameters of the perspective correction
*/
struct PerspectiveParams {
static constexpr double DEFAULT_CAMERA_CROP_FACTOR = 1;
static constexpr double DEFAULT_CAMERA_FOCAL_LENGTH = 24;
Glib::ustring method;
bool render;
double horizontal;
double vertical;
/**
* Negative and zero values indicate an unspecified crop factor and should
* be interpreted with {@link #DEFAULT_CAMERA_CROP_FACTOR}.
*/
double camera_crop_factor;
/**
* Negative and zero values indicate an unspecified focal length and should
* be interpreted with {@link #DEFAULT_CAMERA_FOCAL_LENGTH}.
*/
double camera_focal_length;
double camera_pitch;
double camera_roll;

View File

@ -160,10 +160,10 @@ PerspCorrection::PerspCorrection () : FoldableToolPanel(this, "perspective", M("
Gtk::Box* camera_vbox = Gtk::manage (new Gtk::Box(Gtk::ORIENTATION_VERTICAL));
camera_focal_length = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH"), 0.5, 2000, 0.01, 24));
camera_focal_length = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_FOCAL_LENGTH"), 0.5, 2000, 0.01, PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH));
camera_focal_length->setAdjusterListener (this);
camera_crop_factor = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_CROP_FACTOR"), 0.1, 30, 0.01, 1));
camera_crop_factor = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_CROP_FACTOR"), 0.1, 30, 0.01, PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR));
camera_crop_factor->setAdjusterListener (this);
camera_shift_horiz = Gtk::manage (new Adjuster (M("TP_PERSPECTIVE_CAMERA_SHIFT_HORIZONTAL"), -50, 50, 0.01, 0));
@ -358,13 +358,30 @@ void PerspCorrection::read (const ProcParams* pp, const ParamsEdited* pedited)
void PerspCorrection::write (ProcParams* pp, ParamsEdited* pedited)
{
// If any of these are non-zero, the focal length and crop factor must be
// updated to ensure they won't be auto-filled from metadata later. This
// prevents surprise changes to the perspective correction results.
const bool update_fl = camera_pitch->getValue() != 0 ||
camera_yaw->getValue() != 0 ||
projection_pitch->getValue() != 0 ||
projection_yaw->getValue() != 0;
pp->perspective.render = render;
pp->perspective.horizontal = horiz->getValue ();
pp->perspective.vertical = vert->getValue ();
pp->perspective.camera_crop_factor= camera_crop_factor->getValue ();
pp->perspective.camera_focal_length = camera_focal_length->getValue ();
if (update_fl || pp->perspective.camera_crop_factor > 0 ||
std::abs(camera_crop_factor->getValue() - PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR) > 1e-5) {
// Update if update_fl is true or the crop factor has previously been
// set or if the adjuster has changed from the default value.
pp->perspective.camera_crop_factor = camera_crop_factor->getValue ();
}
if (update_fl || pp->perspective.camera_focal_length > 0 ||
std::abs(camera_focal_length->getValue() - PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH) > 1e-4) {
// Update if update_fl is true or the focal length has previously been
// set or if the adjuster has changed from the default value.
pp->perspective.camera_focal_length = camera_focal_length->getValue ();
}
pp->perspective.camera_pitch = camera_pitch->getValue ();
pp->perspective.camera_roll = camera_roll->getValue ();
pp->perspective.camera_shift_horiz = camera_shift_horiz->getValue ();
@ -412,8 +429,12 @@ void PerspCorrection::setDefaults (const ProcParams* defParams, const ParamsEdit
horiz->setDefault (defParams->perspective.horizontal);
vert->setDefault (defParams->perspective.vertical);
camera_crop_factor->setDefault (defParams->perspective.camera_crop_factor);
camera_focal_length->setDefault (defParams->perspective.camera_focal_length);
camera_crop_factor->setDefault(defParams->perspective.camera_crop_factor > 0
? defParams->perspective.camera_crop_factor
: PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR);
camera_focal_length->setDefault(defParams->perspective.camera_focal_length > 0
? defParams->perspective.camera_focal_length
: PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH);
camera_pitch->setDefault (defParams->perspective.camera_pitch);
camera_roll->setDefault (defParams->perspective.camera_roll);
camera_shift_horiz->setDefault (defParams->perspective.camera_shift_horiz);
@ -636,8 +657,13 @@ void PerspCorrection::trimValues (rtengine::procparams::ProcParams* pp)
horiz->trimValue(pp->perspective.horizontal);
vert->trimValue(pp->perspective.vertical);
camera_crop_factor->trimValue(pp->perspective.camera_crop_factor);
camera_focal_length->trimValue(pp->perspective.camera_focal_length);
// Only update crop factor and focal length if they have been manually set.
if (pp->perspective.camera_crop_factor > 0) {
camera_crop_factor->trimValue(pp->perspective.camera_crop_factor);
}
if (pp->perspective.camera_focal_length > 0) {
camera_focal_length->trimValue(pp->perspective.camera_focal_length);
}
camera_pitch->trimValue(pp->perspective.camera_pitch);
camera_roll->trimValue(pp->perspective.camera_roll);
camera_shift_horiz->trimValue(pp->perspective.camera_shift_horiz);
@ -679,10 +705,25 @@ void PerspCorrection::setBatchMode (bool batchMode)
void PerspCorrection::setFocalLengthValue (const ProcParams* pparams, const FramesMetaData* metadata)
{
const double pp_crop_factor = pparams->perspective.camera_crop_factor;
const double pp_focal_length = pparams->perspective.camera_focal_length;
double default_crop_factor = 1.0;
double default_focal_length = 24.0;
double pp_crop_factor = pparams->perspective.camera_crop_factor;
double pp_focal_length = pparams->perspective.camera_focal_length;
double default_crop_factor = PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR;
double default_focal_length = PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH;
// If any of these values are non-zero, don't set the crop factor or focal
// length from metadata to avoid a surprise change in perspective correction
// results.
if (pparams->perspective.camera_pitch != 0 ||
pparams->perspective.camera_yaw != 0 ||
pparams->perspective.projection_pitch != 0 ||
pparams->perspective.projection_yaw != 0) {
if (pp_crop_factor <= 0) {
pp_crop_factor = PerspectiveParams::DEFAULT_CAMERA_CROP_FACTOR;
}
if (pp_focal_length <= 0) {
pp_focal_length = PerspectiveParams::DEFAULT_CAMERA_FOCAL_LENGTH;
}
}
// Defaults from metadata.
if (metadata && (pp_crop_factor <= 0 || pp_focal_length <= 0)) {
@ -710,13 +751,13 @@ void PerspCorrection::setFocalLengthValue (const ProcParams* pparams, const Fram
// Change value if those from the ProcParams are invalid.
if (pp_crop_factor > 0) {
camera_crop_factor->setValue(pparams->perspective.camera_crop_factor);
camera_crop_factor->setValue(pp_crop_factor);
} else {
camera_crop_factor->setDefault(default_crop_factor);
camera_crop_factor->setValue(default_crop_factor);
}
if (pp_focal_length > 0) {
camera_focal_length->setValue(pparams->perspective.camera_focal_length);
camera_focal_length->setValue(pp_focal_length);
} else {
camera_focal_length->setDefault(default_focal_length);
camera_focal_length->setValue(default_focal_length);