unable to get contour properly

Question:

I am playing with openCV and doing simple below task.

1) Read Image

2) thresholding

3) Finding contours.

4) Drawing all contours in the blank image.

5) Drawing individual contour.

Drawing all contours on the dummy image looks good, whereas drawing single contour produces scattered contour as shown in the below images.

Original:

enter image description here

All Contours :

enter image description here

Single Contour :

enter image description here

Please find the code below.

import  cv2
import numpy as np

#Reading Image.
srcImg = cv2.imread("./bottle.jpeg")

#Color Conversion.

grayedImg = cv2.cvtColor(srcImg,cv2.COLOR_RGB2GRAY)
__, thresholdedImg = cv2.threshold(grayedImg, 240, 255, cv2.THRESH_BINARY)

#Noice Removal
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
erodeImage = cv2.erode(thresholdedImg,kernel, iterations=1)
dilatedImg = cv2.dilate(erodeImage,kernel, iterations=1)
_, contours, _ = cv2.findContours(dilatedImg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

#draw All Contours.

dummyImg = np.zeros(grayedImg.shape, dtype=grayedImg.dtype)
cv2.drawContours(dummyImg, contours, -1, 255, 1)
cv2.imshow("All Contours", dummyImg)
cv2.imwrite("allContours.jpeg",dummyImg)

#draw Individual Contours.

mask =  np.zeros(dummyImg.shape[:2], dtype= dummyImg.dtype)
isolatedImg = cv2.drawContours(mask, contours[9], -1, 255, 1)

cv2.imshow("Indivial Contours.", isolatedImg)
cv2.imwrite("single.jpeg",isolatedImg)

cv2.waitKey(0)
Asked By: Whoami

||

Answers:

You have to enclose another set of square brackets:

isolatedImg = cv2.drawContours(mask, [contours[9]], -1, 255, 1)

Expected result:

enter image description here

If you dig deep, cv2.findContours() returns a list of arrays. Now each array contains details on the number of points making up the contour.

Answered By: Jeru Luke
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.