double my_target::match_sim(vector<my_target> old) { #ifdef method // ssim comparision Scalar SSIM1 = getMSSIM(this->pic, old[0].pic); double ssim1 = (SSIM1.val[2] + SSIM1.val[1] + SSIM1.val[0]) / 3 * 100; Scalar SSIM2 = getMSSIM(this->pic, old[1].pic); double ssim2 = (SSIM2.val[2] + SSIM2.val[1] + SSIM2.val[0]) / 3 * 100; (ssim1 > ssim2) ? md_car = 0 : md_car = 1; cout << "sim1 " << ssim1 << "sim2 " << ssim2 << endl; cout << "result " << md_car << endl; #else double mindist = 1000000, md_car, simi = 0, ms_car; double x1 = this->bbox.x + this->bbox.width / 2; double y1 = this->bbox.y + this->bbox.height / 2; // euler distance for (int i = 0; i < old.size(); i++) { double x2 = old[i].bbox.x + old[i].bbox.width / 2; double y2 = old[i].bbox.y + old[i].bbox.height / 2; double dist = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); // cout<<"dist"<<dist; if (dist < mindist) { mindist = dist; md_car = i; } } #endif return md_car; }
时间: 2024-01-06 07:06:43 浏览: 63
这段代码是一个函数,接受一个 vector<my_target> 类型的参数 old,返回一个 double 类型的值。
函数主要作用是计算当前目标和之前的目标 vector 中的目标的相似度,找到最相似的目标并返回其索引。
函数中的 #ifdef method 和 #else 是预编译指令,用于根据编译时的定义选择不同的代码段。当定义了 method 时,会执行相似度比较的代码段,否则执行欧几里得距离比较的代码段。
在相似度比较的代码段中,使用了 OpenCV 库中的 getMSSIM 函数计算两张图像的结构相似度(SSIM),并将其转化为百分比形式。然后根据计算结果选择相似度较高的目标,并将其索引赋值给 md_car 变量。
在欧几里得距离比较的代码段中,先计算当前目标的中心点坐标和之前目标中心点坐标的欧几里得距离,然后选择距离最小的目标,并将其索引赋值给 md_car 变量。
最后,函数返回 md_car 变量作为最匹配的目标的索引。
阅读全文