title: How to detect number of fingers and add double digits using opencv?
body: <p>I am new to OpenCV and image processing. I am trying to create a program that detects the number of fingers displayed in front of the camera and add them. 
  After searching GitHub for a while, I found a project that detects a hand and counts the number of fingers in it. </p>
  
  <p>The problem I am facing during the execution is that unless and until my background is plain, it won't show me a number. It keeps changing numbers. How can I stabilise that? As I need to add up the numbers displayed in front of the screen, I cannot store the number unless it's stable. </p>
  
  <pre><code>import traceback
  import cv2
  import numpy as np
  import math
  
  
  cap = cv2.VideoCapture(0)
  
  while(1):
  
      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
  
          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]
  
  
          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
          lower_skin = np.array([0,20,70], dtype=np.uint8)
          upper_skin = np.array([20,255,255], dtype=np.uint8)
  
       #extract skin colur imagw  
          mask = cv2.inRange(hsv, lower_skin, upper_skin)
  
  
  
      #extrapolate the hand to fill dark spots within
          mask = cv2.dilate(mask,kernel,iterations = 4)
  
      #blur the image
          mask = cv2.GaussianBlur(mask,(5,5),100) 
  
      #find contours
          contours,hierarchy= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
          print(contours)
          print(hierarchy)
     #find contour of max area(hand)
          cnt = max(contours, key = lambda x: cv2.contourArea(x))
  
      #approx the contour a little
          epsilon = 0.0005*cv2.arcLength(cnt,True)
          approx= cv2.approxPolyDP(cnt,epsilon,True)
  
  
      #make convex hull around hand
          hull = cv2.convexHull(cnt)
  
       #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
          arearatio=((areahull-areacnt)/areacnt)*100
  
       #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
          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])
              end = tuple(approx[e][0])
              far = tuple(approx[f][0])
              pt= (100,180)
  
  
              # 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)
              s = (a+b+c)/2
              ar = math.sqrt(s*(s-a)*(s-b)*(s-c))
  
              #distance between point and convex hull
              d=(2*ar)/a
  
              # apply cosine rule here
              angle = math.acos((b**2 + c**2 - a**2)/(2*b*c)) * 57
  
  
              # ignore angles &gt; 90 and ignore points very close to convex hull(they generally come due to noise)
              if angle &lt;= 90 and d&gt;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)
  
  
          l+=1
  
          #print corresponding gestures which are in their ranges
          font = cv2.FONT_HERSHEY_SIMPLEX
          if l==1:
              if areacnt&lt;2000:
                  cv2.putText(frame,'Put hand in the box',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
              else:
                  if arearatio&lt;12:
                      cv2.putText(frame,'0',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
                  elif arearatio&lt;17.5:
                      cv2.putText(frame,'Best of luck',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
                  else:
                      cv2.putText(frame,'1',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
          elif l==2:
              cv2.putText(frame,'2',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
          elif l==3:
  
                if arearatio&lt;27:
                      cv2.putText(frame,'3',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
                else:
                      cv2.putText(frame,'ok',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
          elif l==4:
              cv2.putText(frame,'4',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
          elif l==5:
              cv2.putText(frame,'5',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
          elif l==6:
              cv2.putText(frame,'reposition',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
          else :
              cv2.putText(frame,'reposition',(10,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
  
          #show the windows
          cv2.imshow('mask',mask)
          cv2.imshow('frame',frame)
      except Exception:
          traceback.print_exc()
          pass
         # break
  
  
      k = cv2.waitKey(5) &amp; 0xFF
      if k == 27:
          break
  
  cv2.destroyAllWindows()
  cap.release()
  </code></pre>
  
  <p>This is the complete code.
  I feel that the HSV range for skin color is not accurate. I am a brown Indian and in the mask screen where it makes skin range colors to white and the rest to 1, I can see some areas in my palm are black. </p>
  
  <p>Is there a way where I can add double digits by keeping a time constraint? 
  For example,  when I show 5 and within 1 second, if I show 3, it should take the input as 53. </p>
  
  <p>An answer with some example or demonstration would be of great help. 
  Thank you.</p>