CHƯƠNG 3 : THIẾT KẾ HỆ THỐNG
3.3.1 Xử lý ảnh dùng ngôn ngữ lập trình Python
Thuật tốn xử lý ảnh:
Hình 3. 1: Thuật tốn xử lý ảnh
- Các công đoạn thực hiện xử lý ảnh : Thu nhận hình ảnh từ camera:
Hình 3. 2: Hình được chụp từ camera
Chuyển ảnh thu được sang khơng gian màu HSV.
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
Hình 3. 3: Chuyển sang không gian màu HSV
Chọn ngưỡng cho hệ màu HSV với các màu cần phân loại Với màu đỏ
red_lower = np.array([166, 84, 144], np.uint8) red_upper = np.array([186, 255, 255], np.uint8)
Với màu vàng
yellow_lower = np.array([23, 59, 119], np.uint8) yellow_upper = np.array([54, 255, 255], np.uint8)
Với màu xanh nước biển
blue_lower = np.array([97, 100, 117], np.uint8) blue_upper = np.array([117, 255, 255], np.uint8)
Hình 3. 4: Ảnh nhị phân
red_mask = cv2.inRange(hsv, red_lower, red_upper)
yellow_mask = cv2.inRange(hsv, yellow_lower, yellow_upper) blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
Lọc ra các màu được cài đặt
Hình 3. 5: Lọc ra vật màu đỏ
red_mask = cv2.dilate(red_mask, kernal)
res_red = cv2.bitwise_and(frame, frame, mask=red_mask) yellow_mask = cv2.dilate(yellow_mask, kernal)
res_yellow = cv2.bitwise_and(frame, frame, mask=yellow_mask) blue_mask = cv2.dilate(blue_mask, kernal)
res_blue = cv2.bitwise_and(frame, frame, mask=blue_mask)
Hình 3. 6: Khoanh vùng đối tượng và dán nhãn
contours, hierarchy = cv2.findContours(red_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for pic, contour in enumerate(contours): area = cv2.contourArea(contour)
if (area > 3000):
x, y, w, h = cv2.boundingRect(contour)
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.putText(frame, "Mau Do", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255))
print('Mau Do')
Arduino_serial.write('1'.encode())
contours, hierarchy = cv2.findContours(yellow_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for pic, contour in enumerate(contours): area = cv2.contourArea(contour)
if (area > 3000):
x, y, w, h = cv2.boundingRect(contour)
cv2.putText(frame, "Mau Vang", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 217))
print('Mau Vang')
Arduino_serial.write('2'.encode())
contours, hierarchy = cv2.findContours(blue_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for pic, contour in enumerate(contours): area = cv2.contourArea(contour)
if (area > 3000):
x, y, w, h = cv2.boundingRect(contour)
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.putText(frame, "Mau xanh", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0))
print('Mau xanh')
Arduino_serial.write('3'.encode()) Arduino_serial.write('0'.encode())
Đồng thời, ta phân loại thơng qua tín hiệu xuất hiện của đối tượng cần phân loại và gửi tín hiệu phân loại về Arduino.
Trong đó: 1 – màu đỏ 2 – màu vàng 3 – màu xanh