Commit e5aee48e949c4abed201855ab98d428d5e5451a7
1 parent
0ec8f11a
ajout du programme pour trouver la direction
Showing
1 changed file
with
97 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,97 @@ | @@ -0,0 +1,97 @@ | ||
1 | +import cv2 | ||
2 | +import numpy as np | ||
3 | +import math | ||
4 | +import imutils | ||
5 | +import matplotlib.pyplot as plt | ||
6 | + | ||
7 | +def FindContours(img): | ||
8 | + imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) | ||
9 | + ret,thresh = cv2.threshold(imgray,127,255,0) | ||
10 | + _,contours,hierarchy = cv2.findContours(thresh, 1, 2) | ||
11 | + return contours | ||
12 | + | ||
13 | +def EnhanceBrightness(frame, n): | ||
14 | + imgHLS = cv2.cvtColor(frame, cv2.COLOR_BGR2HLS) | ||
15 | + imgHLS[:,:,1] += n | ||
16 | + imgLight = cv2.cvtColor(imgHLS, cv2.COLOR_HLS2BGR) | ||
17 | + return imgLight | ||
18 | + | ||
19 | +def Filter(lightFrame): | ||
20 | + kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) | ||
21 | + img = cv2.filter2D(lightFrame, -1, kernel) | ||
22 | + filtered = cv2.bilateralFilter(img, 5, 150, 150) | ||
23 | + return filtered | ||
24 | + | ||
25 | +def FindArrow(frame): | ||
26 | + size = 0 | ||
27 | + height, width, channels = frame.shape | ||
28 | + mask = np.zeros((height, width, 3), dtype = "uint8") | ||
29 | + contours = FindContours(frame) | ||
30 | + for cnt in contours: | ||
31 | + tmp = cv2.contourArea(cnt) | ||
32 | + approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True) | ||
33 | + if len(approx) > 6 and len(approx) < 9 and tmp > 1000 and tmp < 20000: | ||
34 | + cv2.drawContours(mask, [cnt], 0, (255,255,255), -1) | ||
35 | + size = tmp | ||
36 | + arrows = cv2.bitwise_and(frame, mask) | ||
37 | + return size, arrows, mask | ||
38 | + | ||
39 | +def FindOrientation(imgArrow): | ||
40 | + x = 0 | ||
41 | + y = 0 | ||
42 | + w = 0 | ||
43 | + h = 0 | ||
44 | + contours = FindContours(imgArrow) | ||
45 | + for cnt in contours: | ||
46 | + tmp = cv2.contourArea(cnt) | ||
47 | + M = cv2.moments(cnt) | ||
48 | + if tmp > 1000 : | ||
49 | + x,y,w,h = cv2.boundingRect(cnt) | ||
50 | + if x != 0: | ||
51 | + verticale = math.sqrt(math.pow((x-x), 2)+math.pow((y-(y+h)), 2)) | ||
52 | + horizontale = math.sqrt(math.pow((x-(x+w)),2)+math.pow((y-y),2)) | ||
53 | + centerCoord = (x + verticale/2, (x+w)+(horizontale/2)) | ||
54 | + | ||
55 | + extLeft, extRight, extTop, extBot = FindExtremPoints(imgArrow) | ||
56 | + droite = math.sqrt(math.pow((extTop[0] - extRight[0]), 2)+math.pow((extTop[1] - extRight[1]), 2)) | ||
57 | + gauche = math.sqrt(math.pow((extLeft[0] - extTop[0]), 2)+math.pow((extLeft[1] - extTop[1]), 2)) | ||
58 | + haut = math.sqrt(math.pow((extTop[0] - extRight[0]), 2)+math.pow((extTop[1] - extRight[1]), 2)) | ||
59 | + bas = math.sqrt(math.pow((extRight[0] - extBot[0]), 2)+math.pow((extRight[1] - extBot[1]), 2)) | ||
60 | + | ||
61 | + if (horizontale > verticale) and (droite < gauche): | ||
62 | + print("droite") | ||
63 | + return 1 | ||
64 | + elif (horizontale > verticale) and (gauche < droite): | ||
65 | + print("gauche") | ||
66 | + return 2 | ||
67 | + elif (verticale > horizontale) and (haut < bas): | ||
68 | + print ("haut") | ||
69 | + return 3 | ||
70 | + elif (verticale > horizontale) and (bas < haut): | ||
71 | + print ("bas") | ||
72 | + return 4 | ||
73 | + else : | ||
74 | + print ("NULL") | ||
75 | + return -1 | ||
76 | + else : | ||
77 | + return -1 | ||
78 | + | ||
79 | +def FindExtremPoints(imgArrow): | ||
80 | + imgray = cv2.cvtColor(imgArrow,cv2.COLOR_BGR2GRAY) | ||
81 | + ret,thresh = cv2.threshold(imgray,127,255,0) | ||
82 | + cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) | ||
83 | + cnts = imutils.grab_contours(cnts) | ||
84 | + c = max(cnts, key=cv2.contourArea) | ||
85 | + extLeft = tuple(c[c[:, :, 0].argmin()][0]) | ||
86 | + extRight = tuple(c[c[:, :, 0].argmax()][0]) | ||
87 | + extTop = tuple(c[c[:, :, 1].argmin()][0]) | ||
88 | + extBot = tuple(c[c[:, :, 1].argmax()][0]) | ||
89 | + return extLeft, extRight, extTop, extBot | ||
90 | + | ||
91 | +def Direction(frame) : | ||
92 | + imgLight = EnhanceBrightness(frame, 3) | ||
93 | + imgFiltered = Filter(imgLight) | ||
94 | + imgFiltered = EnhanceBrightness(imgFiltered, 2) | ||
95 | + size, imgArrows, mask = FindArrow(imgFiltered) | ||
96 | + orientation = FindOrientation(imgArrows) | ||
97 | + return orientation |