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 变量再显示
相关推荐
水如烟17 分钟前
孤能子视角:EIS下的宏观、微观时空,以及光速常数与虚空背景
人工智能
web行路人19 分钟前
AI全栈之旅 · 第一周总结
python
slacker-kian22 分钟前
HuggingFace API加载模型超时:用 ModelScopeAPI 替代
人工智能·python·transformer·huggingface·blip·modelscope·blipprocessor
mmsx24 分钟前
用正则把数百个文件抽成知识图谱:三版迭代,从“能用“到“可移植“
人工智能·知识图谱
罗西的思考37 分钟前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(1)— 总体
人工智能·笔记·深度学习·机器学习
cuguanren42 分钟前
Agent 框架的会话记忆管理机制
人工智能·ai·大模型·llm·agent·上下文管理·会话记忆管理
七夜zippoe1 小时前
DolphinDB 高可用部署实战:从容灾设计到故障自动转移
开发语言·python·高可用·容灾·dolphindb
高工智能汽车1 小时前
从“借船”到“造船”,汽车芯片出海迎历史性一跃
人工智能·汽车
l1258651 小时前
# LangGraph Deep Research Agent 全流程设计:多轮研究、人机协同与真实来源管理
数据库·人工智能·python·算法·自然语言处理·oracle·langchain