opencv - plot contours in an image

13,613

Solution 1

You need to draw on the original image, not on the one returned from findContuors(). The following works.

# Contoured image
ret,thresh = cv2.threshold(imgray, 120,255,cv2.THRESH_BINARY)
contours = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2]
for contour in contours:
   cv2.drawContours(im, contour, -1, (0, 255, 0), 3)
plt.figure()
plt.imshow(im)

enter image description here

Solution 2

This is my result:

enter image description here


## Read and convert 
img = io.imread('http://matlabtricks.com/images/post-35/man.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

## Find outer contours 
_, cnts, _= cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

## Draw 
canvas = np.zeros_like(img)
cv2.drawContours(canvas , contours, -1, (0, 255, 0), 1)

plt.imshow(canvas)
Share:
13,613
learner
Author by

learner

Updated on July 12, 2022

Comments

  • learner
    learner almost 2 years

    I am trying to draw contour around an image. I can see that contours being found but I am not able to draw the outline. The color of the contour seem to be either of the two (black and white) colors.

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    from skimage import io
    %matplotlib inline
    im = io.imread('http://matlabtricks.com/images/post-35/man.png')
    plt.imshow(im)
    imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    plt.figure()
    plt.imshow(imgray)
    
    #Contoured image
    ret,thresh = cv2.threshold(imgray, 120,255,cv2.THRESH_BINARY)
    image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    c_img = cv2.drawContours(image, contours, -1, (0, 255, 0), 1)
    plt.figure()
    plt.imshow(c_img)