You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.9 KiB
127 lines
3.9 KiB
3 years ago
|
import cv2
|
||
|
import numpy as np
|
||
|
from bsp import *
|
||
|
|
||
|
# Подключаемся к камере
|
||
|
cam = cv2.VideoCapture(0)
|
||
|
|
||
|
# Мотор
|
||
|
m = motor()
|
||
|
speed = 10
|
||
|
|
||
|
while True:
|
||
|
_, frame = cam.read()
|
||
|
# Перевод изображения в HSV
|
||
|
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
|
||
|
# Немного размываем изображение
|
||
|
hsv = cv2.blur(hsv,(5,5))
|
||
|
|
||
|
# Задаем параметр из прошлого примера
|
||
|
mask = cv2.inRange(hsv, (0,190,129),(21,255,255))
|
||
|
|
||
|
# С помощью специального алгоритма ищем контур обьекта
|
||
|
(contours, hierarchy) = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
||
|
# Отрисовывем найденый контур чтобы его было видно на экране
|
||
|
cv2.drawContours(frame, contours, -1, (255,0,0), 3, cv2.LINE_AA, hierarchy, 1 )
|
||
|
|
||
|
max_radius = 0
|
||
|
center = (0,0)
|
||
|
|
||
|
# Находим контур с максимальным радиусом
|
||
|
x = 0
|
||
|
y = 0
|
||
|
|
||
|
for contour in contours:
|
||
|
(x,y),radius = cv2.minEnclosingCircle(contour)
|
||
|
if max_radius < int(radius):
|
||
|
max_radius = int(radius)
|
||
|
center = (int(x),int(y))
|
||
|
|
||
|
# Описываем максимальный контур кругом
|
||
|
frame = cv2.circle(frame,center,max_radius,(0,255,0),2)
|
||
|
|
||
|
S = 3.1415 * max_radius * max_radius
|
||
|
# Выводим на эран площадь круга
|
||
|
cv2.putText(frame, "S: " + str(S) + " X: " + str(x) + " Y: " + str(y), (30, 30),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 10, 10), 2)
|
||
|
|
||
|
# # Выводим сообщение если круг слишком близко или далеко
|
||
|
# if S > 100:
|
||
|
# if S > 80000:
|
||
|
# cv2.putText(frame, "backward", (30, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 10, 10), 2)
|
||
|
# m.backward(speed)
|
||
|
# elif S < 40000:
|
||
|
# cv2.putText(frame, "forward", (30, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 10, 10), 2)
|
||
|
# m.forward(speed)
|
||
|
# else:
|
||
|
# m.stop()
|
||
|
|
||
|
|
||
|
|
||
|
delta = 100
|
||
|
max_x = 640
|
||
|
if (x < max_x/2 - delta):
|
||
|
m.left(speed)
|
||
|
time.sleep(0.3)
|
||
|
m.stop()
|
||
|
time.sleep(0.1)
|
||
|
elif (x > max_x/2 + delta):
|
||
|
m.right(speed)
|
||
|
time.sleep(0.3)
|
||
|
m.stop()
|
||
|
time.sleep(0.1)
|
||
|
else:
|
||
|
if S > 100 and S < 40000:
|
||
|
m.forward(speed)
|
||
|
else:
|
||
|
m.stop()
|
||
|
|
||
|
# # конечный автомат:
|
||
|
# # 0 - центрирование относительно метки
|
||
|
# # 1 - Подбезжаем к метке
|
||
|
# # 2 - ожидаем выхода
|
||
|
# state = 0
|
||
|
# delta = 100
|
||
|
# max_x = 640
|
||
|
|
||
|
# if state == 0:
|
||
|
# if (x < max_x/2 - delta):
|
||
|
# m.left(speed)
|
||
|
# elif (x > max_x/2 + delta):
|
||
|
# m.right(speed)
|
||
|
# else:
|
||
|
# state = 1
|
||
|
|
||
|
# elif state == 1:
|
||
|
# if (S < 7000):
|
||
|
# m.forward(speed)
|
||
|
# else:
|
||
|
# state = 2
|
||
|
|
||
|
# if (x < max_x/2 - delta or x > max_x/2 - delta):
|
||
|
# state = 0
|
||
|
# else:
|
||
|
# if (x < max_x/2 - delta or x > max_x/2 - delta):
|
||
|
# state = 0
|
||
|
# elif (S < 7000):
|
||
|
# state = 1
|
||
|
# else:
|
||
|
# time.sleep(1)
|
||
|
|
||
|
# cv2.putText(frame, "State: " + str(state), (30, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 10, 10), 2)
|
||
|
|
||
|
|
||
|
# Промежуточные изображения
|
||
|
#cv2.imshow("Image with opening", mask)
|
||
|
#cv2.imshow("Image with closing", hsv)
|
||
|
|
||
|
# выводим то что получилось вместе с текстом и контуром
|
||
|
cv2.imshow("Image", frame)
|
||
|
|
||
|
# m.stop()
|
||
|
# time.sleep(1)
|
||
|
|
||
|
k = cv2.waitKey(2)
|
||
|
if k == 27:
|
||
|
cv2.destroyAllWindows()
|
||
|
break
|