53ncorr::DIC_analysis_output
run_cuncorr_dic(
const std::vector<ncorr::Image2D>& imgs,
57 throw std::invalid_argument(
"run_cuncorr_dic: need at least a reference + one frame");
60 cuncorr::SessionConfig scfg;
61 scfg.scalefactor = sf;
67 scfg.debug = cfg.
debug;
70 auto be = cuncorr::make_default_backend();
71 const auto bi = be->info();
73 info->
cuda = bi.kind == cuncorr::Backend::CUDA && bi.device_available;
76 cuncorr::NcorrSession session(scfg);
79 const auto ref_buf = image_to_u8(imgs[0], W, H);
80 session.set_reference(cuncorr::ImageBuffer(ref_buf.data(), W, H, 1));
82 const auto roi_buf = roi_to_u8(roi);
83 session.set_roi(cuncorr::ImageBuffer(roi_buf.data(),
static_cast<int>(roi.width()),
84 static_cast<int>(roi.height()), 1));
87 const ncorr::ROI2D roi_reduced = roi.reduce(sf);
88 const diff_t gH = roi_reduced.height();
89 const diff_t gW = roi_reduced.width();
91 session.reset_sequence();
92 std::vector<ncorr::Disp2D> disps;
93 disps.reserve(imgs.size() - 1);
95 for (std::size_t f = 1; f < imgs.size(); ++f) {
97 const auto def_buf = image_to_u8(imgs[f], dW, dH);
98 const cuncorr::DICResult res =
99 session.process_frame_sequence(cuncorr::ImageBuffer(def_buf.data(), dW, dH, 1));
101 ncorr::Array2D<double> A_v(gH, gW), A_u(gH, gW), A_cc(gH, gW);
102 ncorr::Array2D<bool> A_vp(gH, gW,
false);
104 const int rgW = res.width, rgH = res.height;
105 for (
int gi = 0; gi < static_cast<int>(gH); ++gi)
106 for (
int gj = 0; gj < static_cast<int>(gW); ++gj) {
107 if (gi >= rgH || gj >= rgW)
continue;
108 const std::size_t idx =
static_cast<std::size_t
>(gi) * rgW + gj;
109 const double v = res.v[idx], u = res.u[idx], cc = res.corrcoef[idx];
110 if (std::isnan(v) || std::isnan(u))
continue;
113 A_cc(gi, gj) = std::isnan(cc) ? 0.0 : cc;
117 const ncorr::ROI2D roi_valid = roi_reduced.form_union(A_vp);
118 disps.emplace_back(std::move(A_v), std::move(A_u), std::move(A_cc), roi_valid,
119 static_cast<diff_t
>(sf));
122 return ncorr::DIC_analysis_output(disps, ncorr::PERSPECTIVE::LAGRANGIAN,
"pixels", 1.0);
ncorr::DIC_analysis_output run_cuncorr_dic(const std::vector< ncorr::Image2D > &imgs, const ncorr::ROI2D &roi, const CuncorrDicConfig &cfg, CuncorrDicInfo *info=nullptr)
Run cuNCorr in sequence mode (fixed reference = imgs[0], warm-start each frame) over the stack agains...