OpenCV 从零学习 · 第 9 讲:绘制图形与文字
函数:cv2.line / cv2.rectangle / cv2.circle / cv2.putText | 难度:★☆☆☆☆
前面讲了找轮廓、算外接框,但结果要"看得见"才有用。OpenCV 提供一组绘制函数:画线、画矩形、画圆、写字,全部直接在原图上修改(in-place)。掌握它们,你就能给检测结果加框、加标签、标关键点。本讲讲清每个函数的参数,以及两个高频坑:颜色顺序是 BGR、putText 不支持中文。
一、画线、矩形、圆
函数签名
cv2.line(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)
cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)
cv2.circle(img, center, radius, color, thickness=1, lineType=8, shift=0)
| 参数 | 含义 |
img | 目标图,原地修改,无返回值 |
pt1 / pt2 / center | 坐标,元组 (x, y)(注意是先 x 后 y) |
color | BGR 三元组,如 (0,0,255)=红 |
thickness | 线宽;-1 表示填充图形内部 |
场景 A · 给检测框上方画矩形 + 写标签
上一讲算出的
上一讲算出的
(x,y,w,h),用 cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2) 画绿框,正是目标检测框的样子。
场景 B · 画圆标记关键点
如人脸关键点(眼睛、鼻尖):
如人脸关键点(眼睛、鼻尖):
cv2.circle(img, (ex, ey), 3, (0,0,255), -1),thickness=-1 画成实心红点。
import cv2
img = cv2.imread('photo.jpg')
cv2.line(img, (50, 50), (200, 50), (255, 0, 0), 3) # 蓝线
cv2.rectangle(img, (60, 60), (160, 160), (0, 255, 0), 2) # 绿框
cv2.circle(img, (110, 110), 20, (0, 0, 255), -1) # 实心红圆
二、写文字 cv2.putText
cv2.putText(img, text, org, fontFace, fontScale, color, thickness=1, lineType=8, bottomLeftOrigin=False)
| 参数 | 含义 |
text | 要写的字符串(仅英文/数字) |
org | 文字左下角起点坐标 (x, y) |
fontFace | 字体,如 cv2.FONT_HERSHEY_SIMPLEX |
fontScale | 字号缩放,如 0.5 / 1.0 |
场景 C · 在框上方写英文标签
cv2.putText(img, 'cat', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2) 在绿框上方标 "cat"。注意 y 减 10 是为了让文字落在框外上方。
⚠ 新手必踩坑 1:颜色是 BGR 不是 RGB
OpenCV 读进来的图是 BGR 顺序,所以绘制时
OpenCV 读进来的图是 BGR 顺序,所以绘制时
(255,0,0) 是蓝不是红,(0,0,255) 才是红。习惯 RGB 的人极易写反。
⚠ 新手必踩坑 2:putText 不支持中文
cv2.putText(img, '猫', ...) 会出现方框或乱码——OpenCV 自带字体不含中文字形。要写中文,必须用 PIL(Pillow)画再转回 NumPy 数组。
场景 D · 中文标注走 PIL 方案
把图转成 PIL Image → 用
把图转成 PIL Image → 用
ImageDraw + 中文字体 ImageFont.truetype 写字 → 转回 NumPy。下面是完整可运行代码:
import cv2, numpy as np
from PIL import Image, ImageDraw, ImageFont
img = cv2.imread('photo.jpg')
pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # BGR→RGB 给 PIL
draw = ImageDraw.Draw(pil)
# 请换成你系统里真实存在的中文字体路径
font = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', 28)
draw.text((30, 30), '识别结果:猫', font=font, fill=(0, 255, 0))
img = cv2.cvtColor(np.array(pil), cv2.COLOR_RGB2BGR) # 转回 BGR
本讲要点
- line / rectangle / circle / putText 全部原地修改原图,不返回新图。
- 坐标统一是
(x, y),颜色统一是 BGR 三元组。 thickness=-1表示填充图形;putText 的org是文字左下角。- putText 不支持中文,中文标注用 PIL 绘制再转回。
下一讲:第 10 讲 · 形态学操作(腐蚀/膨胀/开闭运算)——用"结构元素"去噪、填空洞、提取边缘,是二值图处理利器。
