目录
简介
在计算机视觉和图像处理中,使用外接圆和外接矩形绘制的目的是进行特定对象或区域的边界框标记,从而更容易识别、跟踪或测量这些对象。这些外接形状不仅提供了重要的定位和尺寸信息,还有助于减少处理的数据量,从而提高算法的效率。
代码实现
外接圆
cv2.circle()是OpenCV库中用于绘制圆的函数基本语法如下:
cv2.circle(image, center, radius, color, thickness, lineType, shift)
image
: 这是要在其上绘制圆的图像。通常,你会将原始图像传递给这个参数,并且该函数将在原始图像上进行绘制,而不是创建一个新图像-
center
: 这是一个包含圆心坐标的元组(x, y)
,其中(x, y)
表示圆心的像素坐标。圆心是圆的中心点。 -
radius
: 这是圆的半径,通常是一个正整数。它定义了圆的大小。 -
color
: 这是绘制圆的颜色,通常是一个包含三个整数值的元组(B, G, R)
,其中 B、G 和 R 分别表示蓝、绿和红通道的颜色强度。例如,(0, 255, 0) 表示绿色。 -
thickness
(可选): 这是绘制圆的线宽度,通常是一个正整数。如果thickness
为正,表示绘制实心圆,如果为负或零,表示绘制一个带有指定宽度的圆边框。通常,使用正整数值。 -
lineType
(可选): 这是线的类型。默认情况下,它是8,表示八连接线。你通常不需要更改此参数,除非你需要特定类型的线。 -
shift
(可选): 这是用于坐标位移的可选参数。通常不需要使用这个参数。
代码实现:
# 导入OpenCV库
import cv2
# 从文件加载图像(请确保文件存在于当前工作目录或提供正确的路径)
phone = cv2.imread('apple_phone.png')
# 转换图像为灰度图,以便后续处理
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
# 应用阈值化,将图像转换为二值图像
# 阈值化将像素值大于 120 的像素置为 255(白色),小于等于 120 的像素置为 0(黑色)
ret, phone_thresh = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
# 查找图像中的轮廓
# phone_thresh 是二值图像,RETR_TREE 表示检测所有轮廓,并构建轮廓的层次结构
# CHAIN_APPROX_NONE 表示不进行轮廓近似,保留所有轮廓上的点
image, contours, hierarchy = cv2.findContours(phone_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 选择一个特定的轮廓(这里选择第 6 个轮廓,Python中的索引从0开始)
cnt = contours[5]
# 获取包围轮廓的最小圆
(x, y), r = cv2.minEnclosingCircle(cnt)
# 在原始图像上绘制最小外接圆
# (int(x), int(y)) 是圆心坐标,int(r) 是半径
# (0, 255, 0) 是圆的颜色,2 是绘制圆的线宽
phone_circle = cv2.circle(phone, (int(x), int(y)), int(r), (0, 255, 0), 2)
# 显示包含外接圆的图像
cv2.imshow('apple_phone.png', phone_circle)
# 显示图像,等待 10 秒后关闭窗口
cv2.waitKey(10000)
# 关闭所有打开的窗口
cv2.destroyAllWindows()
运行效果:
外接矩阵
cv2.rectangle()
是OpenCV库中用于绘制矩形的函数,它的基本语法如下:
cv2.rectangle(image, pt1, pt2, color, thickness, lineType, shift)
-
image
: 这是要在其上绘制矩形的图像。通常,你会将原始图像传递给这个参数,并且该函数将在原始图像上进行绘制,而不是创建一个新图像。 -
pt1
: 这是矩形的左上角坐标,通常是一个包含两个整数值的元组(x1, y1)
,其中(x1, y1)
表示左上角的像素坐标。 -
pt2
: 这是矩形的右下角坐标,通常是一个包含两个整数值的元组(x2, y2)
,其中(x2, y2)
表示右下角的像素坐标。 -
color
: 这是绘制矩形的颜色,通常是一个包含三个整数值的元组(B, G, R)
,其中 B、G 和 R 分别表示蓝、绿和红通道的颜色强度。例如,(0, 255, 0) 表示绿色。 -
thickness
(可选): 这是绘制矩形的线宽度,通常是一个正整数。如果thickness
为正,表示绘制实心矩形,如果为负或零,表示绘制一个带有指定宽度的矩形边框。通常,使用正整数值。 -
lineType
(可选): 这是线的类型。默认情况下,它是8,表示八连接线。你通常不需要更改此参数,除非你需要特定类型的线。 -
shift
(可选): 这是用于坐标位移的可选参数。通常不需要使用这个参数。
代码实现:
# 导入OpenCV库
import cv2
# 从文件加载图像(请确保文件存在于当前工作目录或提供正确的路径)
phone = cv2.imread('apple_phone.png')
# 转换图像为灰度图,以便后续处理
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)
# 应用阈值化,将图像转换为二值图像
# 阈值化将像素值大于 120 的像素置为 255(白色),小于等于 120 的像素置为 0(黑色)
ret, phone_thresh = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
# 查找图像中的轮廓
# phone_thresh 是二值图像,RETR_TREE 表示检测所有轮廓,并构建轮廓的层次结构
# CHAIN_APPROX_NONE 表示不进行轮廓近似,保留所有轮廓上的点
image, contours, hierarchy = cv2.findContours(phone_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 选择一个特定的轮廓(在此示例中选择第7个轮廓,索引从0开始)
cnt = contours[6]
# 计算轮廓的最小外接矩形
x, y, w, h = cv2.boundingRect(cnt)
# 在图像上绘制矩形
phone_rectangle = cv2.rectangle(phone, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示带有矩形的图像
cv2.imshow('phone_rectangle', phone_rectangle)
# 等待10秒后关闭窗口
cv2.waitKey(10000)
# 关闭所有打开的窗口
cv2.destroyAllWindows()
运行结果: