CppNCorr
C++ ncorr Digital Image Correlation engine
Loading...
Searching...
No Matches
ncorr.h
Go to the documentation of this file.
1/*
2 * File: ncorr.h
3 * Author: justin
4 *
5 * Created on May 12, 2015, 1:33 AM
6 */
7
8#ifndef NCORR_H
9#define NCORR_H
10
11#include "Array2D.h"
12#include "Image2D.h"
13#include "ROI2D.h"
14#include "Data2D.h"
15#include "Disp2D.h"
16#include "Strain2D.h"
17
18namespace ncorr {
19
20namespace details {
21 // Nonlinear optimization ------------------------------------------------//
23 public:
24 typedef std::ptrdiff_t difference_type;
25 typedef std::pair<difference_type,difference_type> coords;
26
27 // Rule of 5 and destructor --------------------------------------//
28 nloptimizer_base() noexcept = default;
31 nloptimizer_base& operator=(const nloptimizer_base&) = default;
32 nloptimizer_base& operator=(nloptimizer_base&&) = default;
33 virtual ~nloptimizer_base() noexcept = default;
34
35 // Additional Constructors ---------------------------------------//
37 grad_buf(order,1), hess_buf(order,order), params(num_params,1) { }
38
39 // Arithmetic operations -----------------------------------------//
40 std::pair<const Array2D<double>&, bool> global(const Array2D<double>&) const;
41 std::pair<const Array2D<double>&, bool> operator()(const Array2D<double>&) const;
42
43 protected:
44 // Arithmetic operations -----------------------------------------//
45 virtual bool initial_guess() const = 0;
46 virtual bool iterative_search() const = 0;
47 virtual bool newton() const = 0;
48
49 // Utility -------------------------------------------------------//
50 void chk_input_params_size(const Array2D<double>&) const;
51
55 double cutoff_norm = 1e-6;
57 };
58
59 class disp_nloptimizer final : public nloptimizer_base {
60 public:
63
64 // Rule of 5 and destructor --------------------------------------//
65 disp_nloptimizer() noexcept : region_idx() { }
70 ~disp_nloptimizer() noexcept = default;
71
72 // Additional Constructors ---------------------------------------//
73 // Note: params = {p1_new, p2_new, p1_old, p2_old, v_old, u_old, dv_dp1_old, dv_dp2_old, du_dp1_old, du_dp2_old, dist, grad_norm}
74 disp_nloptimizer(const Disp2D &disp, difference_type region_idx, INTERP interp_type) :
75 nloptimizer_base(2, 12), disp(disp), region_idx(region_idx), disp_interp(disp.get_nlinfo_interpolator(region_idx, interp_type)) { }
76
77 private:
78 // Arithmetic operations -----------------------------------------//
79 bool initial_guess() const override;
80 bool iterative_search() const override;
81 bool newton() const override;
82
83 Disp2D disp; // immutable - Disp2D has pointer semantics
84 difference_type region_idx;
85 Disp2D::nlinfo_interpolator disp_interp; // Have copy
86 };
87
89 public:
92
93 // Rule of 5 and destructor --------------------------------------//
94 subregion_nloptimizer() noexcept : scalefactor(), ref_template_avg(), ref_template_ssd_inv(), last_iteration_count(0) { }
99 ~subregion_nloptimizer() noexcept = default;
100
101 // getters -------------------------------------------------------//
102 const ROI2D::contig_subregion_generator& get_subregion_gen() const { return this->subregion_gen; }
103 int get_last_iteration_count() const { return last_iteration_count; }
104
105
106 // Additional Constructors ---------------------------------------//
107 // Note: params = {p1, p2, v, u, dv_dp1, dv_dp2, du_dp1, du_dp2, corr_coef, diff_norm}
109
110 private:
111 // Arithmetic operations -----------------------------------------//
112 bool initial_guess() const override;
113 bool iterative_search() const override;
114 bool newton() const override;
115
116 std::shared_ptr<Array2D<double>> A_ref_ptr; // Allows R-value arrays; immutable
117 std::shared_ptr<Array2D<double>> A_cur_ptr; // Allows R-value arrays; immutable
118 difference_type scalefactor;
119 Array2D<double>::interpolator A_cur_interp; // Have copy
120 ROI2D::contig_subregion_generator subregion_gen; // Have copy
121 // Buffers for NCC:
122 std::shared_ptr<Array2D<double>> A_cur_cumsum_p1_ptr; // immutable
123 std::shared_ptr<Array2D<double>> A_cur_pow_cumsum_p1_ptr; // immutable
124 mutable Array2D<double> A_ref_template; // Have copy
125 // Buffers for inverse compositional gauss newton method:
126 std::shared_ptr<Array2D<double>> A_dref_dp1_ptr; // immutable
127 std::shared_ptr<Array2D<double>> A_dref_dp2_ptr; // immutable
128 mutable double ref_template_avg;
129 mutable double ref_template_ssd_inv;
130 // Steepest descent images:
131 mutable Array2D<double> A_dref_dv; // Have copy
132 mutable Array2D<double> A_dref_du; // Have copy
133 mutable Array2D<double> A_dref_dv_dp1; // Have copy
134 mutable Array2D<double> A_dref_dv_dp2; // Have copy
135 mutable Array2D<double> A_dref_du_dp1; // Have copy
136 mutable Array2D<double> A_dref_du_dp2; // Have copy
137 // Linsolver for hessian
138 mutable Array2D<double>::linsolver hess_linsolver; // Have copy
139 // Cur template buffer
140 mutable Array2D<double> A_cur_template; // Have copy
141 // Iteration tracking for MATLAB-style saturation check
142 mutable int last_iteration_count; // Track actual iterations
143 };
144}
145
146// Interface functions -------------------------------------------------------//
147// ROI update modes:
148// - SKIP_ALL: Original behavior - if ANY boundary point returns NaN, the entire
149// boundary is discarded (returns empty ROI on failure)
150// - SKIP_INVALID: Skip individual NaN points and out-of-bounds points, keeping
151// valid points. Only returns empty if ALL points are invalid.
153
154// Accumulation modes:
155// - ON_THE_FLY: Original C++ behavior - accumulate displacements during analysis.
156// Fast but can fail when ROI changes shape during updates.
157// - POST_PROCESS: MATLAB-like approach - store individual step displacements,
158// then add them all at the end with their matching ROIs.
159// More robust when ROI updates occur frequently.
161
162ROI2D update(const ROI2D&, const Disp2D&, INTERP, ROI_UPDATE_MODE mode = ROI_UPDATE_MODE::SKIP_ALL);
163ROI2D matlab_update_roi(const ROI2D&, const Disp2D&, INTERP, ROI2D::difference_type radius);
164
165Data2D update(const Data2D&, const Disp2D&, INTERP, ROI_UPDATE_MODE mode = ROI_UPDATE_MODE::SKIP_ALL);
166
167// Original add function - combines displacements using first disp's ROI
168Disp2D add(const std::vector<Disp2D>&, INTERP);
169
170// MATLAB-style add function - combines displacements using each disp's own ROI for bounds checking
171Disp2D add_with_rois(const std::vector<Disp2D>& disps, const std::vector<ROI2D>& rois, INTERP interp_type);
172
173// DIC_analysis --------------------------------------------------------------//
174Disp2D RGDIC(const Array2D<double>&, const Array2D<double>&, const ROI2D&, ROI2D::difference_type, INTERP, SUBREGION, ROI2D::difference_type, ROI2D::difference_type, double, bool);
175
177
178struct DIC_analysis_input final {
180
181 // Rule of 5 and destructor ----------------------------------------------//
187 ~DIC_analysis_input() noexcept = default;
188
189 // Additional constructors -----------------------------------------------//
218
219 // Constructor with config - can optionally override roi_update_mode and accumulation_mode
221 ROI_UPDATE_MODE roi_update_mode_override = static_cast<ROI_UPDATE_MODE>(-1),
222 ACCUMULATION_MODE accumulation_mode_override = static_cast<ACCUMULATION_MODE>(-1),
223 bool save_disps_steps_override = false);
224
225 // Static factory methods ------------------------------------------------//
226 static DIC_analysis_input load(std::ifstream&);
227 static DIC_analysis_input load(const std::string&);
228
229 // Interface functions ---------------------------------------------------//
230 friend void save(const DIC_analysis_input&, std::ofstream&);
231 friend void save(const DIC_analysis_input&, const std::string&);
232
233 std::vector<Image2D> imgs;
243 ROI_UPDATE_MODE roi_update_mode; // Mode for ROI boundary update (SKIP_ALL or SKIP_INVALID)
244 ACCUMULATION_MODE accumulation_mode; // Mode for displacement accumulation (ON_THE_FLY or POST_PROCESS)
245 bool save_disps_steps; // If true, save step displacements data for debugging (enforced when debug=true)
246 bool debug;
247};
248
250
253
254 // Rule of 5 and destructor ----------------------------------------------//
260 ~DIC_analysis_output() noexcept = default;
261
262 // Additional constructors -----------------------------------------------//
265
266 // Static factory methods ------------------------------------------------//
267 static DIC_analysis_output load(std::ifstream&);
268 static DIC_analysis_output load(const std::string&);
269
270 // Interface functions ---------------------------------------------------//
271 friend void save(const DIC_analysis_output&, std::ofstream&);
272 friend void save(const DIC_analysis_output&, const std::string&);
273
274 std::vector<Disp2D> disps;
276 std::string units;
278};
279
280// Step displacement data for debugging and analysis
283
284 // Rule of 5 and destructor
290 ~DIC_analysis_step_data() noexcept = default;
291
292 // Static factory methods
293 static DIC_analysis_step_data load(std::ifstream&);
294 static DIC_analysis_step_data load(const std::string&);
295
296 // Interface functions
297 friend void save(const DIC_analysis_step_data&, std::ofstream&);
298 friend void save(const DIC_analysis_step_data&, const std::string&);
299
300 // Step displacements: step_disps[i] = displacement from frame step_ref_idx[i] to frame i+1
301 std::vector<Disp2D> step_disps;
302 // ROIs used when computing each step displacement
303 std::vector<ROI2D> step_rois;
304 // Reference frame index for each step
306};
307
310
311// Seed-based parallel DIC analysis ------------------------------------------//
312struct SeedParams final {
314
315 // Seed position in the reference image
318
319 // Displacement and deformation gradient (9 parameters total)
320 double u; // displacement in x
321 double v; // displacement in y
322 double du_dx; // deformation gradient
323 double du_dy;
324 double dv_dx;
325 double dv_dy;
326 double corrcoef; // correlation coefficient (quality metric)
327
328 // Constructors
329 SeedParams() : x(0), y(0), u(0.0), v(0.0), du_dx(0.0), du_dy(0.0), dv_dx(0.0), dv_dy(0.0), corrcoef(0.0) { }
331 x(x), y(y), u(0.0), v(0.0), du_dx(0.0), du_dy(0.0), dv_dx(0.0), dv_dy(0.0), corrcoef(0.0) { }
332
333 // Convert to Array2D format compatible with RGDIC functions
334 // params = {p1, p2, v, u, dv_dp1, dv_dp2, du_dp1, du_dp2, corr_coef, diff_norm}
335 // Note: p1=y (row), p2=x (col), and gradients map: dv_dp1=dv_dy, dv_dp2=dv_dx, du_dp1=du_dy, du_dp2=du_dx
336 Array2D<double> to_array(double diff_norm = 0.0) const {
337 Array2D<double> params(10, 1);
338 params(0) = static_cast<double>(y); // p1 (row)
339 params(1) = static_cast<double>(x); // p2 (col)
340 params(2) = v; // v displacement
341 params(3) = u; // u displacement
342 params(4) = dv_dy; // dv_dp1
343 params(5) = dv_dx; // dv_dp2
344 params(6) = du_dy; // du_dp1
345 params(7) = du_dx; // du_dp2
346 params(8) = corrcoef; // correlation coefficient
347 params(9) = diff_norm; // difference norm (convergence metric)
348 return params;
349 }
350
351 // Create SeedParams from Array2D format
352 static SeedParams from_array(const Array2D<double>& params) {
353 SeedParams seed;
354 seed.y = static_cast<difference_type>(params(0)); // p1 (row)
355 seed.x = static_cast<difference_type>(params(1)); // p2 (col)
356 seed.v = params(2);
357 seed.u = params(3);
358 seed.dv_dy = params(4); // dv_dp1
359 seed.dv_dx = params(5); // dv_dp2
360 seed.du_dy = params(6); // du_dp1
361 seed.du_dx = params(7); // du_dp2
362 seed.corrcoef = params(8);
363 return seed;
364 }
365};
366
367struct SeedConvergence final {
369 double diffnorm;
370
371 SeedConvergence() : num_iterations(0), diffnorm(0.0) { }
372 SeedConvergence(int iter, double norm) : num_iterations(iter), diffnorm(norm) { }
373};
374
375struct SeedAnalysisResult final {
376 std::vector<SeedParams> seeds;
377 std::vector<SeedConvergence> convergence;
379
380 SeedAnalysisResult() : success(false) { }
381};
382
383// Lightweight seed analysis for predicting reference updates
384SeedAnalysisResult analyze_seeds(
385 const details::subregion_nloptimizer &sr_nloptimizer,
386 const Array2D<double>& ref_gs,
387 const ROI2D& roi,
388 const std::vector<SeedParams>& seed_positions,
390 int cutoff_iteration,
391 double cutoff_max_diffnorm,
392 double cutoff_max_corrcoef,
393 bool debug = true
394);
395
396// Structure to hold precomputed seed data for each frame
398 ROI2D roi; // Updated ROI for this frame
399 std::vector<SeedParams> seed_params_by_region; // One seed param per region
401
403 SeedComputationData(const ROI2D& roi, const std::vector<SeedParams>& params, const details::subregion_nloptimizer &sr_nloptimizer) :
404 roi(roi), seed_params_by_region(params), sr_nloptimizer(sr_nloptimizer) { }
405};
406
407// Compute seed parameters for all frames with ROI updates
408// Returns precomputed data (roi, seed_params) for each successfully analyzed frame
409std::vector<SeedComputationData> compute_only_seed_points(
410 const Array2D<double>& A_ref,
411 const std::vector<Array2D<double>>& A_curs,
412 const ROI2D& roi,
413 ROI2D::difference_type scalefactor,
414 INTERP interp_type,
415 SUBREGION subregion_type,
416 const std::vector<SeedParams>& seeds_by_region, // One seed per region
417 double cutoff_corrcoef,
418 ROI2D::difference_type region_idx = 0,
419 bool debug = false
420);
421
422// Compute displacements using precomputed seed parameters
424 const details::subregion_nloptimizer &sr_nloptimizer,
425 const ROI2D& roi_reduced,
426 const SeedParams& seedparams,
427 ROI2D::difference_type scalefactor,
428 double cutoff_corrcoef,
429 ROI2D::difference_type region_idx,
430 bool debug
431) ;
432
433// Update seed positions based on displacement (seed propagation)
434std::vector<SeedParams> propagate_seeds(
435 const std::vector<SeedParams>& seeds,
437);
438
441
442 // Base DIC input parameters
444
445 // Seed parameters (one per region - provided by user, not generated)
446 std::vector<SeedParams> seeds_by_region;
447
448 // Whether seeds are already optimized (skip optimization step if true)
450
451 // Seed-based parallelization parameters
452 double cutoff_max_diffnorm; // Diffnorm threshold for failure prediction
453 double cutoff_max_corrcoef; // Corrcoef threshold for failure prediction
454
455 // Constructors
456 DIC_analysis_parallel_input() : seeds_are_optimized(false), cutoff_max_diffnorm(0.1), cutoff_max_corrcoef(0.5) { }
457
458 DIC_analysis_parallel_input(const DIC_analysis_input& base, const std::vector<SeedParams>& seeds, bool optimized = false) :
459 base_input(base), seeds_by_region(seeds), seeds_are_optimized(optimized),
460 cutoff_max_diffnorm(0.1), cutoff_max_corrcoef(0.5) { }
461};
462
463// Parallel DIC analysis using seed-based failure prediction
464DIC_analysis_output DIC_analysis_parallel(const DIC_analysis_parallel_input&);
465
466// Matlab-ABR-style DIC analysis using a fixed reference, manual/preset seeds,
467// seed-analysis first, then DIC evaluation.
468DIC_analysis_output matlab_DIC_analysis_parallel(const DIC_analysis_parallel_input&);
469
470// Sequential DIC analysis with user-provided seeds
471DIC_analysis_output DIC_analysis_sequential(
472 const DIC_analysis_input& DIC_input,
473 const std::vector<SeedParams>& seeds_by_region = {},
474 bool seeds_are_optimized = false
475);
476
477DIC_analysis_output DIC_analysis_sequential(const DIC_analysis_parallel_input&);
478
479// Sequential Matlab-ABR-style DIC analysis with user-provided seeds.
480DIC_analysis_output matlab_DIC_analysis_sequential(
481 const DIC_analysis_input& DIC_input,
482 const std::vector<SeedParams>& seeds_by_region = {},
483 bool seeds_are_optimized = false
484);
485
486DIC_analysis_output matlab_DIC_analysis_sequential(const DIC_analysis_parallel_input&);
487
488// Exact MATLAB-ncorr-mirroring DIC analysis. Same seed/segment pipeline as
489// matlab_DIC_analysis_*, but the multi-reference chain composition uses
490// exact_add_with_rois(), which mirrors ncorr_alg_addanalysis + ncorr_alg_adddisp:
491// - per-region extrapolation via expand_filt (4-neighbor mean iteration)
492// - biquintic B-spline interpolation on the extrapolated plot
493// - reduced-grid walk with strict in_nlinfo mask check
494// This fixes the chain-induced jump at the first segment boundary that
495// add_with_rois() exhibited (see seam diagnostics in matlab_DIC_analysis_*).
496DIC_analysis_output exact_matlab_DIC_analysis_parallel(const DIC_analysis_parallel_input&);
497DIC_analysis_output exact_matlab_DIC_analysis_sequential(
498 const DIC_analysis_input& DIC_input,
499 const std::vector<SeedParams>& seeds_by_region = {},
500 bool seeds_are_optimized = false
501);
502DIC_analysis_output exact_matlab_DIC_analysis_sequential(const DIC_analysis_parallel_input&);
503
504// MATLAB-style chain composition: extrapdata + biquintic + reduced-grid walk.
505Disp2D exact_add_with_rois(const std::vector<Disp2D>& disps,
506 const std::vector<ROI2D>& rois);
507
508// RGDIC with user-provided seeds (single frame pair)
509Disp2D RGDIC_with_seeds(const Array2D<double>& A_ref,
510 const Array2D<double>& A_cur,
511 const ROI2D& roi,
512 const DIC_analysis_parallel_input& input);
513
514// Conversion between Lagrangian and Eulerian displacements ------------------//
515DIC_analysis_output change_perspective(const DIC_analysis_output&, INTERP);
516
517// Conversion with Matlab-compatible sign inversion for Eulerian perspective -//
518DIC_analysis_output change_perspective_with_inversion(const DIC_analysis_output&, INTERP);
519
520// set units -----------------------------------------------------------------//
521DIC_analysis_output set_units(const DIC_analysis_output&, const std::string&, double);
522
523// Correlation filtering -----------------------------------------------------//
524DIC_analysis_output filter_by_correlation(const DIC_analysis_output&, double);
525
526// strain_analysis -----------------------------------------------------------//
527Strain2D LS_strain(const Disp2D&, PERSPECTIVE, double, SUBREGION, ROI2D::difference_type);
528
531
532 // Rule of 5 and destructor ----------------------------------------------//
538 ~strain_analysis_input() noexcept = default;
539
540 // Additional constructors -----------------------------------------------//
542 const DIC_analysis_output &DIC_output,
543 SUBREGION subregion_type,
544 difference_type r) : DIC_input(DIC_input),
545 DIC_output(DIC_output),
546 subregion_type(subregion_type),
547 r(r){ }
548
549 // Static factory methods ------------------------------------------------//
550 static strain_analysis_input load(std::ifstream&);
551 static strain_analysis_input load(const std::string&);
552
553 // Interface functions ---------------------------------------------------//
554 friend void save(const strain_analysis_input&, std::ofstream&);
555 friend void save(const strain_analysis_input&, const std::string&);
556
561};
562
565
566 // Rule of 5 and destructor ----------------------------------------------//
572 ~strain_analysis_output() noexcept = default;
573
574 // Additional constructors -----------------------------------------------//
575 strain_analysis_output(const std::vector<Strain2D> &strains) : strains(strains) { }
576
577 // Static factory methods ------------------------------------------------//
578 static strain_analysis_output load(std::ifstream&);
579 static strain_analysis_output load(const std::string&);
580
581 // Interface functions ---------------------------------------------------//
582 friend void save(const strain_analysis_output&, std::ofstream&);
583 friend void save(const strain_analysis_output&, const std::string&);
584
585 std::vector<Strain2D> strains;
586};
587
589
590// Interface functions for viewing and saving ncorr related data -------------//
592
593void save_ncorr_data_over_img(const std::string&,
594 const Image2D&,
595 const Data2D&,
596 double,
597 double,
598 double,
599 bool,
600 bool,
601 bool,
602 const std::string&,
603 double,
604 double,
605 double,
607 int);
608
609void save_ncorr_data_over_img_video(const std::string&,
610 const std::vector<Image2D>&,
611 const std::vector<Data2D>&,
612 double,
613 double,
614 double,
615 double,
616 bool,
617 bool,
618 bool,
619 const std::string&,
620 double,
621 double,
622 double,
624 int,
625 double,
626 int);
627
628enum class DISP { U, V };
629void save_DIC_video(const std::string&,
630 const DIC_analysis_input&,
631 const DIC_analysis_output&,
632 DISP,
633 double,
634 double,
635 double = std::numeric_limits<double>::quiet_NaN(),
636 double = std::numeric_limits<double>::quiet_NaN(),
637 bool = true,
638 bool = true,
639 bool = true,
640 double = -1.0,
641 double = 1.0,
643 int = cv::COLORMAP_JET,
644 double = 2.0,
645 int = cv::VideoWriter::fourcc('M','J','P','G'));
646
647enum class STRAIN { EYY, EXY, EXX };
648void save_strain_video(const std::string&,
649 const strain_analysis_input&,
650 const strain_analysis_output&,
651 STRAIN,
652 double,
653 double,
654 double = std::numeric_limits<double>::quiet_NaN(),
655 double = std::numeric_limits<double>::quiet_NaN(),
656 bool = true,
657 bool = true,
658 bool = true,
659 double = -1.0,
660 double = 1.0,
662 int = cv::COLORMAP_JET,
663 double = 2.0,
664 int = cv::VideoWriter::fourcc('M','J','P','G'));
665// ---------------------------------------------------------------------------//
666
667}
668
669#endif /* NCORR_H */
details::Disp2D_nlinfo_interpolator nlinfo_interpolator
Definition Disp2D.h:29
std::ptrdiff_t difference_type
Definition ROI2D.h:31
disp_nloptimizer(disp_nloptimizer &&)=default
~disp_nloptimizer() noexcept=default
disp_nloptimizer & operator=(const disp_nloptimizer &)=default
disp_nloptimizer(const disp_nloptimizer &)=default
nloptimizer_base::difference_type difference_type
Definition ncorr.h:61
disp_nloptimizer & operator=(disp_nloptimizer &&)=default
nloptimizer_base::coords coords
Definition ncorr.h:62
Array2D< double > grad_buf
Definition ncorr.h:52
void chk_input_params_size(const Array2D< double > &) const
Definition ncorr.cpp:49
std::ptrdiff_t difference_type
Definition ncorr.h:24
Array2D< double > params
Definition ncorr.h:54
virtual bool iterative_search() const =0
std::pair< const Array2D< double > &, bool > global(const Array2D< double > &) const
Definition ncorr.cpp:24
std::pair< difference_type, difference_type > coords
Definition ncorr.h:25
std::pair< const Array2D< double > &, bool > operator()(const Array2D< double > &) const
Definition ncorr.cpp:37
difference_type cutoff_iterations
Definition ncorr.h:56
virtual bool initial_guess() const =0
Array2D< double > hess_buf
Definition ncorr.h:53
virtual bool newton() const =0
nloptimizer_base() noexcept=default
nloptimizer_base::coords coords
Definition ncorr.h:91
nloptimizer_base::difference_type difference_type
Definition ncorr.h:90
const ROI2D::contig_subregion_generator & get_subregion_gen() const
Definition ncorr.h:102
subregion_nloptimizer(const subregion_nloptimizer &)=default
subregion_nloptimizer(subregion_nloptimizer &&)=default
subregion_nloptimizer & operator=(subregion_nloptimizer &&)=default
~subregion_nloptimizer() noexcept=default
subregion_nloptimizer & operator=(const subregion_nloptimizer &)=default
ROI2D matlab_update_roi(const ROI2D &, const Disp2D &, INTERP, ROI2D::difference_type radius)
Definition ncorr.cpp:804
Strain2D LS_strain(const Disp2D &, PERSPECTIVE, double, SUBREGION, ROI2D::difference_type)
Definition ncorr.cpp:3547
DISP
Definition ncorr.h:628
DIC_analysis_output DIC_analysis_sequential(const DIC_analysis_input &)
DIC_analysis_output DIC_analysis_parallel(const DIC_analysis_parallel_input &)
Definition ncorr.cpp:5260
Disp2D add(const std::vector< Disp2D > &, INTERP)
Definition ncorr.cpp:1126
std::vector< SeedComputationData > compute_only_seed_points(const Array2D< double > &A_ref, const std::vector< Array2D< double > > &A_curs, const ROI2D &roi, ROI2D::difference_type scalefactor, INTERP interp_type, SUBREGION subregion_type, const std::vector< SeedParams > &seeds_by_region, double cutoff_corrcoef, ROI2D::difference_type region_idx=0, bool debug=false)
Disp2D RGDIC_with_seeds(const Array2D< double > &A_ref, const Array2D< double > &A_cur, const ROI2D &roi, const DIC_analysis_parallel_input &input)
Definition ncorr.cpp:3337
SUBREGION
Definition ROI2D.h:27
strain_analysis_output strain_analysis(const strain_analysis_input &)
Definition ncorr.cpp:3792
DIC_analysis_output exact_matlab_DIC_analysis_sequential(const DIC_analysis_input &DIC_input, const std::vector< SeedParams > &seeds_by_region={}, bool seeds_are_optimized=false)
Definition ncorr.cpp:5802
Disp2D exact_add_with_rois(const std::vector< Disp2D > &disps, const std::vector< ROI2D > &rois)
Definition ncorr.cpp:5556
ROI_UPDATE_MODE
Definition ncorr.h:152
DIC_analysis_config
Definition ncorr.h:176
void save(const Data2D &data, std::ofstream &os)
Definition Data2D.cpp:78
void save_strain_video(const std::string &, const strain_analysis_input &, const strain_analysis_output &, STRAIN, double, double, double=std::numeric_limits< double >::quiet_NaN(), double=std::numeric_limits< double >::quiet_NaN(), bool=true, bool=true, bool=true, double=-1.0, double=1.0, ROI2D::difference_type=11, int=cv::COLORMAP_JET, double=2.0, int=cv::VideoWriter::fourcc('M', 'J', 'P', 'G'))
Definition ncorr.cpp:4381
Disp2D RGDIC(const Array2D< double > &, const Array2D< double > &, const ROI2D &, ROI2D::difference_type, INTERP, SUBREGION, ROI2D::difference_type, ROI2D::difference_type, double, bool)
Definition ncorr.cpp:1948
Disp2D compute_displacements(const details::subregion_nloptimizer &sr_nloptimizer, const ROI2D &roi_reduced, const SeedParams &seedparams, ROI2D::difference_type scalefactor, double cutoff_corrcoef, ROI2D::difference_type region_idx, bool debug)
Definition ncorr.cpp:4470
ACCUMULATION_MODE
Definition ncorr.h:160
INTERP
Definition Array2D.h:77
DIC_analysis_output filter_by_correlation(const DIC_analysis_output &, double)
Definition ncorr.cpp:3483
void save_ncorr_data_over_img(const std::string &, const Image2D &, const Data2D &, double, double, double, bool, bool, bool, const std::string &, double, double, double, ROI2D::difference_type, int)
Definition ncorr.cpp:4156
DIC_analysis_output matlab_DIC_analysis_parallel(const DIC_analysis_parallel_input &)
Definition ncorr.cpp:5255
DIC_analysis_output exact_matlab_DIC_analysis_parallel(const DIC_analysis_parallel_input &)
Definition ncorr.cpp:5811
std::vector< SeedParams > propagate_seeds(const std::vector< SeedParams > &seeds, ROI2D::difference_type spacing)
Definition ncorr.cpp:4680
void save_DIC_video(const std::string &, const DIC_analysis_input &, const DIC_analysis_output &, DISP, double, double, double=std::numeric_limits< double >::quiet_NaN(), double=std::numeric_limits< double >::quiet_NaN(), bool=true, bool=true, bool=true, double=-1.0, double=1.0, ROI2D::difference_type=11, int=cv::COLORMAP_JET, double=2.0, int=cv::VideoWriter::fourcc('M', 'J', 'P', 'G'))
Definition ncorr.cpp:4299
DIC_analysis_output change_perspective(const DIC_analysis_output &, INTERP)
Definition ncorr.cpp:3366
void save_ncorr_data_over_img_video(const std::string &, const std::vector< Image2D > &, const std::vector< Data2D > &, double, double, double, double, bool, bool, bool, const std::string &, double, double, double, ROI2D::difference_type, int, double, int)
Definition ncorr.cpp:4189
Disp2D add_with_rois(const std::vector< Disp2D > &disps, const std::vector< ROI2D > &rois, INTERP interp_type)
Definition ncorr.cpp:1246
DIC_analysis_output set_units(const DIC_analysis_output &, const std::string &, double)
Definition ncorr.cpp:3451
void imshow_ncorr_data_over_img(const Image2D &, const Data2D &, ROI2D::difference_type=-1)
Definition ncorr.cpp:4132
STRAIN
Definition ncorr.h:647
ROI2D update(const ROI2D &, const Disp2D &, INTERP, ROI_UPDATE_MODE mode=ROI_UPDATE_MODE::SKIP_ALL)
Definition ncorr.cpp:681
DIC_analysis_output DIC_analysis(const DIC_analysis_input &)
Definition ncorr.cpp:2718
SeedAnalysisResult analyze_seeds(const details::subregion_nloptimizer &sr_nloptimizer, const Array2D< double > &ref_gs, const ROI2D &roi, const std::vector< SeedParams > &seed_positions, ROI2D::difference_type radius, int cutoff_iteration, double cutoff_max_diffnorm, double cutoff_max_corrcoef, bool debug=true)
Definition ncorr.cpp:4699
PERSPECTIVE
Definition ncorr.h:249
DIC_analysis_output matlab_DIC_analysis_sequential(const DIC_analysis_input &DIC_input, const std::vector< SeedParams > &seeds_by_region={}, bool seeds_are_optimized=false)
Definition ncorr.cpp:5245
DIC_analysis_output change_perspective_with_inversion(const DIC_analysis_output &, INTERP)
Definition ncorr.cpp:3400
DIC_analysis_input & operator=(const DIC_analysis_input &)=default
ROI2D::difference_type difference_type
Definition ncorr.h:179
~DIC_analysis_input() noexcept=default
ROI_UPDATE_MODE roi_update_mode
Definition ncorr.h:243
DIC_analysis_input & operator=(DIC_analysis_input &&)=default
DIC_analysis_input(DIC_analysis_input &&)=default
difference_type r
Definition ncorr.h:238
DIC_analysis_input(const DIC_analysis_input &)=default
SUBREGION subregion_type
Definition ncorr.h:237
difference_type scalefactor
Definition ncorr.h:235
ACCUMULATION_MODE accumulation_mode
Definition ncorr.h:244
static DIC_analysis_input load(std::ifstream &)
Definition ncorr.cpp:2435
difference_type num_threads
Definition ncorr.h:239
std::vector< Image2D > imgs
Definition ncorr.h:233
friend void save(const DIC_analysis_input &, std::ofstream &)
Definition ncorr.cpp:2505
~DIC_analysis_output() noexcept=default
std::vector< Disp2D > disps
Definition ncorr.h:274
DIC_analysis_output & operator=(DIC_analysis_output &&)=default
DIC_analysis_output(DIC_analysis_output &&)=default
DIC_analysis_output(const DIC_analysis_output &)=default
PERSPECTIVE perspective_type
Definition ncorr.h:275
DIC_analysis_output & operator=(const DIC_analysis_output &)=default
ROI2D::difference_type difference_type
Definition ncorr.h:252
friend void save(const DIC_analysis_output &, std::ofstream &)
Definition ncorr.cpp:2602
static DIC_analysis_output load(std::ifstream &)
Definition ncorr.cpp:2559
std::vector< SeedParams > seeds_by_region
Definition ncorr.h:446
ROI2D::difference_type difference_type
Definition ncorr.h:440
DIC_analysis_parallel_input(const DIC_analysis_input &base, const std::vector< SeedParams > &seeds, bool optimized=false)
Definition ncorr.h:458
DIC_analysis_input base_input
Definition ncorr.h:443
DIC_analysis_step_data & operator=(const DIC_analysis_step_data &)=default
~DIC_analysis_step_data() noexcept=default
std::vector< ROI2D > step_rois
Definition ncorr.h:303
ROI2D::difference_type difference_type
Definition ncorr.h:282
std::vector< difference_type > step_ref_idx
Definition ncorr.h:305
friend void save(const DIC_analysis_step_data &, std::ofstream &)
Definition ncorr.cpp:2683
DIC_analysis_step_data(DIC_analysis_step_data &&)=default
DIC_analysis_step_data(const DIC_analysis_step_data &)=default
DIC_analysis_step_data & operator=(DIC_analysis_step_data &&)=default
static DIC_analysis_step_data load(std::ifstream &)
Definition ncorr.cpp:2639
std::vector< Disp2D > step_disps
Definition ncorr.h:301
std::vector< SeedParams > seeds
Definition ncorr.h:376
std::vector< SeedConvergence > convergence
Definition ncorr.h:377
std::vector< SeedParams > seed_params_by_region
Definition ncorr.h:399
details::subregion_nloptimizer sr_nloptimizer
Definition ncorr.h:400
SeedComputationData(const ROI2D &roi, const std::vector< SeedParams > &params, const details::subregion_nloptimizer &sr_nloptimizer)
Definition ncorr.h:403
SeedConvergence(int iter, double norm)
Definition ncorr.h:372
difference_type x
Definition ncorr.h:316
static SeedParams from_array(const Array2D< double > &params)
Definition ncorr.h:352
difference_type y
Definition ncorr.h:317
double corrcoef
Definition ncorr.h:326
Array2D< double > to_array(double diff_norm=0.0) const
Definition ncorr.h:336
ROI2D::difference_type difference_type
Definition ncorr.h:313
SeedParams(difference_type x, difference_type y)
Definition ncorr.h:330
strain_analysis_input(strain_analysis_input &&)=default
DIC_analysis_output DIC_output
Definition ncorr.h:558
strain_analysis_input & operator=(const strain_analysis_input &)=default
strain_analysis_input(const strain_analysis_input &)=default
DIC_analysis_input DIC_input
Definition ncorr.h:557
difference_type r
Definition ncorr.h:560
ROI2D::difference_type difference_type
Definition ncorr.h:530
strain_analysis_input & operator=(strain_analysis_input &&)=default
~strain_analysis_input() noexcept=default
ROI2D::difference_type difference_type
Definition ncorr.h:564
strain_analysis_output & operator=(const strain_analysis_output &)=default
strain_analysis_output(strain_analysis_output &&)=default
strain_analysis_output & operator=(strain_analysis_output &&)=default
strain_analysis_output(const strain_analysis_output &)=default
~strain_analysis_output() noexcept=default
std::vector< Strain2D > strains
Definition ncorr.h:585