Skip to content

Commit 97fcc5e

Browse files
committed
Merge pull request #504 from cchampet/dev_lensdistomodels_2
Add lens distortion models Up plugin to v3.0
2 parents 0754034 + e7b110f commit 97fcc5e

File tree

8 files changed

+726
-336
lines changed

8 files changed

+726
-336
lines changed

plugins/image/process/geometry/LensDistort/src/LensDistortPlugin.cpp

Lines changed: 116 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,21 @@ LensDistortPlugin::LensDistortPlugin( OfxImageEffectHandle handle )
2525
_reverse = fetchBooleanParam ( kParamReverse );
2626
_displaySource = fetchBooleanParam ( kParamDisplaySource );
2727
_lensType = fetchChoiceParam ( kParamLensType );
28+
_normalization = fetchChoiceParam ( kParamNormalization );
29+
_focal = fetchDoubleParam ( kParamFocal );
2830
_coef1 = fetchDoubleParam ( kParamCoef1 );
2931
_coef2 = fetchDoubleParam ( kParamCoef2 );
32+
_coef3 = fetchDoubleParam ( kParamCoef3 );
3033
_squeeze = fetchDoubleParam ( kParamSqueeze );
3134
_asymmetric = fetchDouble2DParam ( kParamAsymmetric );
3235
_center = fetchDouble2DParam ( kParamCenter );
36+
_centerUnit = fetchChoiceParam ( kParamCenterUnit );
3337
_centerOverlay = fetchBooleanParam ( kParamCenterOverlay );
3438
_centerType = fetchChoiceParam ( kParamCenterType );
3539
_preScale = fetchDoubleParam ( kParamPreScale );
3640
_postScale = fetchDoubleParam ( kParamPostScale );
41+
_preOffset = fetchDouble2DParam ( kParamPreOffset );
42+
_postOffset = fetchDouble2DParam ( kParamPostOffset );
3743
_resizeRod = fetchChoiceParam ( kParamResizeRod );
3844
_resizeRodManualScale = fetchDoubleParam ( kParamResizeRodManualScale );
3945
_groupDisplayParams = fetchGroupParam ( kParamDisplayOptions );
@@ -53,6 +59,7 @@ void LensDistortPlugin::initParamsProps()
5359
changedParam( args, kParamFilter );
5460
changedParam( args, kParamLensType );
5561
changedParam( args, kParamResizeRod );
62+
changedParam( args, kParamNormalization );
5663
}
5764

