-
Notifications
You must be signed in to change notification settings - Fork 0
/
chapter8.py
96 lines (85 loc) · 3.28 KB
/
chapter8.py
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
import cv2
import numpy as np
def stack_images(scale, img_array):
rows = len(img_array)
cols = len(img_array[0])
rowsAvailable = isinstance(img_array[0], list)
width = img_array[0][0].shape[1]
height = img_array[0][0].shape[0]
if rowsAvailable:
for x in range(0, rows):
for y in range(0, cols):
if img_array[x][y].shape[:2] == img_array[0][0].shape[:2]:
img_array[x][y] = cv2.resize(img_array[x][y], (0, 0), None, scale, scale)
else:
img_array[x][y] = cv2.resize(
img_array[x][y],
(img_array[0][0].shape[1], img_array[0][0].shape[0]),
None, scale, scale
)
if len(img_array[x][y].shape) == 2: img_array[x][y] = cv2.cvtColor(img_array[x][y], cv2.COLOR_GRAY2BGR)
imageBlank = np.zeros((height, width, 3), np.uint8)
hor = [imageBlank] * rows
hor_con = [imageBlank] * rows
for x in range(0, rows):
hor[x] = np.hstack(img_array[x])
ver = np.vstack(hor)
else:
for x in range(0, rows):
if img_array[x].shape[:2] == img_array[0].shape[:2]:
img_array[x] = cv2.resize(img_array[x], (0, 0), None, scale, scale)
else:
img_array[x] = cv2.resize(
img_array[x],
(img_array[0].shape[1], img_array[0].shape[0]),
None, scale, scale
)
if len(img_array[x].shape) == 2: img_array[x] = cv2.cvtColor(img_array[x], cv2.COLOR_GRAY2BGR)
hor = np.hstack(img_array)
ver = hor
return ver
def get_contours(img_arg):
contours, hierarchy = cv2.findContours(img_arg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
area = cv2.contourArea(cnt)
print(area)
if area > 500:
cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)
peri = cv2.arcLength(cnt, True)
# print(peri)
approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
print(len(approx))
obj_cor = len(approx)
x, y, w, h = cv2.boundingRect(approx)
if obj_cor == 3:
object_type = "Tri"
elif obj_cor == 4:
asp_ratio = w / float(h)
if 0.95 < asp_ratio < 1.05:
object_type = "Square"
else:
object_type = "Rectangle"
elif obj_cor > 4:
object_type = "Circle"
else:
object_type = "None"
cv2.rectangle(imgContour, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(
imgContour, object_type,
(x + int(w / 2) - 10, y + int(h / 2) - 10), cv2.FONT_HERSHEY_COMPLEX, 0.7,
(0, 0, 0), 2
)
path = "Resources/shapes.png"
img = cv2.imread(path)
imgContour = img.copy()
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 1)
imgCanny = cv2.Canny(imgBlur, 50, 50)
get_contours(imgCanny)
imgBlank = np.zeros_like(img)
imgStack = stack_images(0.7, (
[img, imgGray, imgBlur],
[imgCanny, imgContour, imgBlank]
))
cv2.imshow("Stack", imgStack)
cv2.waitKey(0)