Creating your own contour in opencv using python Creating your own contour in opencv using python python python

Creating your own contour in opencv using python


By looking at the format of the contours I would think something like this should be sufficient:

contours = [numpy.array([[1,1],[10,50],[50,50]], dtype=numpy.int32) , numpy.array([[99,99],[99,60],[60,99]], dtype=numpy.int32)]

This small program gives an running example:

import numpyimport cv2contours = [numpy.array([[1,1],[10,50],[50,50]], dtype=numpy.int32) , numpy.array([[99,99],[99,60],[60,99]], dtype=numpy.int32)]drawing = numpy.zeros([100, 100],numpy.uint8)for cnt in contours:    cv2.drawContours(drawing,[cnt],0,(255,255,255),2)cv2.imshow('output',drawing)cv2.waitKey(0)


To create your own contour from a python list of points L

L=[[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x5,y5],[x6,y6],[x7,y7],[x8,y8],[x9,y9],...[xn,yn]]

Create a numpy array ctr from L, reshape it and force its type

ctr = numpy.array(L).reshape((-1,1,2)).astype(numpy.int32)

ctr is our new countour, let's draw it on an existing image

cv2.drawContours(image,[ctr],0,(255,255,255),1)


A contour is simply a curve joining all continuous points so to create your own contour, you can create a np.array() with your (x,y) points in clockwise order

points = np.array([[25,25], [70,10], [150,50], [250,250], [100,350]])

That's it!


There are two methods to draw the contour onto an image depending on what you need:

Contour outline

If you only need the contour outline, use cv2.drawContours()

cv2.drawContours(image,[points],0,(0,0,0),2)

Filled contour

To get a filled contour, you can either use cv2.fillPoly() or cv2.drawContours() with thickness=-1

cv2.fillPoly(image, [points], [0,0,0]) # OR# cv2.drawContours(image,[points],0,(0,0,0),-1)

Full example code for completeness

import cv2import numpy as np# Create blank white imageimage = np.ones((400,400), dtype=np.uint8) * 255# List of (x,y) points in clockwise orderpoints = np.array([[25,25], [70,10], [150,50], [250,250], [100,350]])# Draw points onto imagecv2.drawContours(image,[points],0,(0,0,0),2)# Fill points onto image# cv2.fillPoly(image, [points], [0,0,0])cv2.imshow('image', image)cv2.waitKey()