Opencv基础——画图
本文介绍了使用OpenCV和NumPy进行基础图像绘制的常用方法。首先讲解了如何用np.ones()创建单色画布,包括参数说明和通道数选择建议。接着详细说明了cv2.line()和cv2.polylines()两种画线函数的使用方法、参数配置及注意事项。最后介绍了三种常用图形的绘制:箭头线条(cv2.arrowedLine())、矩形(cv2.rectangle())和圆形(cv2.circle(
1.创建画布,numpy.ones(shape, dtype=float, order=‘C’)
这个函数不是opencv自带的,而是numpy里面的,需要在函数开头导入,就像是导入opencv的库cv2一样。
import numpy as np//别名取为np
import cv2
取了别名之后,创建单色画布就变成了np.ones(shape, dtype=float, order=‘C’),每个参数的意思是
| 参数 | 类型 | 含义 | 示例值 | 备注 |
|---|---|---|---|---|
| shape | tuple | 数组形状 | (512, 512, 3) | (高度, 宽度, 通道数) |
| dtype | type | 数据类型 | np.uint8 | 像素值类型 |
最后的参数order=‘C’,是用来控制行优先还是列优先的,我们使用的时候省略即可,不需要写他,默认就是C。
| 通道数 | 名称 | 含义 | 数据形状 | 应用场景 |
|---|---|---|---|---|
| 1通道 | 灰度图 | 只有亮度信息 | (高, 宽) | 黑白照片、文档扫描 |
| 3通道 | 彩色图 | RGB/BGR颜色 | (高, 宽, 3) | 普通彩色照片 |
| 4通道 | 带透明度 | RGB + Alpha | (高, 宽, 4) | PNG透明图、游戏素材 |
不是每个设备都支持4通道的,但是几乎所有的设备都支持1 3通道。并且4通道绘图也比较复杂。
实际上画布是不止只有这个类型的函数,但是ones最通用,我就直说他了。
使用示例:
black_img = np.ones((100, 100, 3), np.uint8) * 0 # 全0 = 黑色
white_img = np.ones((100, 100, 3), np.uint8) * 255 # 全255 = 白色
gray_img = np.ones((100, 100, 3), np.uint8) * 128 # 全128 = 灰色
2.画线, cv2.line(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)和 cv2.polylines(img, pts, isClosed, color, thickness=1, lineType=8, shift=0)
cv2.line
很明显是用来画线的,各个参数含义如下。
| 参数 | 类型 | 含义 | 当前值 | 可选值/范围 | 默认值 |
|---|---|---|---|---|---|
| img | numpy.ndarray | 目标图像 | img | 任何有效图像数组 | - |
| pt1 | tuple | 起始点坐标 | (0, 0) | (x, y) 整数坐标 | - |
| pt2 | tuple | 结束点坐标 | (511, 511) | (x, y) 整数坐标 | - |
| color | tuple | 线条颜色 | (255, 0, 0) | BGR值或灰度值 | - |
| thickness | int | 线条粗细 | 5 | 1-255 像素 | 1 |
| lineType | int | 线条类型 | (省略) | 8, 4, cv2.LINE_AA | 8 |
| shift | int | 坐标精度 | (省略) | 0-16 | 0 |
cv2.line()函数特点:
1. 原地修改:直接改变输入图像
2. 精确控制:坐标、颜色、粗细全可控
3. 高效绘制:C++底层实现,速度快
4. 灵活参数:支持抗锯齿、亚像素精度
调用非常简单,要注意这个函数是直接修改原图像,不会返回一个新图像。
使用示例:
cv2.line(img, pt1=(0, 0), pt2=(511, 511), color=(255, 0, 0), thickness=5)
cv2.polylines
它就是上一个函数的pro版本,可以一次性连多根线。下面是对应的参数列表。
| 参数 | 类型 | 是否必需 | 默认值 | 含义 | 示例 |
|---|---|---|---|---|---|
| img | numpy.ndarray | ✅ 必需 | - | 目标图像 | img |
| pts | list[numpy.ndarray] | ✅ 必需 | - | 点集列表 | [shape1, shape2] |
| isClosed | bool | ✅ 必需 | - | 是否闭合 | True/False |
| color | tuple | ✅ 必需 | - | 线条颜色 | (255, 0, 0) |
| thickness | int | ❌ 可选 | 1 | 线条粗细 | 2 |
| lineType | int | ❌ 可选 | 8 | 线条类型 | cv2.LINE_AA |
| shift | int | ❌ 可选 | 0 | 坐标精度 | 0 |
调用这个函数的时候,它会把同一个点集的点,按照顺序依次连接,至于第一个点和最后一个点是否相连,取决于参数isClosed。注意了,不同点集的点是独立的,不会相连。
特别注意了,这是一个复杂绘图函数,它所需要的点集不是简单的(),()。必须是通过np.array转换得来的点集。
3.常用绘图,箭头,矩形,圆
箭头线条, cv2.arrowedLine(img, pt1, pt2, color, thickness=1, line_type=8, shift=0, tipLength=0.1)
用来画箭头,从pt1起始点指向pt2结束点。
| 参数 | 类型 | 是否必需 | 默认值 | 含义 | 示例值 |
|---|---|---|---|---|---|
| img | numpy.ndarray | ✅ 必需 | - | 目标图像 | img |
| pt1 | tuple | ✅ 必需 | - | 箭头起始点 | (21, 13) |
| pt2 | tuple | ✅ 必需 | - | 箭头指向的终点 | (151, 401) |
| color | tuple/int | ✅ 必需 | - | 线条颜色 | (255, 0, 0) |
| thickness | int | ❌ 可省略 | 1 | 线条粗细(像素) | 5 |
| line_type | int | ❌ 可省略 | 8 | 线条类型 | cv2.LINE_AA |
| shift | int | ❌ 可省略 | 0 | 坐标精度位移 | 0 |
| tipLength | float | ❌ 可省略 | 0.1 | 箭头长度相对比例 | 0.1 |
示例
cv2.arrowedLine(img,pt1=(21, 13), pt2=(151, 401), color=(255, 0, 0), thickness=5)
矩形,cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)
用来画矩形,pt1是左上角的那个点,pt2是右下角的那个点。
| 参数 | 类型 | 是否必需 | 默认值 | 含义 | 示例值 |
|---|---|---|---|---|---|
| img | numpy.ndarray | ✅ 必需 | - | 目标图像 | img |
| pt1 | tuple | ✅ 必需 | - | 矩形左上角坐标 | (384, 0) |
| pt2 | tuple | ✅ 必需 | - | 矩形右下角坐标 | (510, 128) |
| color | tuple/int | ✅ 必需 | - | 边框/填充颜色 | (0, 255, 0) |
| thickness | int | ❌ 可省略 | 1 | 边框粗细,-1为填充 | 3 |
| lineType | int | ❌ 可省略 | 8 | 线条类型 | cv2.LINE_AA |
| shift | int | ❌ 可省略 | 0 | 坐标精度位移 | 0 |
圆形,cv2.circle(img, center, radius, color, thickness=1, lineType=8, shift=0)
| 参数 | 类型 | 是否必需 | 默认值 | 含义 | 示例值 |
|---|---|---|---|---|---|
| img | numpy.ndarray | ✅ 必需 | - | 目标图像 | img |
| center | tuple | ✅ 必需 | - | 圆心坐标 | (447, 63) |
| radius | int | ✅ 必需 | - | 圆的半径(像素) | 63 |
| color | tuple/int | ✅ 必需 | - | 边框/填充颜色 | (0, 0, 255) |
| thickness | int | ❌ 可省略 | 1 | 边框粗细,-1为填充 | -1 |
| lineType | int | ❌ 可省略 | 8 | 线条类型 | cv2.LINE_AA |
| shift | int | ❌ 可省略 | 0 | 坐标精度位移 | 0 |
4.写字, cv2.putText(img, text, org, fontFace, fontScale, color, thickness=1, lineType=8, bottomLeftOrigin=False)
顾名思义,用来写文本的函数。
| 参数 | 类型 | 是否必需 | 默认值 | 含义 | 示例值 |
|---|---|---|---|---|---|
| img | numpy.ndarray | ✅ 必需 | - | 目标图像 | img |
| text | str | ✅ 必需 | - | 要绘制的文字内容 | ‘OpenCV’ |
| org | tuple | ✅ 必需 | - | 文字位置坐标 | (10, 500) |
| fontFace | int | ✅ 必需 | - | 字体类型 | cv2.FONT_HERSHEY_SIMPLEX |
| fontScale | float | ✅ 必需 | - | 字体缩放因子 | 4 |
| color | tuple/int | ✅ 必需 | - | 文字颜色 | (255, 255, 255) |
| thickness | int | ❌ 可选 | 1 | 文字线条粗细 | 2 |
| lineType | int | ❌ 可选 | 8 | 线条类型 | cv2.LINE_AA |
| bottomLeftOrigin | bool | ❌ 可选 | False | 坐标系原点位置 | True |
所有可用字体:
| 字体常量 | 数值 | 效果描述 | 适用场景 |
|---|---|---|---|
| FONT_HERSHEY_SIMPLEX | 0 | 正常大小sans-serif字体 | 最常用,清晰易读 |
| FONT_HERSHEY_PLAIN | 1 | 小号sans-serif字体 | 节省空间 |
| FONT_HERSHEY_DUPLEX | 2 | 正常大小sans-serif字体 | 比SIMPLEX稍粗 |
| FONT_HERSHEY_COMPLEX | 3 | 正常大小serif字体 | 正式文档 |
| FONT_HERSHEY_TRIPLEX | 4 | 正常大小serif字体 | 更正式 |
| FONT_HERSHEY_COMPLEX_SMALL | 5 | 小号serif字体 | 小字标注 |
| FONT_HERSHEY_SCRIPT_SIMPLEX | 6 | 手写风格字体 | 艺术效果 |
| FONT_HERSHEY_SCRIPT_COMPLEX | 7 | 复杂手写风格字体 | 装饰性文字 |
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)