🍔小小搬运工,一边搬运一边思考
参考书籍 《OpenCV轻松入门——面向Python李立宗著,电子工业出版社出版
4 轮廓拟合
在计算轮廓时,可能并不需要实际的轮廓,而仅仅需要一个接近轮廓的近似多边形。
4.1 矩形包围框
函数cv2.boundingRect()能够绘制轮廓的矩形边界,该函数的语法格式为:
retval = cv2.boundingRect(array)
# 返回值retval表示返回的矩形边界的左上角顶点的坐标值及矩形边界的宽度和高度。
# 参数array是灰度图像或轮廓。
x,y,w,h = cv2.boundingRect(array)
#x 矩形边界左上角顶点的x坐标
#y 矩形边界左上角顶点的y坐标
#w 矩形边界的x方向的长度
#h 矩形边界的y方向的长度
例11:显示函数cv2.boundingRect()不同形式的返回值。
import cv2
#-----------------------读取并显示原始图像----------------
o1 = cv2.imread("C:\\Users\\Kris\\Desktop\\1.jpg")
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
contour1,hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#----------------------返回顶点及边长------------------------
x,y,w,h = cv2.boundingRect(contour1[0])
print("顶点及长宽的点形式:")
print ("x=",x)
print ("y=",y)
print ("w=",w)
print ("h=",h)
#---------------------仅有一个返回值的情况-------------------------
rect = cv2.boundingRect(contour1[0])
print("\n顶点及长宽的元组(tuple)形式:")
print("rect=",rect)
运行程序,显示如下结果。
例12:使用函数cv2.drawContours()绘制矩形包围框。
import cv2
import numpy as np
#-----------------------读取并显示原始图像----------------
o1 = cv2.imread("C:\\Users\\Kris\\Desktop\\1.jpg")
#----------------------提取图像轮廓---------------------
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret,binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
contour1,hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#--------------------------构造矩形边界----------------------------
x,y,w,h = cv2.boundingRect(contour1[0])
brcnt = np.array([[[x,y],[x+w,y],[x+w,y+h],[x,y+h]]])
cv2.drawContours(o1,[brcnt],-1,(255,255,255),2)
#---------------------显示矩形边界----------------------------
cv2.imshow("result",o1)
cv2.waitKey()
cv2.destroyAllWindows()
运行程序,结果显示如下。
例12:使用函数cv2.dboundingrect()和函数cv2.rectangle()绘制矩形包围框。
import cv2
import numpy as np
#-----------------------读取并显示原始图像----------------
o1 = cv2.imread("C:\\Users\\Kris\\Desktop\\1.jpg")
#----------------------提取图像轮廓---------------------
gray1 = cv2.cvtColor(o1,cv2