-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
177 lines (136 loc) · 5.92 KB
/
main.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
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
import cv2
import numpy as np
from AlphaBot import AlphaBot
car = AlphaBot()
# Kernel để sử dụng trong các phép toán morphology
kernel = np.ones((5, 5), np.uint8)
# Uncomment và đặt đường dẫn đến video nếu bạn muốn xử lý video
video_path = "dataset/vd2.mp4"
cap = cv2.VideoCapture(1)
if not cap.isOpened():
print("Error: Could not open video file.")
exit()
center = (0,0)
# Lấy thông tin của video để tạo video output
width = 320 #int(cap.get(3))
height = 240 #int(cap.get(4))
original_fps = cap.get(5)
# Giảm tốc độ fps xuống còn 10
target_fps = 10
frame_interval = int(original_fps / target_fps)
# Tạo video output
#fourcc = cv2.VideoWriter_fourcc(*'XVID')
#out = cv2.VideoWriter('output_video.avi', fourcc, target_fps, (width, height))
# Biến đường dẫn đến hình ảnh mẫu
image_path = "test.jpg"
# Hàm không làm gì
def nothing(x):
pass
# Tạo các cửa sổ cho việc hiển thị các thành phần của ảnh
cv2.namedWindow('HueComp')
cv2.namedWindow('SatComp')
cv2.namedWindow('ValComp')
cv2.namedWindow('closing')
cv2.namedWindow('tracking')
# Tạo trackbar để điều chỉnh ngưỡng màu sắc
cv2.createTrackbar('hmin', 'HueComp', 32, 179, nothing)
cv2.createTrackbar('hmax', 'HueComp', 80, 179, nothing)
# Tạo trackbar để điều chỉnh ngưỡng độ bão hòa màu
cv2.createTrackbar('smin', 'SatComp', 90, 255, nothing)
cv2.createTrackbar('smax', 'SatComp', 155, 255, nothing)
# Tạo trackbar để điều chỉnh ngưỡng độ giá trị màu
cv2.createTrackbar('vmin', 'ValComp', 83, 255, nothing)
cv2.createTrackbar('vmax', 'ValComp', 177, 255, nothing)
# Khởi tạo biến lưu giữ tâm trước đó
prev_center = None
frame_count = 0
while True:
buzz = 0
_, frame = cap.read()
frame = cv2.flip(frame, 0)
frame = cv2.resize(frame, (320, 240),
interpolation = cv2.INTER_LINEAR)
# Làm mờ ảnh để giảm nhiễu
frame = cv2.GaussianBlur(frame, (15, 15), 0)
# Chuyển đổi ảnh sang không gian màu HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
hue, sat, val = cv2.split(hsv)
# Lấy giá trị ngưỡng từ trackbar
hmn = cv2.getTrackbarPos('hmin', 'HueComp')
hmx = cv2.getTrackbarPos('hmax', 'HueComp')
smn = cv2.getTrackbarPos('smin', 'SatComp')
smx = cv2.getTrackbarPos('smax', 'SatComp')
vmn = cv2.getTrackbarPos('vmin', 'ValComp')
vmx = cv2.getTrackbarPos('vmax', 'ValComp')
# Tạo ảnh nhị phân dựa trên ngưỡng
hthresh = cv2.inRange(np.array(hue), np.array(hmn), np.array(hmx))
sthresh = cv2.inRange(np.array(sat), np.array(smn), np.array(smx))
vthresh = cv2.inRange(np.array(val), np.array(vmn), np.array(vmx))
# Kết hợp các ảnh nhị phân lại với nhau
tracking = cv2.bitwise_and(hthresh, cv2.bitwise_and(sthresh, vthresh))
# Nới rộng các vùng trắng để nối các đối tượng gần nhau
dilation = cv2.dilate(tracking, kernel, iterations=1)
# Đóng các lỗ nhỏ trong các vùng trắng
closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)
# Vẽ các đường thẳng để chia thành các khu vực
cv2.line(frame, (width // 3, 0), (width // 3, height), (255, 0, 0), 2) # Đường thẳng giữa và bên trái
cv2.line(frame, (2 * width // 3, 0), (2 * width // 3, height), (255, 0, 0), 2) # Đường thẳng giữa và bên phải
cv2.line(frame, (0, height // 2), (width, height // 2), (0, 0, 255), 2) # Đường ngang chia trên và dưới
# Phát hiện các đối tượng tròn trong ảnh đã được làm mờ
circles = cv2.HoughCircles(closing, cv2.HOUGH_GRADIENT, 1, 20, param1=120, param2=120, minRadius=0, maxRadius=0)
countLeft = 0
countRight = 0
countCenter = 0
action = "Stop"
if circles is not None:
for i in circles[0, :]:
if int(round(i[2])):
cv2.circle(frame, (int(round(i[0])), int(round(i[1]))), int(round(i[2])), (0, 255, 0), 5)
cv2.circle(frame, (int(round(i[0])), int(round(i[1]))), 2, (0, 255, 0), 10)
center = (int(round(i[0])), int(round(i[1])))
# Xác định vị trí của quả bóng và thực hiện các hành động tương ứng
# if center[1] > height // 2:
if center[0] < width // 3:
countLeft += 1
elif center[0] > 2 * width // 3:
countRight += 1
else:
countCenter += 1
if countLeft >= countRight and countLeft > countCenter:
action = "Turn Left"
car.left()
print("Turn Left")
elif countRight >= countLeft and countRight > countCenter:
action = "Turn Right"
car.right()
print("Turn Right")
elif countCenter >= countLeft and countCenter > countRight:
action = "Go Ahead"
car.forward()
print("Go Ahead")
# elif countCenter + countLeft + countRight == 0:
# car.stop()
# print("Stop")
# Vẽ đường dẫn của đối tượng nếu có
if prev_center is not None:
cv2.line(frame, prev_center, center, (255, 255, 255), 2)
# Lưu tâm hiện tại cho lần lặp tiếp theo
prev_center = center
# Vẽ chữ và mũi tên
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, action, (50, 50), font, 1, (255, 255, 255), 2, cv2.LINE_AA)
# out.write(frame) # Ghi frame vào video output
# Hiển thị các thành phần của ảnh trong các cửa sổ tương ứng
cv2.imshow('HueComp', hthresh)
cv2.imshow('SatComp', sthresh)
cv2.imshow('ValComp', vthresh)
cv2.imshow('closing', closing)
cv2.imshow('tracking', frame)
# Phím thoát ứng dụng
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
# Giải phóng tài nguyên khi kết thúc
cap.release()
#out.release()
cv2.destroyAllWindows()