SurView DIC

Software for digital image correlation: full-field displacement and strain measurement from speckle images.

Free and open source, LGPL-2.1-or-later · Qt and VTK · correlation by OpenCorr

The SurView DIC workspace: a speckled tension specimen with a measured displacement field over it, the image record on the left, correlation settings on the right, and a per-point readout beneath them.

Capabilities

SurView DIC measures how a speckled specimen moved and deformed between photographs, over a whole loading sequence, reads it back as a loading curve, and reports how far each measured point can be trusted.

Specification

What the correlation actually does, in the terms the literature uses.

Solvers
Inverse-compositional Gauss-Newton (ICGN), Newton-Raphson, inverse-compositional Levenberg-Marquardt (IC-LM). Every offered combination is covered by a test.
Shape functions
First order (affine) and second order (quadratic), where the solver implements it.
Interpolation
Bicubic B-spline, over the whole dense image.
Subset and grid
Subset radius and grid step chosen per run; the grid is held one subset radius clear of every image edge.
Strain
Fitted by plane regression over a subregion of chosen radius. Cauchy (small strain), Green-Lagrange and Euler-Almansi. Points correlating below 0.9 are excluded from every fit.
Repairing failures
Points the first solve rejected or correlated poorly are re-attempted from a displacement fitted to their reliable neighbours, then solved again in full, in rounds. An answer is kept only if it is better than the one it replaces, and every repaired point is marked wherever it is reported. On the example data it raises a hard frame from 5401 measured points to 8455.
Plots
Any field quantity against frame, and virtual extensometers: two points on the specimen, reported as gauge length, elongation and engineering strain. A frame that cannot be read breaks the curve rather than being joined across.
Reliability
Displacement noise floor (DIC's sigma, in pixels) and match conditioning (DIC's beta, dimensionless), for every point of every run.
Reads
TIFF, PNG, JPEG and BMP, 8-bit and 16-bit, greyscale. Row order is normalised to the file's own; nothing is converted or rescaled.
Writes
.vtu VTK unstructured grid, and .csv. Both carry both images with their SHA-256, the solver and its settings, the region, the strain fit and the engine revision.
Coordinate frame
Image pixels throughout, x right and y down, origin at the top-left pixel centre. The viewport, the region, the engine and the exported file all use it, and the file states it.
Engine
katalystnord/OpenCorr, branch surview-dev: our working fork of OpenCorr (Jiang, MPL-2.0). Required, and not interchangeable with upstream today - auto-detected regions, per-point reliability and per-point failure reasons are all capability work that lives in the fork. Pinned to an exact commit, recorded in the repository and compiled into every export.
Built with
Qt 6, VTK 9.5, OpenCV 4, Eigen 3.4, FFTW 3, nanoflann, OpenMP. C++20.

The record, and the measurement

A measurement is worth what the record behind it is worth, so SurView keeps both in view.

What was recorded

Every image is recorded as it arrived: path, size, modification time, SHA-256, the decoder that read it, its pixel type, and how much of that type's range the data actually used. Nothing is converted, resampled or normalised on the way in.

What was measured

Nothing unmeasured is reported as a number. A rejected point, an unfitted strain, an unestablished uncertainty and a frame an extensometer could not read are absent or not-a-number, never zero, in the display, in every plot and in every exported file. Failures are counted by the engine's own reason, and a point repaired by the second pass is marked as one everywhere it appears.

Screenshots

From a running build, measuring the example data that ships with it.

Example data

Two kinds, because they answer different questions. Both ship with the source.

Six synthetic sets, with the exact answer

Rendered from an analytic speckle pattern rather than warped from an image, so no pixel is ever resampled and the displacement is exact by construction. Each frame carries its deformation gradient, its displacement at the corners and centre, and a noise floor measured from its own pixels.

  • Sub-pixel translation, 0.25 to 2.5 px
  • Uniaxial tension with Poisson contraction
  • Rigid rotation to 15 degrees, no strain at any step
  • Simple shear
  • Large strain to 30 per cent, for reference updating
  • Movement straddling what the speckle can resolve

Three real experiments

Photographs of actual specimens, with what a real camera brings: lighting, grips, out-of-plane motion, and background carrying no speckle at all.

  • Aluminium dog-bone in uniaxial tension
  • Perforated specimen, stress concentration at the holes
  • Speckled plate in rigid-body rotation

From the pyALDIC project, BSD-3-Clause, cited with the data.

Download

SurView builds from source against a pinned engine revision, so a build is always traceable to one exact correlation library. Both clones are required: the second is the correlation engine, and SurView will not configure without it.

git clone https://github.com/katalystnord/SurView.git
git clone -b surview-dev https://github.com/katalystnord/OpenCorr.git

cd SurView
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build

./build/src/SurView examples/real/01_tension_without_holes/image_000*.png

The last line opens a real tension sequence with its reference and four loaded frames already imported. Press Run Correlation.

The engine clone is katalystnord/OpenCorr rather than upstream on purpose. It is our working fork of Jiang's OpenCorr, and several things SurView shows on screen are implemented there. Upstream will not build this application as it stands. Fixes that are generally useful go upstream as pull requests rather than staying in the fork, and a script in the repository checks all three links - upstream to fork, our upstreamed fixes by content, and fork to the pinned commit.

Sister tool

SurView DIC and PatternFab are two ends of one workflow: the speckle pattern PatternFab makes is the pattern SurView measures.

Measure the pattern

SurView DIC

Speckle images in, displacement and strain fields out, with every point's reliability reported and full provenance carried into ParaView and FreeCAD.

This tool.

Fabricate the pattern

PatternFab

An optimized speckle pattern into a 3D-printed stamp, a laser-cut stencil, a decal or a direct-write file, with the manufacturing constraints applied before anything is made.

katalystnord.github.io/patternfab

Licence and credits

Correlation is by OpenCorr (Jiang, MPL-2.0): 2D, stereo and volumetric DVC in one library, and the work to cite for the method.

SurView builds against our working fork of it, which carries the capability work this application needs. It is a staging area for that work and for fixes on their way upstream, not an attempt to run a competing version of OpenCorr.

The application shell is Qt and everything rendered or exported goes through VTK, which is why results open natively in ParaView and FreeCAD rather than through a converter.

SurView DIC is LGPL-2.1-or-later, the licence FreeCAD chose in the same ecosystem. No paid tier and no open core.