diff --git a/Python/Final/Direction.py b/Python/Final/Direction.py new file mode 100644 index 0000000..84981ef --- /dev/null +++ b/Python/Final/Direction.py @@ -0,0 +1,97 @@ +import cv2 +import numpy as np +import math +import imutils +import matplotlib.pyplot as plt + +def FindContours(img): + imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) + ret,thresh = cv2.threshold(imgray,127,255,0) + _,contours,hierarchy = cv2.findContours(thresh, 1, 2) + return contours + +def EnhanceBrightness(frame, n): + imgHLS = cv2.cvtColor(frame, cv2.COLOR_BGR2HLS) + imgHLS[:,:,1] += n + imgLight = cv2.cvtColor(imgHLS, cv2.COLOR_HLS2BGR) + return imgLight + +def Filter(lightFrame): + kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) + img = cv2.filter2D(lightFrame, -1, kernel) + filtered = cv2.bilateralFilter(img, 5, 150, 150) + return filtered + +def FindArrow(frame): + size = 0 + height, width, channels = frame.shape + mask = np.zeros((height, width, 3), dtype = "uint8") + contours = FindContours(frame) + for cnt in contours: + tmp = cv2.contourArea(cnt) + approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True) + if len(approx) > 6 and len(approx) < 9 and tmp > 1000 and tmp < 20000: + cv2.drawContours(mask, [cnt], 0, (255,255,255), -1) + size = tmp + arrows = cv2.bitwise_and(frame, mask) + return size, arrows, mask + +def FindOrientation(imgArrow): + x = 0 + y = 0 + w = 0 + h = 0 + contours = FindContours(imgArrow) + for cnt in contours: + tmp = cv2.contourArea(cnt) + M = cv2.moments(cnt) + if tmp > 1000 : + x,y,w,h = cv2.boundingRect(cnt) + if x != 0: + verticale = math.sqrt(math.pow((x-x), 2)+math.pow((y-(y+h)), 2)) + horizontale = math.sqrt(math.pow((x-(x+w)),2)+math.pow((y-y),2)) + centerCoord = (x + verticale/2, (x+w)+(horizontale/2)) + + extLeft, extRight, extTop, extBot = FindExtremPoints(imgArrow) + droite = math.sqrt(math.pow((extTop[0] - extRight[0]), 2)+math.pow((extTop[1] - extRight[1]), 2)) + gauche = math.sqrt(math.pow((extLeft[0] - extTop[0]), 2)+math.pow((extLeft[1] - extTop[1]), 2)) + haut = math.sqrt(math.pow((extTop[0] - extRight[0]), 2)+math.pow((extTop[1] - extRight[1]), 2)) + bas = math.sqrt(math.pow((extRight[0] - extBot[0]), 2)+math.pow((extRight[1] - extBot[1]), 2)) + + if (horizontale > verticale) and (droite < gauche): + print("droite") + return 1 + elif (horizontale > verticale) and (gauche < droite): + print("gauche") + return 2 + elif (verticale > horizontale) and (haut < bas): + print ("haut") + return 3 + elif (verticale > horizontale) and (bas < haut): + print ("bas") + return 4 + else : + print ("NULL") + return -1 + else : + return -1 + +def FindExtremPoints(imgArrow): + imgray = cv2.cvtColor(imgArrow,cv2.COLOR_BGR2GRAY) + ret,thresh = cv2.threshold(imgray,127,255,0) + cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + cnts = imutils.grab_contours(cnts) + c = max(cnts, key=cv2.contourArea) + extLeft = tuple(c[c[:, :, 0].argmin()][0]) + extRight = tuple(c[c[:, :, 0].argmax()][0]) + extTop = tuple(c[c[:, :, 1].argmin()][0]) + extBot = tuple(c[c[:, :, 1].argmax()][0]) + return extLeft, extRight, extTop, extBot + +def Direction(frame) : + imgLight = EnhanceBrightness(frame, 3) + imgFiltered = Filter(imgLight) + imgFiltered = EnhanceBrightness(imgFiltered, 2) + size, imgArrows, mask = FindArrow(imgFiltered) + orientation = FindOrientation(imgArrows) + return orientation -- libgit2 0.21.2