Python cv2.RETR_TREE Examples
The following are 30
code examples of cv2.RETR_TREE().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
cv2
, or try the search function
.
Example #1
Source File: chapter2.py From OpenCV-Computer-Vision-Projects-with-Python with MIT License | 19 votes |
def FindHullDefects(self, segment): _,contours,hierarchy = cv2.findContours(segment, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # find largest area contour max_area = -1 for i in range(len(contours)): area = cv2.contourArea(contours[i]) if area>max_area: cnt = contours[i] max_area = area cnt = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True) hull = cv2.convexHull(cnt, returnPoints=False) defects = cv2.convexityDefects(cnt, hull) return [cnt,defects]
Example #2
Source File: pycv2.py From vrequest with MIT License | 16 votes |
def laplacian(filepathname): v = cv2.imread(filepathname) s = cv2.cvtColor(v, cv2.COLOR_BGR2GRAY) s = cv2.Laplacian(s, cv2.CV_16S, ksize=3) s = cv2.convertScaleAbs(s) cv2.imshow('nier',s) return s # ret, binary = cv2.threshold(s,40,255,cv2.THRESH_BINARY) # contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) # for c in contours: # x,y,w,h = cv2.boundingRect(c) # if w>5 and h>10: # cv2.rectangle(v,(x,y),(x+w,y+h),(155,155,0),1) # cv2.imshow('nier2',v) # cv2.waitKey() # cv2.destroyAllWindows()
Example #3
Source File: generate_coco_json.py From coco-json-converter with GNU General Public License v3.0 | 14 votes |
def __get_annotation__(self, mask, image=None): _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) segmentation = [] for contour in contours: # Valid polygons have >= 6 coordinates (3 points) if contour.size >= 6: segmentation.append(contour.flatten().tolist()) RLEs = cocomask.frPyObjects(segmentation, mask.shape[0], mask.shape[1]) RLE = cocomask.merge(RLEs) # RLE = cocomask.encode(np.asfortranarray(mask)) area = cocomask.area(RLE) [x, y, w, h] = cv2.boundingRect(mask) if image is not None: image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) cv2.drawContours(image, contours, -1, (0,255,0), 1) cv2.rectangle(image,(x,y),(x+w,y+h), (255,0,0), 2) cv2.imshow("", image) cv2.waitKey(1) return segmentation, [x, y, w, h], area
Example #4
Source File: pycv2.py From vrequest with MIT License | 8 votes |
def canny(filepathname, left=70, right=140): v = cv2.imread(filepathname) s = cv2.cvtColor(v, cv2.COLOR_BGR2GRAY) s = cv2.Canny(s, left, right) cv2.imshow('nier',s) return s # 圈出最小方矩形框,这里Canny算法后都是白色线条,所以取色范围 127-255 即可。 # ret, binary = cv2.threshold(s,127,255,cv2.THRESH_BINARY) # contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) # for c in contours: # x,y,w,h = cv2.boundingRect(c) # if w>5 and h>10: # 有约束的画框 # cv2.rectangle(v,(x,y),(x+w,y+h),(155,155,0),1) # # cv2.drawContours(s,contours,-1,(0,0,255),3) # 画所有框 # cv2.imshow('nier2',v) # cv2.waitKey() # cv2.destroyAllWindows()
Example #5
Source File: page.py From doc2text with MIT License | 7 votes |
def find_components(im, max_components=16): """Dilate the image until there are just a few connected components. Returns contours for these components.""" kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) dilation = dilate(im, kernel, 6) count = 21 n = 0 sigma = 0.000 while count > max_components: n += 1 sigma += 0.005 result = cv2.findContours(dilation, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) if len(result) == 3: _, contours, hierarchy = result elif len(result) == 2: contours, hierarchy = result possible = find_likely_rectangles(contours, sigma) count = len(possible) return (dilation, possible, n)
Example #6
Source File: helpers.py From DEXTR-KerasTensorflow with GNU General Public License v3.0 | 7 votes |
def overlay_masks(im, masks, alpha=0.5): colors = np.load(os.path.join(os.path.dirname(__file__), 'pascal_map.npy'))/255. if isinstance(masks, np.ndarray): masks = [masks] assert len(colors) >= len(masks), 'Not enough colors' ov = im.copy() im = im.astype(np.float32) total_ma = np.zeros([im.shape[0], im.shape[1]]) i = 1 for ma in masks: ma = ma.astype(np.bool) fg = im * alpha+np.ones(im.shape) * (1 - alpha) * colors[i, :3] # np.array([0,0,255])/255.0 i = i + 1 ov[ma == 1] = fg[ma == 1] total_ma += ma # [-2:] is s trick to be compatible both with opencv 2 and 3 contours = cv2.findContours(ma.copy().astype(np.uint8), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:] cv2.drawContours(ov, contours[0], -1, (0.0, 0.0, 0.0), 1) ov[total_ma == 0] = im[total_ma == 0] return ov
Example #7
Source File: picam.py From PiCamNN with MIT License | 7 votes |
def movement(mat_1,mat_2): mat_1_gray = cv2.cvtColor(mat_1.copy(),cv2.COLOR_BGR2GRAY) mat_1_gray = cv2.blur(mat_1_gray,(blur1,blur1)) _,mat_1_gray = cv2.threshold(mat_1_gray,100,255,0) mat_2_gray = cv2.cvtColor(mat_2.copy(),cv2.COLOR_BGR2GRAY) mat_2_gray = cv2.blur(mat_2_gray,(blur1,blur1)) _,mat_2_gray = cv2.threshold(mat_2_gray,100,255,0) mat_2_gray = cv2.bitwise_xor(mat_1_gray,mat_2_gray) mat_2_gray = cv2.blur(mat_2_gray,(blur2,blur2)) _,mat_2_gray = cv2.threshold(mat_2_gray,70,255,0) mat_2_gray = cv2.erode(mat_2_gray,np.ones((erodeval,erodeval))) mat_2_gray = cv2.dilate(mat_2_gray,np.ones((4,4))) _, contours,__ = cv2.findContours(mat_2_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) if len(contours) > 0:return True #If there were any movements return False #if not #Pedestrian Recognition Thread
Example #8
Source File: coco_seg_fast.py From PolarMask with Apache License 2.0 | 7 votes |
def get_single_centerpoint(self, mask): contour, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) contour.sort(key=lambda x: cv2.contourArea(x), reverse=True) # only save the biggest one '''debug IndexError: list index out of range''' count = contour[0][:, 0, :] try: center = self.get_centerpoint(count) except: x,y = count.mean(axis=0) center=[int(x), int(y)] #decrease the number of contour, to speed up # 360 points should ok, the performance drop very tiny. max_points = 360 if len(contour[0]) > max_points: compress_rate = len(contour[0]) // max_points contour[0] = contour[0][::compress_rate, ...] return center, contour
Example #9
Source File: core.py From robosat with MIT License | 7 votes |
def contours(mask): """Extracts contours and the relationship between them from a binary mask. Args: mask: the binary mask to find contours in. Returns: The detected contours as a list of points and the contour hierarchy. Note: the hierarchy can be used to re-construct polygons with holes as one entity. """ contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) return contours, hierarchy # Todo: should work for lines, too, but then needs other epsilon criterion than arc length
Example #10
Source File: Dataloader.py From Text_Segmentation_Image_Inpainting with GNU General Public License v3.0 | 6 votes |
def draw_contour(img, mask): a, b, c = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) for cnt in b: approx = cv2.approxPolyDP(cnt, 0, True) cv2.drawContours(img, [approx], 0, (255, 255, 255), -1) return img
Example #11
Source File: predictor.py From maskrcnn-benchmark with MIT License | 6 votes |
def overlay_mask(self, image, predictions): """ Adds the instances contours for each predicted object. Each label has a different color. Arguments: image (np.ndarray): an image as returned by OpenCV predictions (BoxList): the result of the computation by the model. It should contain the field `mask` and `labels`. """ masks = predictions.get_field("mask").numpy() labels = predictions.get_field("labels") colors = self.compute_colors_for_labels(labels).tolist() for mask, color in zip(masks, colors): thresh = mask[0, :, :, None].astype(np.uint8) contours, hierarchy = cv2_util.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) image = cv2.drawContours(image, contours, -1, color, 3) composite = image return composite
Example #12
Source File: predictor.py From R2CNN.pytorch with MIT License | 6 votes |
def overlay_mask(self, image, predictions): """ Adds the instances contours for each predicted object. Each label has a different color. Arguments: image (np.ndarray): an image as returned by OpenCV predictions (BoxList): the result of the computation by the model. It should contain the field `mask` and `labels`. """ masks = predictions.get_field("mask").numpy() labels = predictions.get_field("labels") colors = self.compute_colors_for_labels(labels).tolist() for mask, color in zip(masks, colors): thresh = mask[0, :, :, None] contours, hierarchy = cv2_util.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) image = cv2.drawContours(image, contours, -1, color, 3) composite = image return composite
Example #13
Source File: process.py From BusinessCardReader with MIT License | 6 votes |
def getRegions(img): grayImg = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # grayImg = cv2.equalizeHist(np.copy(grayImg)) edges = cv2.Canny(grayImg,100,200,apertureSize = 3) if DEBUG: utils.display([('Canny Edge Detection', edges)]) kernel = np.ones((3,3),np.uint8) edges = cv2.dilate(edges,kernel,iterations = 14) # edges = 255-edges # utils.display([('', edges)]) contours, hierarchy = cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) if DEBUG: utils.display([('Contours', edges)]) # Only take contours of a certain size regions = [] for contour in contours: imgH, imgW, _ = img.shape [x, y, w, h] = cv2.boundingRect(contour) if w < 50 or h < 50: pass elif w > .95*imgW or h > .95*imgH: pass else: regions.append((x, y, x+w, y+h)) return regions
Example #14
Source File: openvino-usbcamera-cpu-ncs2-async.py From MobileNetV2-PoseEstimation with MIT License | 6 votes |
def getKeypoints(probMap, threshold=0.1): mapSmooth = cv2.GaussianBlur(probMap, (3, 3), 0, 0) mapMask = np.uint8(mapSmooth>threshold) keypoints = [] contours = None try: #OpenCV4.x contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) except: #OpenCV3.x _, contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: blobMask = np.zeros(mapMask.shape) blobMask = cv2.fillConvexPoly(blobMask, cnt, 1) maskedProbMap = mapSmooth * blobMask _, maxVal, _, maxLoc = cv2.minMaxLoc(maskedProbMap) keypoints.append(maxLoc + (probMap[maxLoc[1], maxLoc[0]],)) return keypoints
Example #15
Source File: tpu-usbcamera-sync.py From MobileNetV2-PoseEstimation with MIT License | 6 votes |
def getKeypoints(probMap, threshold=0.1): mapSmooth = cv2.GaussianBlur(probMap, (3, 3), 0, 0) mapMask = np.uint8(mapSmooth>threshold) keypoints = [] contours = None try: #OpenCV4.x contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) except: #OpenCV3.x _, contours, _ = cv2.findContours(mapMask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: blobMask = np.zeros(mapMask.shape) blobMask = cv2.fillConvexPoly(blobMask, cnt, 1) maskedProbMap = mapSmooth * blobMask _, maxVal, _, maxLoc = cv2.minMaxLoc(maskedProbMap) keypoints.append(maxLoc + (probMap[maxLoc[1], maxLoc[0]],)) return keypoints
Example #16
Source File: Grouping.py From CSGNet with MIT License | 6 votes |
def tightboundingbox(self, image): ret, thresh = cv2.threshold(np.array(image, dtype=np.uint8), 0, 255, 0) im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) bb = [] for c in contours: x, y, w, h = cv2.boundingRect(c) # +1 is done to encapsulate entire figure w += 2 h += 2 x -= 1 y -= 1 x = np.max([0, x]) y = np.max([0, y]) bb.append([y, x, w, h]) bb = self.nms(bb) return bb
Example #17
Source File: image_transformation.py From Sign-Language-Recognition with MIT License | 6 votes |
def draw_contours(frame): """ Draws a contour around white color. """ logger.debug("Drawing contour around white color...") # 'contours' is a list of contours found. contours, _ = cv2.findContours( frame, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # Finding the contour with the greatest area. largest_contour_index = find_largest_contour_index(contours) # Draw the largest contour in the image. cv2.drawContours(frame, contours, largest_contour_index, (255, 255, 255), thickness=-1) # Draw a rectangle around the contour perimeter contour_dimensions = cv2.boundingRect(contours[largest_contour_index]) # cv2.rectangle(sign_image,(x,y),(x+w,y+h),(255,255,255),0,8) logger.debug("Done!") return (frame, contour_dimensions)
Example #18
Source File: predictor.py From DetNAS with MIT License | 6 votes |
def overlay_mask(self, image, predictions): """ Adds the instances contours for each predicted object. Each label has a different color. Arguments: image (np.ndarray): an image as returned by OpenCV predictions (BoxList): the result of the computation by the model. It should contain the field `mask` and `labels`. """ masks = predictions.get_field("mask").numpy() labels = predictions.get_field("labels") colors = self.compute_colors_for_labels(labels).tolist() for mask, color in zip(masks, colors): thresh = mask[0, :, :, None] contours, hierarchy = cv2_util.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) image = cv2.drawContours(image, contours, -1, color, 3) composite = image return composite
Example #19
Source File: predictor.py From remote_sensing_object_detection_2019 with MIT License | 6 votes |
def overlay_mask(self, image, predictions): """ Adds the instances contours for each predicted object. Each label has a different color. Arguments: image (np.ndarray): an image as returned by OpenCV predictions (BoxList): the result of the computation by the model. It should contain the field `mask` and `labels`. """ masks = predictions.get_field("mask").numpy() labels = predictions.get_field("labels") colors = self.compute_colors_for_labels(labels).tolist() for mask, color in zip(masks, colors): thresh = mask[0, :, :, None] contours, hierarchy = cv2_util.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) image = cv2.drawContours(image, contours, -1, color, 3) composite = image return composite
Example #20
Source File: predictor.py From remote_sensing_object_detection_2019 with MIT License | 6 votes |
def overlay_mask(self, image, predictions): """ Adds the instances contours for each predicted object. Each label has a different color. Arguments: image (np.ndarray): an image as returned by OpenCV predictions (BoxList): the result of the computation by the model. It should contain the field `mask` and `labels`. """ masks = predictions.get_field("mask").numpy() labels = predictions.get_field("labels") colors = self.compute_colors_for_labels(labels).tolist() for mask, color in zip(masks, colors): thresh = mask[0, :, :, None] contours, hierarchy = cv2_util.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) image = cv2.drawContours(image, contours, -1, color, 3) composite = image return composite
Example #21
Source File: predictor.py From remote_sensing_object_detection_2019 with MIT License | 6 votes |
def overlay_mask(self, image, predictions): """ Adds the instances contours for each predicted object. Each label has a different color. Arguments: image (np.ndarray): an image as returned by OpenCV predictions (BoxList): the result of the computation by the model. It should contain the field `mask` and `labels`. """ masks = predictions.get_field("mask").numpy() labels = predictions.get_field("labels") colors = self.compute_colors_for_labels(labels).tolist() for mask, color in zip(masks, colors): thresh = mask[0, :, :, None] contours, hierarchy = cv2_util.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) image = cv2.drawContours(image, contours, -1, color, 3) composite = image return composite
Example #22
Source File: predictor.py From argoverse_baselinetracker with MIT License | 6 votes |
def overlay_mask(self, image, predictions): """ Adds the instances contours for each predicted object. Each label has a different color. Arguments: image (np.ndarray): an image as returned by OpenCV predictions (BoxList): the result of the computation by the model. It should contain the field `mask` and `labels`. """ masks = predictions.get_field("mask").numpy() labels = predictions.get_field("labels") colors = self.compute_colors_for_labels(labels).tolist() for mask, color in zip(masks, colors): thresh = mask[0, :, :, None] contours, hierarchy = cv2_util.findContours( thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) image = cv2.drawContours(image, contours, -1, color, 3) composite = image return composite
Example #23
Source File: image_comp_tool.py From HalloPy with MIT License | 6 votes |
def get_max_area_contour(input_image): # Get the contours. expected_gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(expected_gray, (41, 41), 0) thresh = cv2.threshold(blur, 50, 255, cv2.THRESH_BINARY)[1] thresh = cv2.erode(thresh, None, iterations=2) thresh = cv2.dilate(thresh, None, iterations=2) _, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # Find the biggest area try: if len(contours) > 0: max_area_contour = max(contours, key=cv2.contourArea) return max_area_contour except ValueError as error: print(error)
Example #24
Source File: ChickenVision.py From ChickenVision with MIT License | 6 votes |
def findTargets(frame, mask): # Finds contours _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_TC89_KCOS) # Take each frame # Gets the shape of video screenHeight, screenWidth, _ = frame.shape # Gets center of height and width centerX = (screenWidth / 2) - .5 centerY = (screenHeight / 2) - .5 # Copies frame and stores it in image image = frame.copy() # Processes the contours, takes in (contours, output_image, (centerOfImage) if len(contours) != 0: image = findTape(contours, image, centerX, centerY) else: # pushes that it deosn't see vision target to network tables networkTable.putBoolean("tapeDetected", False) # Shows the contours overlayed on the original video return image # Finds the balls from the masked image and displays them on original stream + network tables
Example #25
Source File: ChickenVision.py From ChickenVision with MIT License | 6 votes |
def findCargo(frame, mask): # Finds contours _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_TC89_KCOS) # Take each frame # Gets the shape of video screenHeight, screenWidth, _ = frame.shape # Gets center of height and width centerX = (screenWidth / 2) - .5 centerY = (screenHeight / 2) - .5 # Copies frame and stores it in image image = frame.copy() # Processes the contours, takes in (contours, output_image, (centerOfImage) if len(contours) != 0: image = findBall(contours, image, centerX, centerY) else: # pushes that it doesn't see cargo to network tables networkTable.putBoolean("cargoDetected", False) # Shows the contours overlayed on the original video return image # Draws Contours and finds center and yaw of orange ball # centerX is center x coordinate of image # centerY is center y coordinate of image
Example #26
Source File: crop_morphology.py From Python-Code with MIT License | 6 votes |
def find_components(edges, max_components=16): """Dilate the image until there are just a few connected components. Returns contours for these components.""" # Perform increasingly aggressive dilation until there are just a few # connected components. count = 21 dilation = 5 n = 1 while count > 16: n += 1 dilated_image = dilate(edges, N=3, iterations=n) contours, hierarchy = cv2.findContours(dilated_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) count = len(contours) #print dilation #Image.fromarray(edges).show() #Image.fromarray(255 * dilated_image).show() return contours
Example #27
Source File: coco_seg.py From PolarMask with Apache License 2.0 | 6 votes |
def get_single_centerpoint(self, mask): contour, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) contour.sort(key=lambda x: cv2.contourArea(x), reverse=True) #only save the biggest one '''debug IndexError: list index out of range''' count = contour[0][:, 0, :] try: center = self.get_centerpoint(count) except: x,y = count.mean(axis=0) center=[int(x), int(y)] # max_points = 360 # if len(contour[0]) > max_points: # compress_rate = len(contour[0]) // max_points # contour[0] = contour[0][::compress_rate, ...] return center, contour
Example #28
Source File: dataset.py From DenseFusion with MIT License | 6 votes |
def mask_to_bbox(mask): mask = mask.astype(np.uint8) contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) x = 0 y = 0 w = 0 h = 0 for contour in contours: tmp_x, tmp_y, tmp_w, tmp_h = cv2.boundingRect(contour) if tmp_w * tmp_h > w * h: x = tmp_x y = tmp_y w = tmp_w h = tmp_h return [x, y, w, h]
Example #29
Source File: detect_tables.py From namsel with MIT License | 6 votes |
def find_boxes(tiff_fl, blur=False): im = Image.open(tiff_fl).convert('L') a = np.asarray(im) if blur: a = cv.GaussianBlur(a, (5, 5), 0) contours, hierarchy = cv.findContours(a.copy(), mode=cv.RETR_TREE, method=cv.CHAIN_APPROX_SIMPLE) border_boxes = [] # n = np.ones_like(a) for j,cnt in enumerate(contours): cnt_len = cv.arcLength(cnt, True) orig_cnt = cnt.copy() cnt = cv.approxPolyDP(cnt, 0.02*cnt_len, True) if len(cnt) == 4 and ((a.shape[0]-3) * (a.shape[1] -3)) > cv.contourArea(cnt) > 1000 and cv.isContourConvex(cnt): cnt = cnt.reshape(-1, 2) max_cos = np.max([angle_cos( cnt[i], cnt[(i+1) % 4], cnt[(i+2) % 4] ) for i in xrange(4)]) if max_cos < 0.1: b = cv.boundingRect(orig_cnt) x,y,w,h = b border_boxes.append(b) # cv.rectangle(n, (x,y), (x+w, y+h), 0) # cv.drawContours(n, [cnt], -1,0, thickness = 5) # Image.fromarray(n*255).show() return border_boxes
Example #30
Source File: crop_morphology.py From oldnyc with Apache License 2.0 | 6 votes |
def find_components(edges, max_components=16): """Dilate the image until there are just a few connected components. Returns contours for these components.""" # Perform increasingly aggressive dilation until there are just a few # connected components. count = 21 dilation = 5 n = 1 while count > 16: n += 1 dilated_image = dilate(edges, N=3, iterations=n) contours, hierarchy = cv2.findContours(dilated_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) count = len(contours) #print dilation #Image.fromarray(edges).show() #Image.fromarray(255 * dilated_image).show() return contours