From e46a5c8a4668245cbfec8594e82b75d281feb739 Mon Sep 17 00:00:00 2001 From: Samik Gandhi Date: Sat, 5 Oct 2019 23:13:28 +0530 Subject: [PATCH] Readability, pretty printing Added some comments, made indentation and blank lines uniform --- gesture.py | 58 ++++++++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/gesture.py b/gesture.py index 23a4d3b..79b5391 100644 --- a/gesture.py +++ b/gesture.py @@ -1,13 +1,17 @@ import cv2 import numpy as np import math + +# pass source as 0 (zero) for inbuilt webcam, 1 for external camera cap = cv2.VideoCapture(0) -while(1): +while(True): + + try: + #an error comes if it does not find anything in window as it cannot find contour of max area + #therefore this try error statement - try: #an error comes if it does not find anything in window as it cannot find contour of max area - #therefore this try error statement - + #obtain frame and kernel matrix ret, frame = cap.read() frame=cv2.flip(frame,1) kernel = np.ones((3,3),np.uint8) @@ -15,58 +19,49 @@ #define region of interest roi=frame[100:300, 100:300] - + #convert to HSV cv2.rectangle(frame,(100,100),(300,300),(0,255,0),0) hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) - - - # define range of skin color in HSV + #define range of skin color in HSV lower_skin = np.array([0,20,70], dtype=np.uint8) upper_skin = np.array([20,255,255], dtype=np.uint8) - #extract skin colur imagw + #extract skin colur image mask = cv2.inRange(hsv, lower_skin, upper_skin) - - - - #extrapolate the hand to fill dark spots within + + #extrapolate the hand to fill dark spots within mask = cv2.dilate(mask,kernel,iterations = 4) - #blur the image + #blur the image mask = cv2.GaussianBlur(mask,(5,5),100) - - - #find contours + #find contours _,contours,hierarchy= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) - #find contour of max area(hand) + #find contour of max area(hand) cnt = max(contours, key = lambda x: cv2.contourArea(x)) - #approx the contour a little + #approx the contour a little epsilon = 0.0005*cv2.arcLength(cnt,True) approx= cv2.approxPolyDP(cnt,epsilon,True) - - #make convex hull around hand + #make convex hull around hand hull = cv2.convexHull(cnt) - #define area of hull and area of hand + #define area of hull and area of hand areahull = cv2.contourArea(hull) areacnt = cv2.contourArea(cnt) - #find the percentage of area not covered by hand in convex hull + #find the percentage of area not covered by hand in convex hull arearatio=((areahull-areacnt)/areacnt)*100 - #find the defects in convex hull with respect to hand + #find the defects in convex hull with respect to hand hull = cv2.convexHull(approx, returnPoints=False) defects = cv2.convexityDefects(approx, hull) - # l = no. of defects + #finding number of defects due to fingers (= l) l=0 - - #code for finding no. of defects due to fingers for i in range(defects.shape[0]): s,e,f,d = defects[i,0] start = tuple(approx[s][0]) @@ -75,7 +70,7 @@ pt= (100,180) - # find length of all sides of triangle + #find length of all sides of triangle a = math.sqrt((end[0] - start[0])**2 + (end[1] - start[1])**2) b = math.sqrt((far[0] - start[0])**2 + (far[1] - start[1])**2) c = math.sqrt((end[0] - far[0])**2 + (end[1] - far[1])**2) @@ -85,11 +80,10 @@ #distance between point and convex hull d=(2*ar)/a - # apply cosine rule here + #apply cosine rule here angle = math.acos((b**2 + c**2 - a**2)/(2*b*c)) * 57 - - # ignore angles > 90 and ignore points very close to convex hull(they generally come due to noise) + #ignore angles > 90 and ignore points very close to convex hull (generally noise induced points) if angle <= 90 and d>30: l += 1 cv2.circle(roi, far, 3, [255,0,0], -1) @@ -97,7 +91,7 @@ #draw lines around hand cv2.line(roi,start, end, [0,255,0], 2) - + #minimum one defect for hand l+=1 #print corresponding gestures which are in their ranges