DIC源码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

96 lines
3.0 KiB

/*
This example demonstrates how to use OpenCorr to calculate the stains
according to the polynomial fit fields of displacements u, v, and w obtained
through 3D/stereo DIC methods. The searching of neighbor POIs around a POI
combines the FLANN and brute force searching.
*/
#include <fstream>
#include "opencorr.h"
using namespace opencorr;
using namespace std;
int main()
{
//select the image file to get the file name to process
string tar_image_path = "d:/dic_tests/3d_dic/GT4-0273_0.tif"; //replace it with the path on your computer
Image2D tar_img(tar_image_path);
//initialize papameters for timing
double timer_tic, timer_toc, consumed_time;
vector<double> computation_time;
//get the time of start
timer_tic = omp_get_wtime();
//get the DIC results from csv file
string file_path = tar_image_path.substr(0, tar_image_path.find_last_of(".")) + "_epipolar_sift_r16.csv";
string delimiter = ",";
ofstream csv_out; //instance for output calculation time
IO2D in_out; //instance for input and output DIC data
in_out.setPath(file_path);
in_out.setHeight(tar_img.height);
in_out.setWidth(tar_img.width);
in_out.setDelimiter(delimiter);
//load a queue of POIs
vector<POI2DS> poi_queue = in_out.loadTable2DS();
//set OpenMP parameters
int cpu_thread_number = omp_get_num_procs() - 1;
omp_set_num_threads(cpu_thread_number);
//set the radius of subregion for polynomial fit of displacement field
float strain_radius = 20.f;
//set the miminum number of neighbor POIs to perform fitting
int min_neighbors = 5;
//initialize a object of stain calculation
Strain* strain = new Strain(strain_radius, min_neighbors, cpu_thread_number);
//get the time of end
timer_toc = omp_get_wtime();
consumed_time = timer_toc - timer_tic;
computation_time.push_back(consumed_time); //0
//display the time of initialization on screen
cout << "Initialization takes " << consumed_time << " sec, " << cpu_thread_number << " CPU threads launched." << std::endl;
//get the time of start
timer_tic = omp_get_wtime();
//calculate the strain exx, eyy, ezz, exy, eyz, ezx
strain->prepare(poi_queue);
strain->compute(poi_queue);
//get time of end
timer_toc = omp_get_wtime();
consumed_time = timer_toc - timer_tic;
computation_time.push_back(consumed_time); //1
cout << "Strain calculation of " << poi_queue.size() << " POIs takes " << consumed_time << " sec." << std::endl;
//update the table of DIC results with calculated strains
in_out.saveTable2DS(poi_queue);
//save the computation time
file_path = tar_image_path.substr(0, tar_image_path.find_last_of(".")) + "_strain_r20_time.csv";
csv_out.open(file_path);
if (csv_out.is_open())
{
csv_out << "POI number" << delimiter << "Initialization" << delimiter << "Strain calculation" << endl;
csv_out << poi_queue.size() << delimiter << computation_time[0] << delimiter << computation_time[1] << endl;
}
csv_out.close();
//destroy the instance
delete strain;
cout << "Press any key to exit..." << std::endl;
cin.get();
return 0;
}