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 旋转 |
通用要点
- 颜色都是 BGR
[B, G, R],每值 0~255 - thickness 为负数 = 填充形状(圆/矩形)
- lineType 常用
cv2.LINE_AA(抗锯齿平滑)vscv2.LINE_8(生硬) - 左上角是原点,X 右 = 宽,Y 下 = 高;坐标可在「画图」工具查看
- 函数会在原图上绘制并返回,记得存回
image变量再显示