5865
/**
@@ -70,38 +77,42 @@ void LensDistortPlugin::changedParam( const OFX::InstanceChangedArgs& args, cons
7077

7178
if( paramName == kParamLensType )
7279
{
73-
switch( _lensType->getValue() )
80+
switch( (EParamLensType)_lensType->getValue() )
7481
{
75-
case 0: // normal
76-
_coef2 -> setIsSecret( true );
77-
_coef2 -> setEnabled( false );
78-
_squeeze -> setIsSecret( true );
79-
_squeeze -> setEnabled( false );
80-
_asymmetric -> setIsSecret( true );
81-
_asymmetric -> setEnabled( false );
82+
case eParamLensTypeBrown1:
83+
_coef2 -> setIsSecretAndDisabled( true );
84+
_coef3 -> setIsSecretAndDisabled( true );
85+
_squeeze -> setIsSecretAndDisabled( true );
86+
_asymmetric -> setIsSecretAndDisabled( true );
8287
break;
83-
case 1: // fish-eye
84-
_coef2 ->setIsSecret( false );
85-
_coef2 -> setEnabled( true );
86-
_squeeze -> setIsSecret( true );
87-
_squeeze -> setEnabled( false );
88-
_asymmetric -> setIsSecret( true );
89-
_asymmetric -> setEnabled( false );
88+
case eParamLensTypeBrown3:
89+
_coef2 -> setIsSecretAndDisabled( false );
90+
_coef3 -> setIsSecretAndDisabled( false );
91+
_squeeze -> setIsSecretAndDisabled( true );
92+
_asymmetric -> setIsSecretAndDisabled( true );
9093
break;
91-
case 2: // advanced
92-
_coef2 -> setIsSecret( false );
93-
_coef2 -> setEnabled( true );
94-
_squeeze -> setIsSecret( false );
95-
_squeeze -> setEnabled( true );
96-
_asymmetric -> setIsSecret( false );
97-
_asymmetric -> setEnabled( true );
94+
case eParamLensTypePTLens:
95+
_coef2 -> setIsSecretAndDisabled( false );
96+
_coef3 -> setIsSecretAndDisabled( false );
97+
_squeeze -> setIsSecretAndDisabled( true );
98+
_asymmetric -> setIsSecretAndDisabled( true );
99+
break;
100+
case eParamLensTypeFisheye:
101+
_coef2 ->setIsSecretAndDisabled( true );
102+
_coef3 ->setIsSecretAndDisabled( true );
103+
_squeeze -> setIsSecretAndDisabled( true );
104+
_asymmetric -> setIsSecretAndDisabled( true );
98105
break;
99106
default:
100107
BOOST_THROW_EXCEPTION( exception::Bug()
101108
<< exception::user() + "Lens type value not recognize." );
102109
break;
103110
}
104111
}
112+
else if( paramName == kParamNormalization )
113+
{
114+
_focal->setIsSecretAndDisabled( _normalization->getValue() != eParamNormalizationFocal );
115+
}
105116
else if( paramName == kParamResizeRod )
106117
{
107118
if( _resizeRod->getValue() == eParamResizeRodManual )
@@ -129,10 +140,13 @@ bool LensDistortPlugin::isIdentity( const OFX::RenderArguments& args, OFX::Clip*
129140
{
130141
isIdentity = true;
131142
}
132-
else if( _coef1->getValue() == 0 /*_coef1->getDefault( )*/ &&
143+
else if( _coef1->getValue() == 0 &&
133144
_preScale->getValue() == _preScale->getDefault() &&
134145
_postScale->getValue() == _postScale->getDefault() &&
135-
( !_coef2->getIsEnable() || _coef2->getValue() == _coef2->getDefault() ) &&
146+
_preOffset->getValue() == _preOffset->getDefault() &&
147+
_postOffset->getValue() == _postOffset->getDefault() &&
148+
( !_coef2->getIsEnable() || _coef2->getValue() == 0 ) &&
149+
( !_coef3->getIsEnable() || _coef3->getValue() == 0 ) &&
136150
( !_squeeze->getIsEnable() || _squeeze->getValue() == _squeeze->getDefault() ) &&
137151
( !_asymmetric->getIsEnable() || _asymmetric->getValue() == _asymmetric->getDefault() ) )
138152
{
@@ -186,18 +200,18 @@ bool LensDistortPlugin::getRegionOfDefinition( const OFX::RegionOfDefinitionArgu
186200
pMax.x = std::min( tr.x, br.x );
187201
pMax.y = std::min( bl.y, br.y );
188202

189-
if( params._lensCenterSrc.x > srcRodInDstFrame.x1 && params._lensCenterSrc.x < srcRodInDstFrame.x2 )
203+
if( params.lensCenterSrc.x > srcRodInDstFrame.x1 && params.lensCenterSrc.x < srcRodInDstFrame.x2 )
190204
{
191-
Point2 t = transformValues( getLensType(), params, Point2( params._lensCenterSrc.x, srcRodInDstFrame.y1 ) );
205+
Point2 t = transformValues( getLensType(), params, Point2( params.lensCenterSrc.x, srcRodInDstFrame.y1 ) );
192206
pMin.y = std::max( pMin.y, t.y );
193-
Point2 b = transformValues( getLensType(), params, Point2( params._lensCenterSrc.x, srcRodInDstFrame.y2 ) );
207+
Point2 b = transformValues( getLensType(), params, Point2( params.lensCenterSrc.x, srcRodInDstFrame.y2 ) );
194208
pMax.y = std::min( pMax.y, b.y );
195209
}
196-
if( params._lensCenterSrc.y > srcRodInDstFrame.y1 && params._lensCenterSrc.y < srcRodInDstFrame.y2 )
210+
if( params.lensCenterSrc.y > srcRodInDstFrame.y1 && params.lensCenterSrc.y < srcRodInDstFrame.y2 )
197211
{
198-
Point2 l = transformValues( getLensType(), params, Point2( srcRodInDstFrame.x1, params._lensCenterSrc.y ) );
212+
Point2 l = transformValues( getLensType(), params, Point2( srcRodInDstFrame.x1, params.lensCenterSrc.y ) );
199213
pMin.x = std::max( pMin.x, l.x );
200-
Point2 r = transformValues( getLensType(), params, Point2( srcRodInDstFrame.x2, params._lensCenterSrc.y ) );
214+
Point2 r = transformValues( getLensType(), params, Point2( srcRodInDstFrame.x2, params.lensCenterSrc.y ) );
201215
pMax.x = std::min( pMax.x, r.x );
202216
}
203217
rod.x1 = pMin.x;
@@ -335,42 +349,90 @@ LensDistortProcessParams<LensDistortPlugin::Scalar> LensDistortPlugin::getProces
335349
double preScale = _preScale->getValue();
336350
double postScale = _postScale->getValue();
337351

338-
params._coef1 = _coef1->getValue();
352+
params.distort = _reverse->getValue();
339353

340-
if( params._coef1 >= 0 )
341-
params._distort = true; // distort
342-
else
343-
params._distort = false; // undistort
354+
params.coef1 = _coef1->getValue();
355+
params.coef2 = _coef2->getValue();
356+
params.coef3 = _coef3->getValue();
357+
params.squeeze = _squeeze->getValue();
358+
params.asymmetric = ofxToGil( _asymmetric->getValue() );
344359

345-
params._coef1 = std::abs( params._coef1 );
346-
params._coef2 = _coef2->getValue();
347-
params._squeeze = _squeeze->getValue();
348-
params._asymmetric = ofxToGil( _asymmetric->getValue() );
360+
params.preScale.x = params.preScale.y = 1.0 / preScale;
361+
params.postScale.x = params.postScale.y = 1.0 / postScale;
349362

350-
params._preScale.x = ( 1.0 / preScale );
351-
params._preScale.y = 1.0 / preScale;
363+
Point2 preOffset = ofxToGil(_preOffset->getValue());
364+
Point2 postOffset = ofxToGil(_postOffset->getValue());
352365

353-
params._postScale.x = ( 1.0 / postScale );
354-
params._postScale.y = 1.0 / postScale;
366+
if( reverse )
367+
{
368+
params.distort = !params.distort;
355369

356-
Point2 imgShift = Point2( inputRod.x1 - outputRod.x1, inputRod.y1 - outputRod.y1 ); // translate output -> source
357-
params._imgSizeSrc = Point2( choosedInputRod.x2 - choosedInputRod.x1, choosedInputRod.y2 - choosedInputRod.y1 );
358-
params._imgCenterSrc = Point2( params._imgSizeSrc.x * 0.5, params._imgSizeSrc.y * 0.5 );
359-
params._imgCenterDst = params._imgCenterSrc + imgShift;
360-
params._imgHalfDiagonal = std::sqrt( params._imgCenterSrc.x * params._imgCenterSrc.x * pixelAspectRatio * pixelAspectRatio + params._imgCenterSrc.y * params._imgCenterSrc.y );
361-
params._pixelRatio = pixelAspectRatio;
370+
// swap pre/post scale
371+
Point2 swapPoint = params.preScale;
372+
params.preScale = 1.0 / params.postScale;
373+
params.postScale = 1.0 / swapPoint;
374+
375+
// swap pre/post offset
376+
swapPoint = preOffset;
377+
preOffset = postOffset;
378+
postOffset = swapPoint;
379+
}
380+
381+
Point2 imgShift = Point2( inputRod.x1 - outputRod.x1, inputRod.y1 - outputRod.y1 ); // translate output -> source
382+
params.imgSizeSrc = Point2( choosedInputRod.x2 - choosedInputRod.x1, choosedInputRod.y2 - choosedInputRod.y1 );
383+
params.imgCenterSrc = Point2( params.imgSizeSrc.x * 0.5, params.imgSizeSrc.y * 0.5 );
384+
params.imgCenterDst = params.imgCenterSrc + imgShift;
385+
switch( (EParamNormalization)_normalization->getValue() )
386+
{
387+
case eParamNormalizationWidth:
388+
params.normalizeCoef = params.imgSizeSrc.x;
389+
break;
390+
case eParamNormalizationHeight:
391+
params.normalizeCoef = params.imgSizeSrc.y;
392+
break;
393+
case eParamNormalizationMinSize:
394+
params.normalizeCoef = std::min(params.imgSizeSrc.x, params.imgSizeSrc.y);
395+
break;
396+
case eParamNormalizationMaxSize:
397+
params.normalizeCoef = std::max(params.imgSizeSrc.x, params.imgSizeSrc.y);
398+
break;
399+
case eParamNormalizationDiagonal:
400+
params.normalizeCoef = std::sqrt( params.imgSizeSrc.x * params.imgSizeSrc.x + params.imgSizeSrc.y * params.imgSizeSrc.y );
401+
break;
402+
case eParamNormalizationHalfDiagonal:
403+
params.normalizeCoef = std::sqrt( params.imgCenterSrc.x * params.imgCenterSrc.x + params.imgCenterSrc.y * params.imgCenterSrc.y );
404+
break;
405+
case eParamNormalizationFocal:
406+
params.normalizeCoef = _focal->getValue();
407+
break;
408+
}
409+
params.pixelRatio = pixelAspectRatio;
362410

363411
switch( getCenterType() )
364412
{
365413
case eParamCenterTypeSource:
366414
{
367-
params._lensCenterSrc = pointNormalizedXXcToCanonicalXY( ofxToGil( _center->getValue() ), params._imgSizeSrc );
415+
switch( (EParamCenterUnit)_centerUnit->getValue() )
416+
{
417+
case eParamCenterUnitCenteredPixel:
418+
params.lensCenterSrc = ofxToGil( _center->getValue() ) + params.imgCenterSrc;
419+
break;
420+
case eParamCenterUnitPixel:
421+
params.lensCenterSrc = ofxToGil( _center->getValue() );
422+
break;
423+
case eParamCenterUnitCenteredNormWidth:
424+
params.lensCenterSrc = pointNormalizedXXcToCanonicalXY( ofxToGil( _center->getValue() ), params.imgSizeSrc );
425+
break;
426+
case eParamCenterUnitNormWidth:
427+
params.lensCenterSrc = pointNormalizedXXToCanonicalXY( ofxToGil( _center->getValue() ), params.imgSizeSrc );
428+
break;
429+
}
368430
if( useOptionalInputRod )
369431
{
370432
Point2 imgShiftBetweenInputs = Point2( optionalInputRod.x1 - inputRod.x1, optionalInputRod.y1 - inputRod.y1 ); // translate inputRod -> optionalInputRod
371-
params._lensCenterSrc += imgShiftBetweenInputs;
433+
params.lensCenterSrc += imgShiftBetweenInputs;
372434
}
373-
params._lensCenterDst = params._lensCenterSrc + imgShift;
435+
params.lensCenterDst = params.lensCenterSrc + imgShift;
374436
break;
375437
}
376438
case eParamCenterTypeRoW:
@@ -379,14 +441,9 @@ LensDistortProcessParams<LensDistortPlugin::Scalar> LensDistortPlugin::getProces
379441
break;
380442
}
381443
}
382-
if( _reverse->getValue() != reverse )
383-
{
384-
Point2 swapPreScale = params._preScale;
444+
params.lensCenterSrc -= preOffset;
445+
params.lensCenterDst += postOffset;
385446

386-
params._distort = !params._distort;
387-
params._preScale = 1.0 / params._postScale;
388-
params._postScale = 1.0 / swapPreScale;
389-
}
390447
return params;
391448
}
392449

