-
Notifications
You must be signed in to change notification settings - Fork 0
/
CalcAxis.cpp
126 lines (100 loc) · 3.34 KB
/
CalcAxis.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// CalcAxis.cpp
// AxisOfRotation
//
// Created by masakazu nakazawa on 2015/09/23.
// Copyright (c) 2015年 masakazu. All rights reserved.
//
#include "CalcAxis.h"
CalcAxis::CalcAxis(cv::Size frameSize,
cv::vector<cv::Point2f>* start,
cv::vector<cv::Point2f>* end,
bool left, bool up, float dx, float shift):
frameSize(frameSize), start(start), end(end),
left(left), up(up), dx(dx), shift(shift)
{
}
void CalcAxis::setOpticalflow(cv::vector<cv::Point2f>* start,
cv::vector<cv::Point2f>* end){
this->start = start;
this->end = end;
}
int CalcAxis::calcAxis(){
int prevLeft = minLeft;
minValue = FLT_MAX;
minLeft = INT_MAX;
for(resetIter(); !isIterEnd(); incIter()){
float curValue = calcWindow();
if(std::abs(minValue) > std::abs(curValue)){
minValue = curValue;
minLeft = curLeft;
}
}
if(minValue == FLT_MAX){
minLeft = prevLeft;
return INT_MAX;
}
return minLeft + dx / 2;
}
float CalcAxis::calcWindow(){
int yCenter = frameSize.height / 2;
float posSum = 0.0f;
float negSum = 0.0f;
int posNum = 0;
int negNum = 0;
cv::vector<cv::Point2f>::const_iterator startIter = start->begin();
cv::vector<cv::Point2f>::const_iterator endIter = end->begin();
for(; startIter!=start->end(); startIter++, endIter++){
if(curLeft <= startIter->x && startIter->x < curLeft + dx &&
(up? startIter->y <= yCenter: yCenter < startIter->y)){
float xvector = endIter->x - startIter->x;
if(0 <= xvector){
posSum += xvector;
posNum++;
}else{
negSum += xvector;
negNum++;
}
}
}
if(posNum == 0 || negNum == 0){
return FLT_MAX;
}
return posSum / posNum + negSum / negNum;
}
void CalcAxis::incIter(){
curLeft = curLeft + shift;
}
bool CalcAxis::isIterEnd(){
return (left?
frameSize.width / 2 < curLeft:
frameSize.width < curLeft);
}
void CalcAxis::resetIter(){
curLeft = left? 0: frameSize.width / 2;
}
void CalcAxis::drawRange(cv::Mat& flowImg){
int minRight = minLeft + dx;
if(minLeft < frameSize.width){
cv::line(flowImg, cv::Point(minLeft, 0),
cv::Point(minLeft, frameSize.height), cv::Scalar(127), 3);
if(minRight < frameSize.width){
cv::line(flowImg, cv::Point(minRight, 0),
cv::Point(minRight, frameSize.height), cv::Scalar(127), 3);
cv::line(flowImg,
cv::Point(minLeft, 1),
cv::Point(minRight, 1),
cv::Scalar(127), 3);
cv::line(flowImg,
cv::Point(minLeft, frameSize.height-1),
cv::Point(minRight, frameSize.height-1), cv::Scalar(127), 3);
}else{
cv::line(flowImg, cv::Point(minLeft, 1),
cv::Point(frameSize.width, 1),
cv::Scalar(127), 3);
cv::line(flowImg, cv::Point(minLeft, frameSize.height-1),
cv::Point(frameSize.width, frameSize.height-1),
cv::Scalar(127), 3);
}
}
}