2*在求角度均值的时候,经常遇到一个问题就是 1°和359°的均值是0,而不是(1+359)/2,那么需要用循环角度均值来求这个结果。
C++代码如下(角度)
#define ANGLE_DIFF(diff, x2, x1) \
do { \
diff = x2-x1+180; \
if (diff < 0) { \
diff = diff + 360 - 180; \
} else if (diff > 360) { \
diff = diff - 360 - 180; \
} else { \
diff = diff - 180; \
} \
} while(0)
float angle_avg(vector<float>angle)
{
int n = angle.size();
float diff = 0;
float last = angle[0];
float sum = angle[0];
int i = 0;
for (i = 1; i<n; i++) {
/* diff = mod(angle[i]-angle[i-1]+180,360)-180 */
ANGLE_DIFF(diff, angle[i], angle[i - 1]);
last += diff;
sum += last;
}
return sum / n;
}
弧度的均值求法:
/循环弧度求均值
#define RAD_DIFF(diff, x2, x1) \
do { \
diff = x2-x1+CV_PI; \
if (diff < 0) { \
diff = diff + CV_PI; \
} else if (diff > 2*CV_PI) { \
diff = diff - 3* CV_PI; \
} else { \
diff = diff - CV_PI; \
} \
} while(0)
float Rad_avg(vector<float>angle)
{
int n = angle.size();
float diff = 0;
float last = angle[0];
float sum = angle[0];
int i = 0;
for (i = 1; i<n; i++) {
/* diff = mod(angle[i]-angle[i-1]+180,360)-180 */
RAD_DIFF(diff, angle[i], angle[i - 1]);
last += diff;
sum += last;
}
return sum / n;
}