add utils.cpp and testcase
[trackerpp.git] / src / Utils.cpp
diff --git a/src/Utils.cpp b/src/Utils.cpp
new file mode 100644 (file)
index 0000000..c174e28
--- /dev/null
@@ -0,0 +1,45 @@
+#include "Utils.h"
+
+using namespace suanzi;
+using namespace cv;
+
+double distance_cosine(const Eigen::VectorXd& u, const Eigen::VectorXd& v)
+{
+    return (1 - u.dot(v) / std::sqrt(u.dot(u) * v.dot(v)));
+}
+
+double distance_euclidean(const Eigen::VectorXd& u, const Eigen::VectorXd& v)
+{
+    Eigen::VectorXd d = u - v;
+    return std::sqrt(d.dot(d));
+}
+
+
+Rect getRectInDetection(const Detection& d)
+{
+    Rect r;
+    r.x = d.center_x - d.width / 2;
+    r.y = d.center_y - d.height / 2;
+    r.width = d.width;
+    r.height = d.height;
+    return r;
+}
+
+double calc_iou_ratio(const Rect& r1, const Rect& r2)
+{
+    double iou;
+    Rect r_inner = r1 & r2;
+    Rect r_union  = r1 | r2;
+    if (r_inner.area() > 0){
+        iou = 1.0 * r_inner.area() / r_union.area();
+    }else{
+        Rect rr;
+        rr.x = min(r1.x + r1.width, r2.x + r2.width);
+        rr.y = min(r1.y + r1.height, r2.y + r2.height);
+        rr.width = max(r1.x, r2.x) - rr.x;
+        rr.height = max(r1.y, r2.y) - rr.y;
+        iou = -1.0 * rr.area() / r_union.area();
+    }
+    return iou;
+
+}