Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Readability, pretty printing #3

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 26 additions & 32 deletions gesture.py
Original file line number Diff line number Diff line change
@@ -1,72 +1,67 @@
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)

#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)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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])
Expand All @@ -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)
Expand All @@ -85,19 +80,18 @@
#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)

#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
Expand Down