├── README.md └── main.cpp /README.md: -------------------------------------------------------------------------------- 1 | # hand-gesture-recognition-opencv 2 | 3 | Using OpenCV C++ API this program recognizes hand gestures and give different outputs according to hand gesture. 4 | -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | #include "opencv2/imgproc/imgproc.hpp" 2 | #include 3 | #include 4 | 5 | using namespace cv; 6 | using namespace std; 7 | 8 | int main( int argc, const char** argv) 9 | { 10 | 11 | 12 | VideoCapture cam(0); 13 | if(!cam.isOpened()){ 14 | cout<<"ERROR not opened "<< endl; 15 | return -1; 16 | } 17 | Mat img; 18 | Mat img_threshold; 19 | Mat img_gray; 20 | Mat img_roi; 21 | namedWindow("Original_image",CV_WINDOW_AUTOSIZE); 22 | namedWindow("Gray_image",CV_WINDOW_AUTOSIZE); 23 | namedWindow("Thresholded_image",CV_WINDOW_AUTOSIZE); 24 | namedWindow("ROI",CV_WINDOW_AUTOSIZE); 25 | char a[40]; 26 | int count =0; 27 | while(1){ 28 | bool b=cam.read(img); 29 | if(!b){ 30 | cout<<"ERROR : cannot read"< >contours; 41 | vectorhierarchy; 42 | findContours(img_threshold,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point()); 43 | if(contours.size()>0){ 44 | size_t indexOfBiggestContour = -1; 45 | size_t sizeOfBiggestContour = 0; 46 | 47 | for (size_t i = 0; i < contours.size(); i++){ 48 | if(contours[i].size() > sizeOfBiggestContour){ 49 | sizeOfBiggestContour = contours[i].size(); 50 | indexOfBiggestContour = i; 51 | } 52 | } 53 | vector >hull(contours.size()); 54 | vector >hullPoint(contours.size()); 55 | vector >defects(contours.size()); 56 | vector >defectPoint(contours.size()); 57 | vector >contours_poly(contours.size()); 58 | Point2f rect_point[4]; 59 | vectorminRect(contours.size()); 60 | vector boundRect(contours.size()); 61 | for(size_t i=0;i5000){ 63 | convexHull(contours[i],hull[i],true); 64 | convexityDefects(contours[i],hull[i],defects[i]); 65 | if(indexOfBiggestContour==i){ 66 | minRect[i]=minAreaRect(contours[i]); 67 | for(size_t k=0;k13*256){ 75 | /* int p_start=defects[i][k][0]; */ 76 | int p_end=defects[i][k][1]; 77 | int p_far=defects[i][k][2]; 78 | defectPoint[i].push_back(contours[i][p_far]); 79 | circle(img_roi,contours[i][p_end],3,Scalar(0,255,0),2); 80 | count++; 81 | } 82 | 83 | } 84 | 85 | if(count==1) 86 | strcpy(a,"Hello :D "); 87 | else if(count==2) 88 | strcpy(a,"Peace :) "); 89 | else if(count==3) 90 | strcpy(a,"3 it is !!"); 91 | else if(count==4) 92 | strcpy(a,"0100"); 93 | else if(count==5) 94 | strcpy(a,"FIVE"); 95 | else 96 | strcpy(a,"Welcome !!"); 97 | 98 | putText(img,a,Point(70,70),CV_FONT_HERSHEY_SIMPLEX,3,Scalar(255,0,0),2,8,false); 99 | drawContours(img_threshold, contours, i,Scalar(255,255,0),2, 8, vector(), 0, Point() ); 100 | drawContours(img_threshold, hullPoint, i, Scalar(255,255,0),1, 8, vector(),0, Point()); 101 | drawContours(img_roi, hullPoint, i, Scalar(0,0,255),2, 8, vector(),0, Point() ); 102 | approxPolyDP(contours[i],contours_poly[i],3,false); 103 | boundRect[i]=boundingRect(contours_poly[i]); 104 | rectangle(img_roi,boundRect[i].tl(),boundRect[i].br(),Scalar(255,0,0),2,8,0); 105 | minRect[i].points(rect_point); 106 | for(size_t k=0;k<4;k++){ 107 | line(img_roi,rect_point[k],rect_point[(k+1)%4],Scalar(0,255,0),2,8); 108 | } 109 | 110 | } 111 | } 112 | 113 | } 114 | imshow("Original_image",img); 115 | imshow("Gray_image",img_gray); 116 | imshow("Thresholded_image",img_threshold); 117 | imshow("ROI",img_roi); 118 | if(waitKey(30)==27){ 119 | return -1; 120 | } 121 | 122 | } 123 | 124 | } 125 | 126 | return 0; 127 | } 128 | 129 | 130 | --------------------------------------------------------------------------------