1、前言
书接上回,代码能够很好的把图像中的矩形都找出来,若我们只需要找到图像中最大的矩形,需要对上节的代码进行一些修改。
运行效果如下:
2、修改思路
在for遍历每个轮廓时,增加一个对轮廓面积的计算
area = cv2.contourArea(cnt)
然后将面积进行对比选出最大的轮廓:max_rect
python
# 初始化变量来存储最大矩形的信息
max_area = 0
max_rect = None
for cnt in contours:
approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)
if len(approx) == 4:
# 计算轮廓的面积
area = cv2.contourArea(cnt)
if area > max_area:
max_area = area
max_rect = cnt
之后同上节内容一样,把轮廓以及相关文字显示出来
完整代码:
python
import cv2
# 读取输入图像
img = cv2.imread('test4.png')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用二值化将灰度图像转换为二进制图像
mask_gray = cv2.inRange(gray, 0, 251)
# 找到轮廓
contours, hierarchy = cv2.findContours(mask_gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print("检测到的轮廓数量:", len(contours))
# 初始化变量来存储最大矩形的信息
max_area = 0
max_rect = None
for cnt in contours:
approx = cv2.approxPolyDP(cnt, 0.01 * cv2.arcLength(cnt, True), True)
if len(approx) == 4:
# 计算轮廓的面积
area = cv2.contourArea(cnt)
if area > max_area:
max_area = area
max_rect = cnt
# 绘制最大的矩形
if max_rect is not None:
img = cv2.drawContours(img, [max_rect], -1, (0, 170, 255), 3)
# 计算矩形质心
M = cv2.moments(max_rect)
if M['m00'] != 0.0:
x = int(M['m10'] / M['m00'])
y = int(M['m01'] / M['m00'])
cv2.putText(img, 'Largest Rectangle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)
cv2.imshow("mask_gray", mask_gray)
cv2.imshow("Shapes", img)
cv2.waitKey(0)
cv2.destroyAllWindows()