python opencv – filter contours by position

Question:

I use this code to find some blobs, and pick the biggest one.

contours, hierarchy = cv2.findContours(th1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
if len(contours) != 0:
    c = max(contours, key=cv2.contourArea)

Now, I would need to change this code in a way so it returns the contour that is in the middle of the frame. (its bounding box covers the center pixel of the image)

I am not able to figure out how to do this except getting the bounding box of all contours with

xbox, ybox, wbox, hbox = cv2.boundingRect(cont)

and then checking that x and y are smaller than the centere, and x+w and y+h aare bigger than the centre. It does not look like a efficient way tough, since there can be up to 500 small controus..

Asked By: sharkyenergy

||

Answers:

I’d like to suggest this approach, maybe there is a more straightforward one. I’m writing code here, but instead giving a possible algorithm:

  • Iterate over contours and draw each single contour using a mask in a binary mat (b/w and filled)
  • Check if the center pixel (image width/2, image height/2) is equal to 1

That should work.

Answered By: rok

There is a function in OpenCV that will check if a given point is inside a contour (returns a 1), on the boundary (returns a 0) or outside (returns a -1).

cv2.pointPolygonTest()

Answered By: DrBwts