笔者学识有限。 本博客旨在对mitre_sfr核心代码进行简单注解, 详细内容读者仁者见仁智者见智。
本人最近有幸拜读mitre_sfr代码, 对代码进行了简单的注解。介于学习的时候在网上没搜到类似的文章,所以特开立这个主题, 希望对后面学习mitre_sfr或想了解SFR算法的同学有所帮助。
另外, 本人是计科生, 对信号与系统知识了解有限, 读代码的时候也有一些不甚了解之处, 在代码注解中进行了标注, 希望相关领域大神在浏览的时候能顺便帮我解惑, 在此不甚感激。
拜读mitre_sfr代码时发现mitre_sfr的源码和ISO12233附录A中的代码出奇的一致, 相似性达到至少90%, 说明mitre_sfr作者对IOS的作者出于崇高的敬意。
废话少说, 贴代码。
看代码先看主干, 我先贴main函数。 Mitre_sfr的main函数对核心算法和主干涉及不多, 仅涉及sfr计算的预处理和sfr计算结果输出的一些处理, 建议大家快速阅读即可。
下一篇我将先贴出mitre_sfr最核心的函数sfrProc的源码和注解。 其他次要代码及注解在后续文章贴出, 希望大家体谅。
int main(int argc, char **argv)
{
char problem_string[82];
unsigned char rotation;
int i;
double *farea;
double slope, scale, b;
int size_x, size_y;
int len, err, bin_len;
int rgt_side, left_side;
int center;
int numcycles=0;
double *Freq=NULL;
double *disp=NULL;
double *ref_lut;
double off, R2;
int center_x, center_y, new_x, new_y;
int lowest_val, highest_val, grey_level, first, last;
int piv_err;
TIFF* tif = NULL;
#if !defined(MSDOS)
char *fnamep;
fnamep = dirname(argv[0]);
if (argc==1 && fnamep != NULL && fnamep[0] == '/') {
printf ("Changed to directory of executable: %s\n\n", fnamep);
chdir((const char *)fnamep);
}
#else
atexit(wait_to_exit);
#endif
/* Once-only initializations */
g_scan_image_file_id = 0;
g_problem_count = 0; /* # of problems in our problem report */
g_IQS_problem_count = 0;
get_switches(argc, argv, image_filename, data_filename);
/* always append output to this file */
if ((g_mtfout = fopen(MTFOUTNAME,"a")) == NULL) {
fprintf(stderr,"Can't open %s\n",MTFOUTNAME);
exit(1);
}
/* command line args */
get_args(image_filename,data_filename,&tif); // 获取源文件名并读取文件头, 获取ROI位置, 如果需要读取计算角度的两个点位
/* print the user entered data (corner coords, etc.) in the output */
/* 时间, 版本号, 以及get_args函数里面获取到的信息*/
print_header(image_filename,data_filename);
g_target_res = 500;
if (abs((int)g_ppi - g_target_res) > 10) {
sprintf(problem_string,
"Resolution outside the %d-%d ppi PIV spec range\n",
g_target_res-10,g_target_res+10);
put_problem(problem_string, IQS);
put_problem("\n", IQS);
}
// 从ROI 4个角落各读取4个像素点, 用于判断刀口方向, 并确认ROI区域的合法性
input_