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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//绘制椭圆
void drawEllipse(Mat img, double angle)
{
int thickness = 2;
int lineType = 8;
ellipse(img, Point(40, 40), Size(20, 40), angle, 0, 360, Scalar(255, 129, 0), thickness, lineType);
}
//绘制圆
void drawCircle(Mat img, Point center)
{
int thickness = 2;
int lineType = 8;
circle(img, center, 30, Scalar(168, 109, 255), thickness, lineType);
}
//画线
void drawLine(Mat img, Point start, Point end)
{
int thickness = 2;
int lineType = 8;
line(img, start, end, Scalar(0, 0, 0), thickness, lineType);
}
//绘制矩形
void drawRectangle(Mat img, Point pt1, Point pt2)
{
int thickness = 2;
int lineType = 8;
rectangle(img, pt1, pt2, Scalar(0, 255, 0), thickness, lineType);
}
//绘制三角形
void drawLine_Triangle(Mat img)
{
int thickness = 2;
int lineType = 8;
Point l1_start(200, 150), l1_end(50, 250);
Point l2_start(50, 250), l2_end(400, 380);
Point l3_start(400, 380), l3_end(200, 150);
line(img, l1_start, l1_end, Scalar(0, 0, 0), thickness, lineType);
line(img, l2_start, l2_end, Scalar(0, 0, 0), thickness, lineType);
line(img, l3_start, l3_end, Scalar(0, 0, 0), thickness, lineType);
}
////绘制多边形
//void drawfillPloy(Mat img)
//{
// int lineType = 8;
//
// Point rookPoints[1][3];
// rookPoints[0][0] = Point(30, 30);
// rookPoints[0][1] = Point(60, 60);
// rookPoints[0][2] = Point(90, 90);
//
// Point *pts[1] = {rookPoints[0]}; //点序列的序列
// int npts[] = {3}; //pts[i]中点的数目
// int ncontours = 3; //pts中的序列数
//
// fillPoly(img, pts, npts, ncontours, Scalar(168, 200, 120), lineType);
//}
//使用霍夫线检测出线
//Mat check_line(Mat img)
//{
// Mat dstImage;
//
// cvtColor(img, dstImage, COLOR_BGR2GRAY);
// adaptiveThreshold(dstImage, dstImage, 50, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 10, 10);
//
// vector<Vec2f> lines;
// HoughLines(dstImage, lines, 1, CV_PI/180, 80, 0, 0);
//
// vector<Vec2f> ::iterator itl = lines.begin();
// while (itl != lines.end())
// {
// rectangle(img, Point((*itl)[0] + 5, (*itl)[1] + 5), Point((*itl)[2] + 5, (*itl)[3] + 5), 2, 8);
// ++itl;
// }
//
// imshow("check_lines", img);
//
// return img;
//}
//使用霍夫线检测出线
Mat check_line(Mat& img)
{
Mat dstImage;
cvtColor(img, dstImage, COLOR_BGR2GRAY);
Canny(dstImage, dstImage, 150, 255, 3);
//使用霍夫曼检测
//vector<Vec4f> lines;
// 注意这里的第二个参数
//HoughLines(dstImage, lines, 1, CV_PI/180.0, 80,50,10);
// 以下修改为霍夫曼概率直线检测函数
// 注意这里的参数
vector<Vec4i> lines;
// 注意一下,使用霍夫曼概率直线检测与霍夫曼直线检测的区别
// 注意这里的第二个参数
HoughLinesP(dstImage, lines, 1, CV_PI / 180.0, 80, 50, 10);
Scalar color = Scalar(0, 0, 255);
for (size_t i = 0; i < lines.size(); i++) {
cout << " i is " << i << " ";
Vec4i hline = lines[i];
cout << hline[0] << " ||| " << hline[1] << " ||| " << hline[2] << " |||| " << hline[3] << endl;
line(img, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
}
imshow("check_lines", img);
return img;
}
//使用霍夫圆检测出圆形
Mat check_circle(Mat img)
{
Mat dstImage;
cvtColor(img, dstImage, COLOR_BGR2GRAY);
GaussianBlur(dstImage, dstImage, Size(7, 7), 1.5);
vector<Vec3f> circles;
HoughCircles(dstImage, circles, CV_HOUGH_GRADIENT, 2, 30, 200, 100, 20, 80);
/*vector<Vec3f> ::iterator itc = circles.begin();
while (itc != circles.end())
{
circle(img, Point((*itc)[0], (*itc)[1]), (*itc)[2] + 20, Scalar(0, 0, 255), 6);
++itc;
}*/
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int r = cvRound(circles[i][2]);
circle(img, center, r, Scalar(0, 0, 255), 3, 8, 0);
}
imshow("check_Circle", img);
return img;
}
int main()
{
Mat srcImage(512, 512, CV_8UC3 ,Scalar(255, 255, 255));
//imshow("srcImage", srcImage);
//绘制椭圆形
drawEllipse(srcImage, 30);
//绘制圆形
Point center(300, 100);
drawCircle(srcImage, center);
//绘制线段
Point start(100, 100);
Point end(200, 200);
drawLine(srcImage, start, end);
//绘制矩形
Point pt1(300, 300); //矩形的第一个顶点
Point pt2(500, 500); //矩形的对角线顶点
drawRectangle(srcImage, pt1, pt2);
//绘制三角形
drawLine_Triangle(srcImage);
//putText(srcImage, "dasha is wangjiacun", Point(70, 70), FONT_HERSHEY_PLAIN, 2, 255, 2);
imshow("out", srcImage);
check_line(srcImage);
check_circle(srcImage);
waitKey(0);
return 0;
}
|