OpenCV 绘图五件套:画圆、文本、线段、矩形与椭圆

OpenCV 绘图五件套:画圆、文本、线段、矩形与椭圆

OpenCV 图像处理课程 · 第 4 章「Draw Shape」学习笔记

环境:Python 3.10 + opencv-python 4.5.5.64 + PyCharm(chapter4 目录)

包含 5 课:画圆 / 加文本 / 画线段 / 画矩形 / 画椭圆


章节总览

课 主题 核心函数 文件
01 画圆 cv2.circle() circle.py
02 加文本 cv2.putText() text_message.py
03 画线段 cv2.line() line_segment.py
04 画矩形 cv2.rectangle() rectangle.py
05 画椭圆 cv2.ellipse() draw_ellipse.py

本章说明 :读图/视频的流程不变,本章重点讲各绘图函数及其参数。讲师强调:不用死记所有参数,知道有这函数 + 查 Google 即可。

五个绘图函数一览:
#mermaid-svg-HatllCOGKw3bDlYU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HatllCOGKw3bDlYU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HatllCOGKw3bDlYU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HatllCOGKw3bDlYU .error-icon{fill:#552222;}#mermaid-svg-HatllCOGKw3bDlYU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HatllCOGKw3bDlYU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HatllCOGKw3bDlYU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HatllCOGKw3bDlYU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HatllCOGKw3bDlYU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HatllCOGKw3bDlYU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HatllCOGKw3bDlYU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HatllCOGKw3bDlYU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HatllCOGKw3bDlYU .marker.cross{stroke:#333333;}#mermaid-svg-HatllCOGKw3bDlYU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HatllCOGKw3bDlYU p{margin:0;}#mermaid-svg-HatllCOGKw3bDlYU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HatllCOGKw3bDlYU .cluster-label text{fill:#333;}#mermaid-svg-HatllCOGKw3bDlYU .cluster-label span{color:#333;}#mermaid-svg-HatllCOGKw3bDlYU .cluster-label span p{background-color:transparent;}#mermaid-svg-HatllCOGKw3bDlYU .label text,#mermaid-svg-HatllCOGKw3bDlYU span{fill:#333;color:#333;}#mermaid-svg-HatllCOGKw3bDlYU .node rect,#mermaid-svg-HatllCOGKw3bDlYU .node circle,#mermaid-svg-HatllCOGKw3bDlYU .node ellipse,#mermaid-svg-HatllCOGKw3bDlYU .node polygon,#mermaid-svg-HatllCOGKw3bDlYU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HatllCOGKw3bDlYU .rough-node .label text,#mermaid-svg-HatllCOGKw3bDlYU .node .label text,#mermaid-svg-HatllCOGKw3bDlYU .image-shape .label,#mermaid-svg-HatllCOGKw3bDlYU .icon-shape .label{text-anchor:middle;}#mermaid-svg-HatllCOGKw3bDlYU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HatllCOGKw3bDlYU .rough-node .label,#mermaid-svg-HatllCOGKw3bDlYU .node .label,#mermaid-svg-HatllCOGKw3bDlYU .image-shape .label,#mermaid-svg-HatllCOGKw3bDlYU .icon-shape .label{text-align:center;}#mermaid-svg-HatllCOGKw3bDlYU .node.clickable{cursor:pointer;}#mermaid-svg-HatllCOGKw3bDlYU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HatllCOGKw3bDlYU .arrowheadPath{fill:#333333;}#mermaid-svg-HatllCOGKw3bDlYU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HatllCOGKw3bDlYU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HatllCOGKw3bDlYU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HatllCOGKw3bDlYU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HatllCOGKw3bDlYU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HatllCOGKw3bDlYU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HatllCOGKw3bDlYU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HatllCOGKw3bDlYU .cluster text{fill:#333;}#mermaid-svg-HatllCOGKw3bDlYU .cluster span{color:#333;}#mermaid-svg-HatllCOGKw3bDlYU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HatllCOGKw3bDlYU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HatllCOGKw3bDlYU rect.text{fill:none;stroke-width:0;}#mermaid-svg-HatllCOGKw3bDlYU .icon-shape,#mermaid-svg-HatllCOGKw3bDlYU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HatllCOGKw3bDlYU .icon-shape p,#mermaid-svg-HatllCOGKw3bDlYU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HatllCOGKw3bDlYU .icon-shape .label rect,#mermaid-svg-HatllCOGKw3bDlYU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HatllCOGKw3bDlYU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HatllCOGKw3bDlYU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HatllCOGKw3bDlYU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原图像
cv2.circle()

