-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathselect_color.py
88 lines (63 loc) · 2.05 KB
/
select_color.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
import cv2
import numpy as np
import matplotlib as plt
cap=cv2.VideoCapture(1)
i=0
# range of orange color
lower_color = np.array([18, 71, 100])
upper_color = np.array([25, 88, 100])
#define initial cX, cY
cX=-100
cY=-100
def plot_cX_cY(cX, cY):
Xs=[]
Ys=[]
Xs.append(cX)
Ys.append(cY)
plt.plot(Xs, Ys)
#select the color through clicking
def click_color(event, x, y, flags, params):
global lower_color, upper_color
if event == cv2.EVENT_LBUTTONDOWN:
selected_color=frame[y, x]
hsv_color=cv2.cvtColor(np.uint8([[selected_color]]), cv2.COLOR_BGR2HSV)
hue=hsv_color[0][0][0]
shade=hsv_color[0][0][1]
value=hsv_color[0][0][2]
lower_color=np.array([hue-10, shade-10, value-10])
upper_color=np.array([hue+10, shade+10, value+10])
print("Selected HSV Range is ",lower_color, upper_color)
while True:
ret, frame=cap.read()
if not ret:
break
#convert the color from bgr to hsv
hsv=cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#generate the mask
mask = cv2.inRange(hsv, lower_color, upper_color)
#from mask, generating the contour
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
perimeter=cv2.arcLength(contour, True)
approx=cv2.approxPolyDP(contour, 0.04*perimeter, True)
#calculating the center point
moments=cv2.moments(approx)
if moments["m00"]==0:
cX = int(moments["m10"])
cY = int(moments["m01"])
else:
cX = int(moments["m10"] / moments["m00"])
cY = int(moments["m01"] / moments["m00"])
circle=cv2.circle(hsv, (cX, cY), 5, (0, 255, 0), -1)
if i%100==0:
print(f"cX: {cX}, cY: {cY}")
i+=1
cv2.imshow("frame", hsv)
cv2.imshow("mask", mask)
cv2.setMouseCallback("frame", click_color)
i+=1
#'p' for existing the loop
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()