title: How to check if a point is inside a set of contours
body: <p><a href="https://i.stack.imgur.com/zpbVh.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/zpbVh.png" alt="enter image description here"></a></p>
  
  <p>Hello to everyone. The above image is sum of two images in which i did feature matching and draw all matching points. I also found the contours of the pcb parts in the first image (half left image-3 contours). The question is, how could i draw only the matching points that is inside those contours in the first image instead this blue mess? I'm using python 2.7 and opencv 2.4.12.</p>
  
  <p>I wrote a function for draw matches cause in opencv 2.4.12 there isn't any implemented method for that. If i didn't include something please tell me. Thank you in advance!</p>
  
  <pre><code>import numpy as np
  import cv2
  
  def drawMatches(img1, kp1, img2, kp2, matches):
  
      # Create a new output image that concatenates the two images
      # (a.k.a) a montage
      rows1 = img1.shape[0]
      cols1 = img1.shape[1]
      rows2 = img2.shape[0]
      cols2 = img2.shape[1]
  
      # Create the output image
      # The rows of the output are the largest between the two images
      # and the columns are simply the sum of the two together
      # The intent is to make this a colour image, so make this 3 channels
      out = np.zeros((max([rows1,rows2]),cols1+cols2,3), dtype='uint8')
  
      # Place the first image to the left
      out[:rows1,:cols1] = np.dstack([img1, img1, img1])
  
      # Place the next image to the right of it
      out[:rows2,cols1:] = np.dstack([img2, img2, img2])
  
      # For each pair of points we have between both images
      # draw circles, then connect a line between them
      for mat in matches:
  
          # Get the matching keypoints for each of the images
          img1_idx = mat.queryIdx
          img2_idx = mat.trainIdx
  
          # x - columns
          # y - rows
          (x1,y1) = kp1[img1_idx].pt
          (x2,y2) = kp2[img2_idx].pt
  
          # Draw a small circle at both co-ordinates
          # radius 4
          # colour blue
          # thickness = 1
          cv2.circle(out, (int(x1),int(y1)), 4, (255, 0, 0), 1)
          cv2.circle(out, (int(x2)+cols1,int(y2)), 4, (255, 0, 0), 1)
  
          # Draw a line in between the two points
          # thickness = 1
          # colour blue
          cv2.line(out, (int(x1),int(y1)), (int(x2)+cols1,int(y2)), (255,0,0), 1)
  
  
      # Show the image
      cv2.imshow('Matched Features', out)
      cv2.imwrite("shift_points.png", out)
      cv2.waitKey(0)
      cv2.destroyWindow('Matched Features')
  
      # Also return the image if you'd like a copy
      return out
  
  
  img1 = cv2.imread('pic3.png', 0) # Original image - ensure grayscale
  img2 = cv2.imread('pic1.png', 0) # Rotated image - ensure grayscale
  
  sift = cv2.SIFT()
  
  # find the keypoints and descriptors with SIFT
  kp1, des1 = sift.detectAndCompute(img1,None)
  kp2, des2 = sift.detectAndCompute(img2,None)
  
  # Create matcher
  bf = cv2.BFMatcher()
  
  # Perform KNN matching
  matches = bf.knnMatch(des1, des2, k=2)
  
  # Apply ratio test
  good = []
  for m,n in matches:
      if m.distance &lt; 0.75*n.distance:
         # Add first matched keypoint to list
         # if ratio test passes
         good.append(m)
  
  # Show only the top 10 matches - also save a copy for use later
  out = drawMatches(img1, kp1, img2, kp2, good)
  </code></pre>