diff --git a/check.py b/check.py new file mode 100644 index 0000000..530724d --- /dev/null +++ b/check.py @@ -0,0 +1,54 @@ +# import cv2 +# (width, height) = (130, 100) +# cap = cv2.VideoCapture(0) +# while (cap.isOpened()): +# ret, img = cap.read() +# img=cv2.flip(img, 1) +# cv2.rectangle(img, (20, 20), (250, 250), (255, 0, 0), 3) +# cv2.imshow("RGB Output", img) +# img1 = img[20:250,20:250] +# imCopy = img1.copy() +# gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) +# blur = cv2.GaussianBlur(gray, (5, 5), 0) +# ret, thresh1 = cv2.threshold(blur, 10, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) +# hand_resize = cv2.resize(thresh1, (width, height)) +# cv2.imshow("Threshold", thresh1) +# contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +# cv2.drawContours(imCopy, contours, -1, (0, 255, 0)) +# cv2.imshow('Draw Contours', imCopy) + +# k = 0xFF & cv2.waitKey(10) +# if k == 27: +# break + +# cap.release() +# cv2.destroyAllWindows() + +# STATIC IMAGES INPUT + +import cv2 +img = cv2.imread('img.jpg') +cv2.imshow("Original Image", img) +img1 = cv2.resize(img, (300, 300)) +cv2.imshow("Resized image", img1) +# ret, img = cap.read() +img2=cv2.flip(img1, 1) +cv2.imshow("Flipped image", img2) +cv2.rectangle(img2, (20, 20), (250, 250), (255, 0, 0), 3) +cv2.imshow("RGB Output", img2) +img3 = img2[20:250,20:250] +imCopy = img3.copy() +gray = cv2.cvtColor(img3, cv2.COLOR_BGR2GRAY) +cv2.imshow("grayscale",gray) +blur = cv2.GaussianBlur(gray, (5, 5), 0) +cv2.imshow("GaussianBlur",blur) +ret, thresh1 = cv2.threshold(blur, 10, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) +hand_resize = cv2.resize(thresh1, (500, 400)) +cv2.imshow("Threshold", thresh1) +contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) +cv2.drawContours(imCopy, contours, -1, (0, 0, 0)) +cv2.imshow('Draw Contours', imCopy) +# cv2.imshow("Image", img2) +interrupt = cv2.waitKey(0) & 0xFF +if interrupt == 27: + cv2.destroyAllWindows() diff --git a/collect-data.py b/collect-data.py new file mode 100644 index 0000000..e62e181 --- /dev/null +++ b/collect-data.py @@ -0,0 +1,79 @@ +import cv2 +import os + +if not os.path.exists("data"): + os.makedirs("data") + os.makedirs("data/train") + os.makedirs("data/train/0") + os.makedirs("data/train/1") + os.makedirs("data/train/2") + os.makedirs("data/train/3") + os.makedirs("data/train/4") + os.makedirs("data/train/5") + + +mode = 'train' +directory = 'data/'+mode+'/' + +# url = '/video' +# cap=cv2.VideoCapture(url) + +cap=cv2.VideoCapture(0) + +while True: + _, frame = cap.read() + frame = cv2.flip(frame, 1) + + cv2.putText(frame, "Sayak-Rana", (160, 240), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 3) + + count = {'zero': len(os.listdir(directory+"/0")), + 'one': len(os.listdir(directory+"/1")), + 'two': len(os.listdir(directory+"/2")), + 'three': len(os.listdir(directory+"/3")), + 'four': len(os.listdir(directory+"/4")), + 'five': len(os.listdir(directory+"/5"))} + + cv2.putText(frame, "MODE : "+mode, (10, 50), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + cv2.putText(frame, "IMAGE COUNT", (10, 90), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + cv2.putText(frame, "ZERO : "+str(count['zero']), (10, 115), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + cv2.putText(frame, "ONE : "+str(count['one']), (10, 140), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + cv2.putText(frame, "TWO : "+str(count['two']), (10, 165), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + cv2.putText(frame, "THREE : "+str(count['three']), (10, 190), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + cv2.putText(frame, "FOUR : "+str(count['four']), (10, 215), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + cv2.putText(frame, "FIVE : "+str(count['five']), (10, 240), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,0), 1) + + + x1 = int(0.5*frame.shape[1]) + y1 = 10 + x2 = frame.shape[1]-10 + y2 = int(0.5*frame.shape[1]) + cv2.rectangle(frame, (x1-1, y1-1), (x2+1, y2+1), (255,0,0) ,3) + roi = frame[y1:y2, x1:x2] + roi = cv2.resize(roi, (200, 200)) + cv2.putText(frame, "R.O.I", (440, 350), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,225,0), 3) + cv2.imshow("Frame", frame) + + roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) + _, roi = cv2.threshold(roi, 120, 255, cv2.THRESH_OTSU) + cv2.imshow("ROI", roi) + + + + interrupt = cv2.waitKey(10) + if interrupt & 0xFF == 27: + break + if interrupt & 0xFF == ord('0'): + cv2.imwrite(directory+'0/'+str(count['zero'])+'.jpg', roi) + if interrupt & 0xFF == ord('1'): + cv2.imwrite(directory+'1/'+str(count['one'])+'.jpg', roi) + if interrupt & 0xFF == ord('2'): + cv2.imwrite(directory+'2/'+str(count['two'])+'.jpg', roi) + if interrupt & 0xFF == ord('3'): + cv2.imwrite(directory+'3/'+str(count['three'])+'.jpg', roi) + if interrupt & 0xFF == ord('4'): + cv2.imwrite(directory+'4/'+str(count['four'])+'.jpg', roi) + if interrupt & 0xFF == ord('5'): + cv2.imwrite(directory+'5/'+str(count['five'])+'.jpg', roi) + +cap.release() +cv2.destroyAllWindows() diff --git a/defects.py b/defects.py new file mode 100644 index 0000000..5df986c --- /dev/null +++ b/defects.py @@ -0,0 +1,69 @@ +import cv2 +import numpy as np +import math + +cap=cv2.VideoCapture(0) + +while(cap.isOpened()): + ret, img = cap.read() + img=cv2.flip(img, 1) + cv2.rectangle(img,(20,20),(250,250),(255,0,0),3) + crop_img = img[20:250, 20:250] + grey = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY) + value = (35, 35) + blurred = cv2.GaussianBlur(grey, value, 0) + _, thresh1 = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) + contours, hierarchy = cv2.findContours(thresh1.copy(),cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) + cnt = max(contours, key = lambda x: cv2.contourArea(x)) + x,y,w,h = cv2.boundingRect(cnt) + cv2.rectangle(crop_img,(x,y),(x+w,y+h),(0,0,255),0) + + hull = cv2.convexHull(cnt) + drawing = np.zeros(crop_img.shape,np.uint8) + + cv2.drawContours(drawing,[cnt],0,(0,255,0),0) + cv2.drawContours(drawing,[hull],0,(0,0,255),0) + + hull = cv2.convexHull(cnt,returnPoints = False) + defects = cv2.convexityDefects(cnt,hull) + + count_defects = 0 + cv2.drawContours(thresh1, contours, -1, (0,255,0), 3) + + for i in range(defects.shape[0]): + s,e,f,d = defects[i,0] + start = tuple(cnt[s][0]) + end = tuple(cnt[e][0]) + far = tuple(cnt[f][0]) + 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) + angle = math.acos((b**2 + c**2 - a**2)/(2*b*c)) * 57 + + if angle <= 90: + count_defects += 1 + cv2.circle(crop_img,far,1,[0,0,255],-1) + + cv2.line(crop_img,start,end,[0,255,0],2) + + if count_defects == 1: + cv2.putText(img,"Number : 2", (50,450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1) + elif count_defects == 2: + cv2.putText(img, "Number : 3", (50,450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1) + elif count_defects == 3: + cv2.putText(img,"Number : 4", (50,450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1) + elif count_defects == 4: + cv2.putText(img,"Number : 5", (50,450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1) + elif count_defects == 5: + cv2.putText(img,"Number : 6", (50,450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1) + else: + cv2.putText(img,"Number : 1", (50,450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1) + + cv2.imshow('Gesture', img) + cv2.imshow('Contours', drawing) + cv2.imshow('Defects', crop_img) + cv2.imshow('Binary Image', thresh1) + + k = cv2.waitKey(10) + if k == 27: + break diff --git a/img.jpg b/img.jpg new file mode 100644 index 0000000..75a2498 Binary files /dev/null and b/img.jpg differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..dc110d2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,40 @@ +absl-py==0.14.1 +astunparse==1.6.3 +cachetools==4.2.4 +certifi==2021.5.30 +charset-normalizer==2.0.6 +clang==5.0 +flatbuffers==1.12 +gast==0.4.0 +google-auth==1.35.0 +google-auth-oauthlib==0.4.6 +google-pasta==0.2.0 +grpcio==1.41.0 +h5py==3.1.0 +idna==3.2 +keras==2.6.0 +Keras-Preprocessing==1.1.2 +Markdown==3.3.4 +numpy==1.19.5 +oauthlib==3.1.1 +opencv-python==4.5.3.56 +opt-einsum==3.3.0 +Pillow==8.4.0 +protobuf==3.18.0 +pyasn1==0.4.8 +pyasn1-modules==0.2.8 +requests==2.26.0 +requests-oauthlib==1.3.0 +rsa==4.7.2 +scipy==1.7.1 +six==1.15.0 +tensorboard==2.6.0 +tensorboard-data-server==0.6.1 +tensorboard-plugin-wit==1.8.0 +tensorflow==2.6.0 +tensorflow-estimator==2.6.0 +termcolor==1.1.0 +typing-extensions==3.7.4.3 +urllib3==1.26.7 +Werkzeug==2.0.1 +wrapt==1.12.1 \ No newline at end of file