Skip to content

Commit 21eecd3

Browse files
author
anegm98
committed
filter steps based on change in angel of motion
1 parent cea5983 commit 21eecd3

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

data/jimmy1 (copy).png

20.8 KB
Loading

repReduce.cpp

+53-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Mat& calculateStep(Mat& I, Mat& I1)
1919
for( i = 0; i < nRows*5/6; i+=(int)nRows/6)
2020
{
2121
Mat temp = I(Rect(h, i, (int)nCols/8, (int)nRows/6));
22-
p1[counter] = (mean(temp)[0]);
22+
p1[counter] = ((int)(mean(temp)[0]))*127/255;
2323
counter++;
2424
}
2525
}
@@ -28,6 +28,11 @@ Mat& calculateStep(Mat& I, Mat& I1)
2828

2929
void findCentroid(Mat& I, vector<Point>& centroids)
3030
{
31+
if (countNonZero(I) == 0)
32+
{
33+
centroids.push_back(Point(0, 0));
34+
return;
35+
}
3136
Moments m = moments(I,true);
3237
Point p(m.m10/m.m00, m.m01/m.m00);
3338
centroids.push_back(p);
@@ -36,12 +41,49 @@ void findCentroid(Mat& I, vector<Point>& centroids)
3641
Mat lowPass(Mat& I, Mat& I1)
3742
{
3843
// accept only char type matrices
39-
CV_Assert(I.depth() == CV_8U);
40-
Mat I2(6,8, CV_8U);
44+
CV_Assert(I.depth() == CV_8S);
45+
Mat I2(6,8, CV_8S);
4146
I2 = I+(I1-I)*0.25;
4247
return I2;
4348
}
4449

50+
void filterSteps(vector<Point>& centroids, vector<Mat>& steps)
51+
{
52+
double angle, originAngle;
53+
int originIndx = 0;
54+
for (int i = 2; i < centroids.size(); i++)
55+
{
56+
if (centroids[i-1].y == 0 && centroids[i-1].x == 0)
57+
{
58+
steps.erase(steps.begin() + i-1);
59+
centroids.erase(centroids.begin() + i-1);
60+
i++;
61+
}
62+
else
63+
{
64+
Point p1 = centroids[i-1];
65+
Point p2 = centroids[i];
66+
Point origin = centroids[originIndx];
67+
angle = atan2(p1.y - p2.y, p1.x - p2.x);
68+
originAngle = atan2(p1.y - origin.y, p1.x - origin.x);
69+
if (angle < 0) {angle += 2*CV_PI;}
70+
if (originAngle < 0) {originAngle += 2*CV_PI;}
71+
angle = angle * (180.0/CV_PI);
72+
originAngle = originAngle * (180.0/CV_PI);
73+
if (abs(angle-originAngle) > 0.1*originAngle)
74+
{
75+
int j = originIndx+1;
76+
while (j < i-1)
77+
{
78+
steps.erase(steps.begin() + originIndx);
79+
centroids.erase(centroids.begin() + originIndx);
80+
}
81+
originIndx = originIndx+1;
82+
}
83+
}
84+
}
85+
}
86+
4587
int main(int argc, char** argv )
4688
{
4789
if ( argc != 2 )
@@ -70,26 +112,30 @@ int main(int argc, char** argv )
70112
return -1;
71113
}
72114
Mat image[ret.size()];
73-
Mat steps[ret.size()];
115+
vector<Mat> steps;
74116
vector<Point> centroids;
75-
steps[0] = Mat::zeros(6,8, CV_8U);
117+
steps.push_back(Mat::zeros(6,8, CV_8S));
76118

77119
for ( int i = 0; i < ret.size(); i++ ){
78120
image[i] = imread(ret[i].string(), 1);
79121
cvtColor(image[i], image[i], COLOR_BGR2GRAY);
80122
}
81123

82-
findCentroid(image[0], centroids);
124+
centroids.push_back(Point(0, 0));
83125

84126
for ( int i = 1; i < ret.size(); i++ ){
85127
threshold(abs(image[i-1] - image[i]), image[i-1], 0, 255, 0);
86128
namedWindow("Display Image", WINDOW_AUTOSIZE );
87129
imshow("Display Image", image[i-1]);
88130
waitKey(0);
89-
steps[i] = Mat(6,8, CV_8U);
131+
steps.push_back(Mat(6,8, CV_8S));
90132
steps[i] = calculateStep(image[i-1], steps[i]);
133+
cout << steps[i] << endl;
91134
steps[i] = lowPass(steps[i-1], steps[i]);
92135
findCentroid(image[i-1], centroids);
136+
cout << centroids[i] <<endl;
93137
cout << steps[i] << endl;
94138
}
139+
filterSteps(centroids, steps);
140+
cout <<centroids<<endl;
95141
}

0 commit comments

Comments
 (0)