-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdriver.cpp
139 lines (101 loc) · 3.21 KB
/
driver.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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <opencv2/core/core.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int vmin, vmax, smin, smax, hmin, hmax, vmin2, vmax2, smin2, smax2, hmin2, hmax2;
int hi = 311, lo = 165;
//test commit comment
Mat findBall(Mat frame) {
Mat hsvFrame;
Mat thresholded;
Mat thresholded2;
//color ranges
//first color ball
Scalar hsvMin = Scalar(hmin,smin,vmin,0);
Scalar hsvMax = Scalar(hmax,smax,vmax,0);
//second color ball
Scalar hsvMin2 = Scalar(hmin2,smin2,vmin2,0);
Scalar hsvMax2 = Scalar(hmax2,smax2,vmax2,0);
//convert to HSV
cvtColor(frame, hsvFrame, CV_RGB2HSV);
//two halves are detected and combined to handle color wrap-around
inRange(hsvFrame, hsvMin, hsvMax, thresholded);
//Dilate all white to create smoother circles
GaussianBlur(thresholded, thresholded, Size(lo,lo),0,0);
//makes any white solid so no variance in shades
inRange(thresholded, hsvMin2, hsvMax2, thresholded);
imshow("Lookup Image", thresholded);
//outline objects that are solid white as declared ^
Canny(thresholded,thresholded,1,1);
//Storage for circles
vector<Vec3f> circles;
//find circles
HoughCircles(thresholded, circles, CV_HOUGH_GRADIENT, 3, hi, 100.0, 50.0, 10, 400 );
int counter = 0;
//Draw each circle
for(size_t i = 0; i < circles.size(); i++)
{
Point center(round(circles[i][0]), round(circles[i][1]));
float radius = round(circles[i][2]);
//log circle x and y
//cout<<center;
counter = i + 1;
//draw circle center
circle(frame, center, 3, Scalar(0,255,0), -1, 8, 0);
//draw circle outline
circle(frame, center, radius, Scalar(0,0,255), 3, 8, 0);
}
cout << counter << " Ball(s) Found" << endl;
return frame;
}
int main(int argc, char** argv)
{
vmin = 145;
smin = 209;
hmin = 97;
vmax = 255;
smax = 255;
hmax = 139;
vmin2 = 255;
smin2 = 255;
hmin2 = 55;
vmax2 = 255;
smax2 = 255;
hmax2 = 255;
VideoCapture videoCapture;
Mat frame;
videoCapture.open(0);
cout << "Opened" << endl;
videoCapture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
videoCapture.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
cout << videoCapture.isOpened() << endl;
videoCapture>>frame;
cout << "First frame snagged" << endl;
namedWindow("Output", CV_WINDOW_AUTOSIZE);
namedWindow("Lookup Image", CV_WINDOW_AUTOSIZE);
namedWindow("Sliders", CV_WINDOW_AUTOSIZE);
createTrackbar( "Hmin", "Sliders", &hmin, 255, 0 );
createTrackbar( "Hmax", "Sliders", &hmax, 255, 0 );
createTrackbar( "Smin", "Sliders", &smin, 255, 0 );
createTrackbar( "Smax", "Sliders", &smax, 255, 0 );
createTrackbar( "Vmin", "Sliders", &vmin, 255, 0 );
createTrackbar( "Vmax", "Sliders", &vmax, 255, 0 );
createTrackbar("hi", "Sliders", &hi, 1000);
createTrackbar("lo", "Sliders", &lo, 1000);
createTrackbar( "Hmin2", "Sliders", &hmin2, 255, 0 );
createTrackbar( "Hmax2", "Sliders", &hmax2, 255, 0 );
createTrackbar( "Smin2", "Sliders", &smin2, 255, 0 );
createTrackbar( "Smax2", "Sliders", &smax2, 255, 0 );
createTrackbar( "Vmin2", "Sliders", &vmin2, 255, 0 );
createTrackbar( "Vmax2", "Sliders", &vmax2, 255, 0 );
for(;;) {
videoCapture>>frame;
imshow("Output", findBall(frame));
if (waitKey(10) > 0)
break;
}
waitKey();
return 0;
}