img = cv2.drawContours(img,contours,index,color,thickness,linetype)
contours:是list类型的数组,里面存储了轮廓数组包含所有存储的轮廓contourIdx:从上面的轮廓list中取出哪一个画出来,-1代表全部color:绘制轮廓所用颜色thickness:线条粗细,-1代表填充式画轮廓,整个轮廓内部被指定颜色填充lineType:线条类型,虚线、实线之类的,默认实线
注意:
绘制轮廓钱要做一个原图的副本,图片传入绘制轮廓函数后,会在该图片上画出轮廓从而使得该图片无法使用
import cv2
src_img = cv2.imread("5-1.jpg", cv2.IMREAD_UNCHANGED)
cv2.imshow("src_img", src_img)
# 先对图像进行灰度处理
gray = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)
# 进行二值处理
rat, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours,hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 画出轮廓
r = cv2.drawContours(src_img, contours, -1, (0, 255, 0), 6)
cv2.imshow('result', r)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果有一张图片如下:

背景是白色的,我们需要找轮廓,我们需要的轮廓信息是椭圆和长方形轮廓,如果按上面的程序进行处理,效果如下:

但是效果是,轮廓多了一个最大的长方形轮廓,这是因为在OpenCV中,是从黑色背景中查找白色对象。因此,对象必须是白色的,背景必须是黑色的。所以要解决如下问题,只需要在进行二值处理时,选择反二进制阈值化。将:
rat, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
rat, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

现在就达到需要的效果了。