Fix nan issue in features
[trackerpp.git] / src / Utils.cpp
1 #include "Utils.h"
2 #include <iostream>
3 #include <stdexcept>
4
5 using namespace suanzi;
6 using namespace cv;
7 using namespace std;
8
9 double distance_cosine(const Eigen::VectorXd& u, const Eigen::VectorXd& v)
10 {
11     if (u.dot(u) * v.dot(v) == 0){
12         throw overflow_error("zero vector for cosine distance");
13     }
14     return (1 - u.dot(v) / std::sqrt(u.dot(u) * v.dot(v)));
15 }
16
17 double distance_euclidean(const Eigen::VectorXd& u, const Eigen::VectorXd& v)
18 {
19     Eigen::VectorXd d = u - v;
20     return std::sqrt(d.dot(d));
21 }
22
23
24 Rect getRectInDetection(const Detection& d)
25 {
26     Rect r;
27     r.x = d.center_x - d.width / 2;
28     r.y = d.center_y - d.height / 2;
29     r.width = d.width;
30     r.height = d.height;
31     return r;
32 }
33
34 double calc_iou_ratio(const Rect& r1, const Rect& r2)
35 {
36     double iou;
37     Rect r_inner = r1 & r2;
38     Rect r_union  = r1 | r2;
39     if (r_inner.area() > 0){
40         iou = 1.0 * r_inner.area() / r_union.area();
41     }else{
42         Rect rr;
43         rr.x = min(r1.x + r1.width, r2.x + r2.width);
44         rr.y = min(r1.y + r1.height, r2.y + r2.height);
45         rr.width = max(r1.x, r2.x) - rr.x;
46         rr.height = max(r1.y, r2.y) - rr.y;
47         iou = -1.0 * rr.area() / r_union.area();
48     }
49     return iou;
50
51 }