plugins/image/process/geometry/LensDistort/src/LensDistortPlugin.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,21 @@ class LensDistortPlugin : public SamplerPlugin
4040
OFX::BooleanParam* _reverse; ///< reverse the effect
4141
OFX::BooleanParam* _displaySource; ///< do nothing (so host displays input)
4242
OFX::ChoiceParam* _lensType; ///< choice to select lens type
43+
OFX::ChoiceParam* _normalization;
44+
OFX::DoubleParam* _focal;
4345
OFX::DoubleParam* _coef1; ///< distortion coeffiscient
4446
OFX::DoubleParam* _coef2; ///< distortion coeffiscient for fish-eye lens
47+
OFX::DoubleParam* _coef3; ///< distortion coeffiscient for fish-eye lens
4548
OFX::DoubleParam* _squeeze; ///< squeeze coefficient horizontally/vertically (not implemented yet)
4649
OFX::Double2DParam* _asymmetric; ///< lens distortion is asymmetric horizontally/vertically (not implemented yet)
4750
OFX::Double2DParam* _center; ///< center coordonnates
51+
OFX::ChoiceParam* _centerUnit;
4852
OFX::BooleanParam* _centerOverlay; ///< lens center overlay
4953
OFX::ChoiceParam* _centerType; ///< centered the lens distortion on source RoD or image size (not implemented yet)
50-
OFX::DoubleParam* _postScale; ///< scale after applying the lens distortion
5154
OFX::DoubleParam* _preScale; ///< scale before applying the lens distortion
55+
OFX::DoubleParam* _postScale; ///< scale after applying the lens distortion
56+
OFX::Double2DParam* _preOffset;
57+
OFX::Double2DParam* _postOffset;
5258
OFX::ChoiceParam* _resizeRod; ///< Choice how to resize the RoD (default 'no' resize)
5359
OFX::DoubleParam* _resizeRodManualScale; ///< scale the output RoD
5460

0 commit comments

Comments
 (0)