r=cv2.drawContours(image, contours, contourIdx, color[, thickness])
r:目标图像
image:原始图像
contours: 所有的输入轮廓边缘数组
contourIdx :需要绘制的边缘索引,如果全部绘制为-1。如果有多个目标,可以绘制第一个目标0,第二个目标1,第三个目标2.。。
color:绘制的颜色,为BGR格式的SCalar
thickness:可选,绘制的密度,即轮廓的画笔粗细
import cv2 import numpy as np o = cv2.imread('lena256.bmp') gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)#BGR-灰度 ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#二值图像 contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)<div style="color:transparent">本文来源gaodai^.ma#com搞#代!码网</div> co=o.copy()#对原始图像进行绘制 r=cv2.drawContours(co,contours,-1,(0,127,127),4)#co为复制图像,轮廓会修改原始图像 cv2.imshow("original",o) cv2.imshow("contours",r) cv2.waitKey()
代码:
import numpy as np import cv2 as cv img=cv.imread("image.jpg",0) #为了显示方便,这里将图片进行缩放 x,y=img.shape img=cv.resize(img,(y//2,x//2)) #将图片二值化,由于前景物体是黑色的,因此在二值化时采用cv.THRESH_TOZERO_INV这种方式 ret,thresh=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV) #寻找图片中的轮廓,mode=cv.RETR_EXTERNAL,这是为了寻找最外层的轮廓 im,contour,hierarchy=cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) #cv.minEnclosingCircle函数的参数要求是ndarray类型,因此这里将找到的 # 轮廓中的所有的点存放在一个列表中,然后使用这个列表创建数组 point_list=[] for i in contour: for j in i: point_list.append(j[0]) point_array=np.array(point_list) #使用最小外接圆函数,返回值为这个圆的圆心坐标和圆半径长度 (x,y),radius=cv.minEnclosingCircle(point_array) #图片上的坐标均为整数,圆的半径也要求是整数,因此将它们强制转换为int类型 center=(int(x),int(y)) color=cv.cvtColor(img,cv.COLOR_GRAY2BGR) color=cv.circle(color,center,radius=int(radius),color=(0,0,255),thickness=2) #显示图片 cv.imshow("color",color) cv.waitKey(0) cv.destroyAllWindows()