圆心 + 半径
cv2.putText()

文本 + 左下角原点
cv2.line()

起点 + 终点
cv2.rectangle()

两个对角点
cv2.ellipse()

中心 + 半轴 + 角度
绘制后图像(BGR)


第 1 课 · 画圆(cv2.circle)

函数签名

python 复制代码
cv2.circle(image, center, radius, color, thickness=None, lineType=None, shift=None)

参数

参数 含义
image 要画圆的输入图像
center 圆心坐标 (x, y),列表或数组
radius 半径
color BGR 颜色列表 [B, G, R](每值 0~255)
thickness 线宽:正数=轮廓粗细,负数=填充圆
lineType 线型(如 cv2.LINE_AA 抗锯齿、cv2.LINE_8)

完整代码(circle.py)

python 复制代码
import cv2

image_path = "../data/horse.jpg"
image = cv2.imread(image_path)

image = cv2.circle(image, (337, 173), 100, (255, 0, 0), 4, cv2.LINE_AA)

cv2.imshow("circle image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

要点

  • 图像左上角是原点:X 向右=宽度,Y 向下=高度
  • 位置可查「画图」工具里的坐标
  • 调参演示:半径 100→160;颜色 (255,0,0) 红→(0,0,255) 蓝;粗细 2→5→**-5(填充)**;线型 LINE_8(生硬)→LINE_AA(平滑)

第 2 课 · 添加文本(cv2.putText)

函数签名

python 复制代码
cv2.putText(image, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

参数

参数 含义
image 要加文字的图像
text 文本内容(字符串)
org 文本起点坐标 (x, y),左下角
fontFace 字体类型(如 cv2.FONT_HERSHEY_*)
fontScale 字体大小缩放因子
color BGR 颜色
thickness 加粗程度(正数)
lineType 线型
bottomLeftOrigin 可选,默认 None/False

完整代码(text_message.py)

python 复制代码
import cv2

image_path = "../data/horse.jpg"
image = cv2.imread(image_path)

image = cv2.putText(image, "HORSE", (40, 44),
                    cv2.FONT_HERSHEY_SIMPLEX, 2,
                    (255, 0, 255), 3, cv2.LINE_AA)

cv2.imshow("text message image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

要点

  • 文本原点 org 是左下角坐标
  • 常用字体:FONT_HERSHEY_SIMPLEX / FONT_HERSHEY_SCRIPT_SIMPLEX(斜体)等
  • fontScale 控制字号(2→5 变大);thickness 控制加粗

第 3 课 · 画线段(cv2.line)

函数签名

python 复制代码
cv2.line(image, pt1, pt2, color, thickness=None, lineType=None, shift=None)

参数

参数 含义
image 要画线的图像
pt1 线段起点 (x, y)
pt2 线段终点 (x, y)
color BGR 颜色
thickness 线宽(正数)
lineType 线型

完整代码(line_segment.py)

python 复制代码
import cv2

image_path = "../data/horse.jpg"
image = cv2.imread(image_path)

image = cv2.line(image, (20, 30), (100, 200), (255, 255, 0), 4, cv2.LINE_AA)

cv2.imshow("image line", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

要点

  • 需要两个点(起点 + 终点)确定一条线段
  • 可改 pt1/pt2 调整线段位置(如 (100,100)→(200,250))

第 4 课 · 画矩形(cv2.rectangle)

函数签名

python 复制代码
cv2.rectangle(image, pt1, pt2, color, thickness=None, lineType=None, shift=None)

参数

参数 含义
image 要画矩形的图像
pt1 矩形一个对角角点 (x, y)
pt2 相对的另一个对角角点 (x, y)
color BGR 颜色
thickness 线宽(负数=填充矩形)
lineType 线型

完整代码(rectangle.py)

python 复制代码
import cv2

image_path = "../data/horse.jpg"
image = cv2.imread(image_path)

# 左上角 + 右下角两个对角点
image = cv2.rectangle(image, (174, 26), (525, 341),
                      (0, 255, 255), 4, cv2.LINE_AA)

cv2.imshow("rectangle image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

要点

  • 矩形有 4 个角,但只需 2 个对角点即可确定(宽=两角 X 差,高=两角 Y 差)
  • 也可用右上角 + 左下角
  • thickness 为负数 (如 -2)→ 填充矩形

第 5 课 · 画椭圆(cv2.ellipse)

函数签名

python 复制代码
cv2.ellipse(image, center, axes, angle, startAngle, endAngle,
            color, thickness=None, lineType=None, shift=None)

参数

参数 含义
image 要画椭圆的图像
center 椭圆中心 (x, y)
axes (长轴一半, 短轴一半),两个值
angle 旋转角度(度,0=不旋转)
startAngle 椭圆弧起始角(度)
endAngle 椭圆弧结束角(度)
color BGR 颜色
thickness 线宽
lineType 线型

完整代码(draw_ellipse.py)

python 复制代码
import cv2

image_path = "../data/horse.jpg"
image = cv2.imread(image_path)

# 中心(278,180),axes=(100,50),角度0,0→360度完整椭圆
image = cv2.ellipse(image, (278, 180), (100, 50),
                    0, 0, 360, (255, 255, 0), 3, cv2.LINE_AA)

cv2.imshow("ellipse image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

要点

  • axes 是半轴长度(主/次轴各一半)
  • angle 旋转椭圆(0→60 度)
  • startAngle/endAngle 控制画完整椭圆 (0~360)还是部分弧(如 0~180 半椭圆)

本章小结(速查表)

形状 函数 关键点
圆 cv2.circle(im, center, r, color, t, lt) 负数 thickness=填充
文本 cv2.putText(im, text, org, font, scale, color, t) org 是左下角
线 cv2.line(im, pt1, pt2, color, t, lt) 两点定线
矩形 cv2.rectangle(im, pt1, pt2, color, t) 两对角点;负数=填充
椭圆 cv2.ellipse(im, center, axes, angle, start, end, color) axes=半轴;angle 旋转

通用要点

  1. 颜色都是 BGR [B, G, R],每值 0~255
  2. thickness 为负数 = 填充形状(圆/矩形)
  3. lineType 常用 cv2.LINE_AA(抗锯齿平滑)vs cv2.LINE_8(生硬)
  4. 左上角是原点,X 右 = 宽,Y 下 = 高;坐标可在「画图」工具查看
  5. 函数会在原图上绘制并返回,记得存回 image 变量再显示
相关推荐
冬奇Lab13 小时前
一天一个开源项目(第230篇):HandRaw-Style —— 把 327 种手绘风格、165 种排版、36 种配色编号化,让 AI 画图不再每次都飘
人工智能·开源·资讯
罗西的思考13 小时前
从陶哲轩的访谈看:AI 数学研究方法论 & 给其它行业的启示
人工智能
学...14 小时前
软件学报 2023 论文《面向复杂约束优化问题的进化算法综述》阅读笔记
人工智能·ga·cmop
xhy_070714 小时前
AI 在同一步上反复打转怎么办?WES Code 循环检测怎么用
人工智能·大模型·ai编程·wes code
鱼宵15 小时前
Spring AI 提示词模板:{变量} 参数化 + few-shot,一条提示词反复用
java·人工智能·spring·few-shot·提示词工程·springai
蜗牛互联网15 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
架构师那点事儿15 小时前
大模型如何私有化部署到生产环境
人工智能·架构·llm
HeyAI人工智能15 小时前
官网内容优化 vs 企业级 RAG:AI 搜索时代,企业到底该先做什么?
人工智能·aigc
statistican_ABin15 小时前
中国国际旅游发展分析报告—基于世界银行国际旅游数据的多维度分析
python·机器学习·旅游
黑妹天下第一乖15 小时前
第09讲 · 多媒体与音频 SDK:硬件编解码与端侧语音
人工智能·嵌入式硬件·深度学习·机器人·音视频·iot