@@ -19,7 +19,7 @@ Mat& calculateStep(Mat& I, Mat& I1)
19
19
for ( i = 0 ; i < nRows*5 /6 ; i+=(int )nRows/6 )
20
20
{
21
21
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 ;
23
23
counter++;
24
24
}
25
25
}
@@ -28,6 +28,11 @@ Mat& calculateStep(Mat& I, Mat& I1)
28
28
29
29
void findCentroid (Mat& I, vector<Point >& centroids)
30
30
{
31
+ if (countNonZero (I) == 0 )
32
+ {
33
+ centroids.push_back (Point (0 , 0 ));
34
+ return ;
35
+ }
31
36
Moments m = moments (I,true );
32
37
Point p (m.m10 /m.m00 , m.m01 /m.m00 );
33
38
centroids.push_back (p);
@@ -36,12 +41,49 @@ void findCentroid(Mat& I, vector<Point>& centroids)
36
41
Mat lowPass (Mat& I, Mat& I1)
37
42
{
38
43
// 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 );
41
46
I2 = I+(I1-I)*0.25 ;
42
47
return I2;
43
48
}
44
49
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
+
45
87
int main (int argc, char ** argv )
46
88
{
47
89
if ( argc != 2 )
@@ -70,26 +112,30 @@ int main(int argc, char** argv )
70
112
return -1 ;
71
113
}
72
114
Mat image[ret.size ()];
73
- Mat steps[ret. size ()] ;
115
+ vector< Mat> steps;
74
116
vector<Point > centroids;
75
- steps[ 0 ] = Mat::zeros (6 ,8 , CV_8U );
117
+ steps. push_back ( Mat::zeros (6 ,8 , CV_8S) );
76
118
77
119
for ( int i = 0 ; i < ret.size (); i++ ){
78
120
image[i] = imread (ret[i].string (), 1 );
79
121
cvtColor (image[i], image[i], COLOR_BGR2GRAY);
80
122
}
81
123
82
- findCentroid (image[ 0 ], centroids );
124
+ centroids. push_back ( Point ( 0 , 0 ) );
83
125
84
126
for ( int i = 1 ; i < ret.size (); i++ ){
85
127
threshold (abs (image[i-1 ] - image[i]), image[i-1 ], 0 , 255 , 0 );
86
128
namedWindow (" Display Image" , WINDOW_AUTOSIZE );
87
129
imshow (" Display Image" , image[i-1 ]);
88
130
waitKey (0 );
89
- steps[i] = Mat (6 ,8 , CV_8U );
131
+ steps. push_back ( Mat (6 ,8 , CV_8S) );
90
132
steps[i] = calculateStep (image[i-1 ], steps[i]);
133
+ cout << steps[i] << endl;
91
134
steps[i] = lowPass (steps[i-1 ], steps[i]);
92
135
findCentroid (image[i-1 ], centroids);
136
+ cout << centroids[i] <<endl;
93
137
cout << steps[i] << endl;
94
138
}
139
+ filterSteps (centroids, steps);
140
+ cout <<centroids<<endl;
95
141
}
0 commit comments