1.外接矩阵
一张三通道图片,同样需要经过灰度化,二值化,轮廓提取后,再对轮廓进行提取外界矩阵。
最小外接矩形函数返回的外接矩阵是一个包含矩阵中心点,宽高,旋转角度的元组,需要用到cv2.boxPoints()函数将其转换成四点坐标的形式,全是坐标的形式就与轮廓的形式大致相同了,我们的目的是想用drawCountrys函数将这个矩阵绘制出来,因此还需要把返回的矩阵的坐标的float类型的数值经过四舍五入之后变成int类型,这样就能绘制了。
而最大外接矩形返回的是四个值,分别是左上角坐标,宽和高,可以直接用rectangel绘制即可
2.API
"""获取最小外接矩阵"""
#外界矩阵的返回值是一个元组,其数据类型为内含float类型的元组,其内容包括举行的终点坐标,举行的长度宽度和矩形的旋转角度
rect = cv2.minAreaRect(contours[1])
#可见其返回值所表示的矩形的方法并不能被drawContours直接接受,因此openCV提供了转换矩形表示方法的函数
box = cv2.boxPoints(rect)
#但是这个函数的返回值的坐标都是float类型,需要把转成int类型
#这种方法直接取整,误差较大box = np.int0(box),因此采用四舍五入的方法取整
box = np.round(box).astype('int64')#np的round函数返回的依然是float类型因此给他转成int就可以了
"""获取最大外界矩阵"""
x,y,w,h = cv2.boundingRect(contours[1])
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
3.完整代码:
import cv2
import numpy as np
img = cv2.imread("image/hello.png")
#转成灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#图像二值化
ret,binary = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
#提取轮廓
contours,hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#复制图形
img_copy = img.copy()
"""获取最小外接矩阵"""
#外界矩阵的返回值是一个元组,其数据类型为内含float类型的元组,其内容包括举行的终点坐标,举行的长度宽度和矩形的旋转角度
rect = cv2.minAreaRect(contours[1])
#可见其返回值所表示的矩形的方法并不能被drawContours直接接受,因此openCV提供了转换矩形表示方法的函数
box = cv2.boxPoints(rect)
#但是这个函数的返回值的坐标都是float类型,需要把转成int类型
#这种方法直接取整,误差较大box = np.int0(box),因此采用四舍五入的方法取整
box = np.round(box).astype('int64')#np的round函数返回的依然是float类型因此给他转成int就可以了
"""获取最大外界矩阵"""
x,y,w,h = cv2.boundingRect(contours[1])
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
"""绘制外接矩阵"""
cv2.drawContours(img_copy,[box],0,(0,0,255),2)
cv2.imshow("show",np.hstack((img,img_copy)))
cv2.waitKey(0)
cv2.destroyAllWindows()