欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

OpenCV 从零学习 · 第 9 讲:在图像上画图形与文字(line / rectangle / circle / putText,做标注)

OpenCV 从零学习 · 第 9 讲:绘制图形与文字

函数:cv2.line / cv2.rectangle / cv2.circle / cv2.putText | 难度:★☆☆☆☆

前面讲了找轮廓、算外接框,但结果要"看得见"才有用。OpenCV 提供一组绘制函数:画线、画矩形、画圆、写字,全部直接在原图上修改(in-place)。掌握它们,你就能给检测结果加框、加标签、标关键点。本讲讲清每个函数的参数,以及两个高频坑:颜色顺序是 BGRputText 不支持中文


一、画线、矩形、圆

函数签名

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)
colorBGR 三元组,如 (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 顺序,所以绘制时 (255,0,0)不是红,(0,0,255) 才是红。习惯 RGB 的人极易写反。
⚠ 新手必踩坑 2:putText 不支持中文
cv2.putText(img, '猫', ...) 会出现方框或乱码——OpenCV 自带字体不含中文字形。要写中文,必须用 PIL(Pillow)画再转回 NumPy 数组。
场景 D · 中文标注走 PIL 方案
把图转成 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 讲 · 形态学操作(腐蚀/膨胀/开闭运算)——用"结构元素"去噪、填空洞、提取边缘,是二值图处理利器。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功