如何在OpenCV Python中找到图像轮廓的边界矩形?
对象的边界矩形是在图像中围绕对象绘制的矩形。在OpenCV中有两种方法可以找到边界矩形
直边界矩形
它是一个直角矩形,因为它不考虑对象的旋转。可以使用函数 cv2.boundingRect() 计算它。其语法如下
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
在这里“ cnt ”是 轮廓点 数组。它返回边界矩形的左上坐标(x,y)以及宽度和高度(w,h)。
旋转矩形
它考虑对象的旋转并绘制面积最小的矩形。可以使用函数 cv2.minAreaRect() 找到旋转矩形。它返回左上角坐标(x,y),(宽度,高度),旋转角度。方形的4个角可使用函数 cv2.boxPoints() 获得。
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
img = cv2.drawContours(img,[box],0,(0,255,255),2)
步骤
您可以使用以下步骤计算给定函数的Jacobian
- 导入所需的库。所需的库是 OpenCV 和 Numpy 。
-
加载输入图像。将输入图像转换为灰度图像。
-
对灰度图像应用阈值将其转换为二进制图像。
-
找到图像中对象的轮廓。
-
使用上述轮廓计算直角边界矩形。在图像上绘制矩形。
-
计算旋转边界矩形并在图像上绘制它。
-
显示绘制了直边界矩形和旋转边界矩形的图像。
示例1
在下面的Python代码中,我们计算直角边界矩形。
# 导入所需的库
import cv2
# 读取输入图像
img = cv2.imread('approx.png')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行阈值处理,生成二值图像
ret, thresh = cv2.threshold(gray,127,255,0)
# 查找轮廓
contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# 获取第一个轮廓
cnt = contours[0]
# 计算轮廓的边界矩形
x, y, w, h = cv2.boundingRect(cnt)
# 绘制轮廓
img = cv2.drawContours(img,[cnt],0,(0,255,255),2)
# 绘制边界矩形
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
# 在图上显示画有边界矩形的图像
cv2.imshow("Bounding Rectangle", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当执行以上代码时,会生成下面的输出窗口。
在上面的输出中,绿色矩形表示直线边界矩形。
现在,计算围绕最小区域的旋转边界矩形。请看以下示例。
示例2
在下面的Python代码中,我们计算直线边界矩形和旋转边界矩形。比较输出窗口以清楚了解两种类型的边界矩形之间的区别。
import cv2
import numpy as np
img = cv2.imread('approx.png')
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(img1,127,255,0)
contours,_ = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# print("Number of contours detected:", len(contours))
cnt = contours[0]
# 计算直线外接矩形
x,y,w,h = cv2.boundingRect(cnt)
img = cv2.drawContours(img,[cnt],0,(255,255,0),2)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
# 计算旋转矩形(最小面积)
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
# 绘制最小面积矩形(旋转矩形)
img = cv2.drawContours(img,[box],0,(0,255,255),2)
cv2.imshow("Bounding Rectangles", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
当您执行上述代码时,将会产生以下输出窗口。
在上面的输出中,绿色矩形是直线外接矩形,黄色矩形是最小面积旋转矩形。请注意两个矩形之间的区别。