目标检测 — 计算IOU
1、IOU=交集/并集
#include<iostream> #include<algorithm> #include<stdio.h> #include <vector> #include<string> #include<sstream> #include<map> #include<set> #include<iomanip> #include <functional> // std::greater using namespace std; double calcS(vector<int> num) { return (num[2] - num[0])*(num[3] - num[1]); } vector<vector<double>> calcIOU(vector<vector<int>> &nums) { vector<vector<double>> res(nums.size(), vector<double>(nums.size(),0.0)); for (int i = 0; i < nums.size(); ++i) { for (int j = i + 1; j < nums.size(); ++j) { int x1 = max(nums[i][0], nums[j][0]); int x2 = min(nums[i][2], nums[j][2]); int y1 = max(nums[i][1], nums[j][1]); int y2 = min(nums[i][3], nums[j][3]); double inter_square = (x2 - x1)*(y2 - y1); double union_square = calcS(nums[i]) + calcS(nums[j]) - inter_square; res[i][j] = inter_square / union_square; } } return res; } int main() { vector<vector<int>> nums; vector<vector<double>> res; // 表示坐标位置,(x1,y1,x2,y2),分别是左上角和右下角的坐标 int a[3][4] = { { 3,6,9,11 },{ 6,3,8,7 },{ 3,7,10,12 } }; for (int i = 0; i < 3; ++i) { vector<int> temp; for (int j = 0; j < 4; ++j) { temp.push_back(a[i][j]); } nums.push_back(temp); } res = calcIOU(nums); for (int i = 0; i < nums.size(); ++i) { for (int j = i + 1; j < nums.size(); ++j) cout << fixed << setprecision(3) <<res[i][j] << " "; } cout << endl; system("pause"); return 0; }