00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "stdafx.h"
00016
00017 #include <cfl/resource.h>
00018
00019 #include <Camera/InterfaceDll.h>
00020
00021 #include <cfl/ScanFilterNCCFFT.h>
00022 #include <cfl/FilterDlg_NCCFFT.h>
00023 #include <cfl/ToolCilImage.h>
00024 #include <cil/Traits.h>
00025
00026 #include <cil/CorrelationImageFilter.h>
00027 #include <cil/correlation/BackgroundSubtractor.h>
00028 #include <cil/correlation/MeanSubtractor.h>
00029 #include <cil/correlation/NormalOperator.h>
00030 #include <cil/correlation/PhaseOperator.h>
00031 #include <cil/correlation/SimpleOptimizer.h>
00032 #include <cil/correlation/ScaleNormalizer.h>
00033 #include <cil/correlation/EnergyNormalizer.h>
00034 #include <cil/correlation/ZeroMeanNormalizer.h>
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifdef _DEBUG
00047 #undef THIS_FILE
00048 static char THIS_FILE[]=__FILE__;
00049 #define new DEBUG_NEW
00050 #endif
00051
00052
00053
00054
00055
00056 #define CFL_SCHEMAVERSION_FILTERNCCFFT 0
00057 // this filter's name
00058 LPCTSTR CScanFilterNCCFFT::m_lpcsFilterName = _T("FNCC");
00059
00060 LPCTSTR CScanFilterNCCFFT::m_lpcsShortFilterName = CScanFilterNCCFFT::m_lpcsFilterName;
00061
00062 IMPLEMENT_SERIAL(CScanFilterNCCFFT, CScanFilter, CFL_SCHEMAVERSION_FILTERNCCFFT)
00063
00064
00065
00066
00067 const CScanFilterNCCFFT::ScaleType CScanFilterNCCFFT::m_defScale = 1000;
00068
00069
00070
00071
00072
00073 CScanFilterNCCFFT::CScanFilterNCCFFT()
00074 : m_lpsbIn2( NULL )
00075 {
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 m_csFilterName = m_lpcsFilterName;
00092
00093 ReadFilterSettings();
00094 }
00095
00096
00097
00098
00099 CScanFilterNCCFFT::~CScanFilterNCCFFT()
00100 {
00101
00102
00103 ;
00104 }
00105
00106
00107
00108
00109
00110
00111 void CScanFilterNCCFFT::Serialize(CArchive& ar)
00112 {
00113
00114
00115 CScanFilter::Serialize( ar );
00116
00117 if ( ar.IsStoring() )
00118 {
00119
00120 }
00121 else
00122 {
00123
00124
00125
00126
00127
00128 }
00129 };
00130
00131
00132
00133
00134
00135 void CScanFilterNCCFFT::ReadFilterSettings()
00136 {
00137
00138
00139 CWinApp* pApp = AfxGetApp();
00140
00141 if ( Q_INVALID( NULL == pApp ) )
00142 return ;
00143
00144
00145
00146
00147 SetParameters( pApp->GetProfileString( gCflRegistrySubkey, m_lpcsFilterName, _T( "1,0,0,1e-6,1000,1000" ) ) );
00148 }
00149
00150
00151
00152
00153
00154 void CScanFilterNCCFFT::WriteFilterSettings() const
00155 {
00156
00157
00158 CWinApp* pApp = AfxGetApp();
00159
00160 if ( Q_INVALID( NULL == pApp ) )
00161 return ;
00162
00163
00164
00165
00166 LPCTSTR pStr = GetParameters();
00167
00168 if ( pStr )
00169 {
00170 pApp->WriteProfileString( gCflRegistrySubkey, m_lpcsFilterName, pStr );
00171 delete const_cast<LPTSTR>( pStr );
00172 }
00173 }
00174
00175
00176
00177
00178
00179
00180 LPCTSTR CScanFilterNCCFFT::GetParameters() const
00181 {
00182
00183
00184
00185
00186
00187 CString csParameters;
00188
00189 csParameters.Format
00190 ( _T( "%d,%d,%d,%d,%g,%g,%g" )
00191 , GetSubtractionType()
00192 , GetNormalizationType()
00193 , GetNormalizationSubType()
00194 , DoRelaxFFTSize()
00195 , GetScale( nmNone )
00196 , GetScale( nmNormal )
00197 , GetScale( nmPhase )
00198 );
00199
00200 return strcpy( new TCHAR[ csParameters.GetLength() + 1 ], csParameters );
00201 }
00202
00203
00204
00205
00206
00207 BOOL CScanFilterNCCFFT::SetParameters( LPCTSTR lpParameters )
00208 {
00209
00210
00211 if ( Q_INVALID( NULL == lpParameters && "CScanFilterNCCFFT (SetParameters): parameters expected, none provided (NULL)." ) )
00212 {
00213 return FALSE;
00214 }
00215
00216
00217
00218
00219 int subtract = bgMean;
00220 int norm = nmNormal;
00221 int normsub = nsEnergy;
00222 int relax = false;
00223 double scale0 = 1e-6;
00224 double scale1 = m_defScale;
00225 double scale2 = m_defScale;
00226
00227 int nfields = _stscanf
00228 ( lpParameters
00229 , _T( "%d,%d,%d,%d,%lg,%lg,%lg" )
00230 , &subtract
00231 , &norm
00232 , &normsub
00233 , &relax
00234 , &scale0
00235 , &scale1
00236 , &scale2
00237 );
00238
00239 m_subtract = static_cast< SubtractionType > ( subtract );
00240 m_norm = static_cast< NormalizationType > ( norm );
00241 m_normsub = static_cast< NormalizationSubType >( normsub );
00242 m_relax_fft_size = 0 != relax;
00243 m_scale[0] = scale0;
00244 m_scale[1] = scale1;
00245 m_scale[2] = scale2;
00246
00247 if ( Q_INVALID( 7 > nfields && "CScanFilterNCCFFT (SetParameters): FIXME parameters expected, got less." ) )
00248 {
00249 return FALSE;
00250 }
00251
00252 return TRUE;
00253 }
00254
00255
00256
00257
00258 DWORD CScanFilterNCCFFT::GetNrOfInBuffers() const
00259 {
00260 return 2;
00261 }
00262
00263
00264
00265
00266 CScanBaseBuffer *CScanFilterNCCFFT::GetInputBuffer( UINT nNr )
00267 {
00268 Q_ASSERT( 0 <= nNr && nNr < GetNrOfInBuffers() && "ensure valid input buffer nr" );
00269
00270 if ( 1 == nNr )
00271 {
00272 return m_lpsbIn2;
00273 }
00274
00275 return m_lpsbIn;
00276 }
00277
00278
00279
00280
00281 void CScanFilterNCCFFT::SetInputBuffer( UINT nNr, CScanBaseBuffer *lpsbIn )
00282 {
00283 Q_ASSERT( 0 <= nNr && nNr < GetNrOfInBuffers() && "ensure valid input buffer nr" );
00284 Q_ASSERT( NULL != lpsbIn && "ensure valid input buffer" );
00285
00286 if ( 0 == nNr )
00287 {
00288 m_lpsbIn = lpsbIn;
00289 }
00290 else if ( 1 == nNr )
00291 {
00292 m_lpsbIn2 = lpsbIn;
00293 }
00294 }
00295
00296
00297
00298
00299
00300 BOOL CScanFilterNCCFFT::RunModeless( CWnd* pParentWnd, CDocument* pDoc )
00301 {
00302
00303
00304 CFilterDlg_NCCFFTPtr pDlg = new CFilterDlg_NCCFFT();
00305
00306 if ( Q_INVALID( NULL == pDlg ) )
00307 return FALSE;
00308
00309 pDlg->SetParameters( this, pDoc );
00310
00311
00312
00313
00314
00315 pDlg->Create( IDD_FILTERDLG_NCCFFT, pParentWnd );
00316
00317 m_pDlg = pDlg;
00318
00319 BOOL bRet = Apply();
00320
00321 if ( bRet )
00322 {
00323 pDlg->UpdateView();
00324 }
00325
00326 return bRet;
00327 }
00328
00329
00330
00331
00332
00333
00334 #include <cil/ImageFill.h>
00335 BOOL CScanFilterNCCFFT::Apply()
00336 {
00337
00338
00339 if ( Q_INVALID( NULL == m_lpsbIn && "ensure first input buffer") )
00340 return FALSE;
00341
00342 if ( Q_INVALID( NULL == m_lpsbIn2 && "ensure second input buffer" ) )
00343 return FALSE;
00344
00345 if ( Q_INVALID( NULL == m_lpsbOut && "ensure output buffer" ) )
00346 return FALSE;
00347
00348 if ( Q_INVALID( !m_lpsbIn->IsCompleteFrame() && "ensure complete frame" ) )
00349 return FALSE;
00350
00351 if ( Q_INVALID( !m_lpsbIn2->IsCompleteFrame() && "ensure complete frame" ) )
00352 return FALSE;
00353
00354
00355
00356
00357 Q_RETURN( m_lpsbOut->CreateOutputBufferFor( *m_lpsbIn ) );
00358
00359 m_lpsbOut->m_csBufferName.Format
00360 ( _T("%s - %s")
00361 , m_lpsbIn->m_csBufferName
00362 , m_lpcsShortFilterName
00363 );
00364
00365 if ( IsInteractive() )
00366 {
00367 m_pDlg->SetDlgItemText( IDC_BUFFEROUTNAME, m_lpsbOut->m_csBufferName );
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377 typedef cil::Image< InputPixelType > InputImageType;
00378 typedef cil::Image< OutputPixelType > OutputImageType;
00379
00380 typedef cil::CorrelationImageFilter
00381 < const InputImageType
00382 , const InputImageType
00383 , OutputImageType > FilterType;
00384
00385 typedef cil::correlation::MeanSubtractor < FilterType > MeanSubtractorType;
00386 typedef cil::correlation::BackgroundSubtractor< FilterType > BackgroundSubtractorType;
00387
00388 typedef cil::correlation::NormalOperator < FilterType > NormalOperatorType;
00389 typedef cil::correlation::PhaseOperator < FilterType > PhaseOperatorType;
00390 typedef cil::correlation::EnergyNormalizer < FilterType > EnergyNormalizerType;
00391 typedef cil::correlation::ZeroMeanNormalizer < FilterType > ZeroMeanNormalizerType;
00392 typedef cil::correlation::ScaleNormalizer < FilterType > ScaleNormalizerType;
00393
00394 FilterType filter;
00395 filter.SetRelaxFFTSize( DoRelaxFFTSize() );
00396
00397
00398
00399
00400 switch ( GetSubtractionType() )
00401 {
00402 case bgMean:
00403 filter.SetSubtractor( MeanSubtractorType::New() );
00404 break;
00405 case bgBackground:
00406 filter.SetSubtractor( BackgroundSubtractorType::New() );
00407 break;
00408 default:
00409 filter.SetSubtractor( );
00410 break;
00411 };
00412
00413
00414
00415
00416 switch ( GetNormalizationType() )
00417 {
00418 case nmNormal:
00419 filter.SetOperator( NormalOperatorType::New() );
00420
00421
00422
00423
00424 switch ( GetNormalizationSubType() )
00425 {
00426 case nsEnergy:
00427 {
00428 EnergyNormalizerType::Pointer normalizer = EnergyNormalizerType::New();
00429 normalizer->SetScale( GetScale( GetNormalizationType() ) );
00430 filter.SetNormalizer( normalizer );
00431 break;
00432 }
00433 case nsZeroMean:
00434 {
00435 ZeroMeanNormalizerType::Pointer normalizer = ZeroMeanNormalizerType::New();
00436 normalizer->SetScale( GetScale( GetNormalizationType() ) );
00437 filter.SetNormalizer( normalizer );
00438 break;
00439 }
00440 default:
00441 {
00442
00443
00444
00445 break;
00446 }
00447 };
00448 break;
00449
00450 case nmPhase: default: {
00451 if ( nmPhase == GetNormalizationType() )
00452 {
00453 filter.SetOperator( PhaseOperatorType::New() );
00454 }
00455 else
00456 {
00457 filter.SetOperator( NormalOperatorType::New() );
00458 }
00459
00460 ScaleNormalizerType::Pointer normalizer = ScaleNormalizerType::New();
00461 normalizer->SetScale( GetScale( GetNormalizationType() ) );
00462 filter.SetNormalizer( normalizer );
00463 break;
00464 }
00465 };
00466
00467
00468 filter.Apply( ToImage( m_lpsbIn2 ), ToImage( m_lpsbIn ), ToImage( m_lpsbOut ) );
00469
00470
00471
00472
00473 if ( m_lpsbIn->IsBidirectionalScan() && m_lpsbOut->IsBidirectionalScan() )
00474 {
00475
00476 filter.Apply( ToImage( m_lpsbIn2, true ), ToImage( m_lpsbIn, true ), ToImage( m_lpsbOut, true ) );
00477 }
00478
00479
00480
00481
00482 m_lpsbOut->m_dwParameterMask = 0;
00483
00484 return TRUE;
00485 }
00486
00487
00488
00489
00490