@TOC
ffmpeg-python
ffmpeg-python 是一个用于操作 FFmpeg 的 Python 库,它通过 Python 对象和链式调用封装了 FFmpeg 的命令行参数。
核心概念
input():创建输入流pythoninput_stream = ffmpeg.input('input.mp4', ss=10, t=5) # 从第10秒开始,读取5秒- 关键参数:
filename:输入文件路径ss:起始时间(秒或HH:MM:SS)t:持续时间f:强制输入格式(如f='rawvideo')
- 关键参数:
output():生成输出流pythonoutput_stream = ffmpeg.output(input_stream, 'output.mp4', vcodec='libx264', crf=23)- 关键参数:
filename:输出路径vcodec/acodec:视频/音频编码器('libx264','aac','copy')crf:视频质量(0-51,值越低质量越高)b:v/b:a:视频/音频比特率(如b:v='1M')r:帧率(如r=30)s:分辨率(如s='1280x720')preset:编码速度('ultrafast','slow')
- 关键参数:
run():执行命令pythonffmpeg.run(output_stream, overwrite_output=True) # 覆盖已存在文件
常用过滤器(Filters)
通过 .filter() 方法调用:
filtered = input_stream.filter('filter_name', **params)视频缩放
pythonscaled = input_stream.filter('scale', width=640, height=-1) # 宽度640,高度按比例裁剪
pythoncropped = input_stream.filter('crop', w=100, h=100, x=20, y=20)旋转
pythonrotated = input_stream.filter('rotate', angle=45*math.pi/180) # 45度叠加水印
pythonwatermarked = ffmpeg.overlay( input_stream, ffmpeg.input('watermark.png').filter('scale', 50, 50), x=10, y=10 )音频降噪
pythondenoised = input_stream.filter('afftdn', nf=-20) # 降噪强度
高级操作
合并多个输入
pythonvideo = ffmpeg.input('video.mp4') audio = ffmpeg.input('audio.mp3') output = ffmpeg.output(video, audio, 'merged.mp4', vcodec='copy', acodec='aac')提取音轨
pythonffmpeg.input('video.mp4').output('audio_only.mp3', acodec='libmp3lame').run()生成 GIF
python( ffmpeg.input('video.mp4', t=3) .filter('fps', fps=10) .output('output.gif', loop=0) .run() )硬件加速(NVIDIA)
python( ffmpeg.input('input.mp4') .output('output.mp4', vcodec='h264_nvenc', # NVIDIA 编码器 preset='p1', rc='constqp', qp=21) .run() )
视频截帧转换图片示例
import ffmpeg
import os
def video2img(dir_video, dir_imgs, start_time=60, fps=1, quality=85):
"""从指定时间开始提取关键帧并压缩
Args:
start_time: 开始时间(秒)
fps: 每秒抽取帧数
quality: JPEG压缩质量
"""
(
ffmpeg.input(dir_video, ss=start_time) # 在输入级别跳转
.trim(start=0) # 从跳转后的0秒开始(即start_time位置)
.filter('fps', fps=fps) # 控制抽帧率
.output(dir_imgs,
q=quality, # JPEG压缩
vsync=0) # 防止帧重复问题
.run(quiet=True) # 静默模式
)
def video2bmp(dir_video, dir_imgs, start_time=60, fps=1):
"""从指定时间开始提取关键帧并输出为BMP
Args:
start_time: 开始时间(秒)
fps: 每秒抽取帧数
"""
(
ffmpeg.input(dir_video, ss=start_time) # 在输入级别跳转
.trim(start=0) # 从跳转后的0秒开始(即start_time位置)
.filter('fps', fps=fps) # 控制抽帧率
.output(dir_imgs,
pix_fmt='rgb24', # BMP需要RGB格式
vcodec='bmp', # 指定输出为BMP格式
vsync=0) # 防止帧重复问题
.run(quiet=True) # 静默模式
)
input_dir = './video/'
output_dir = './picture/'
os.makedirs(output_dir, exist_ok=True)
# 配置参数(按需调整)
START_TIME = 1200 # 从第60秒(1分钟)开始
EXTRACT_FPS = 1 # 每秒抽帧数
JPEG_QUALITY = 85 # 压缩质量
for file_name in os.listdir(input_dir):
if not file_name.lower().endswith(('.mp4', '.avi', '.mov', '.mkv', '.flv')):
continue
# 构建路径
video_path = os.path.join(input_dir, file_name)
output_subdir = os.path.join(output_dir, os.path.splitext(file_name)[0])
os.makedirs(output_subdir, exist_ok=True)
# 输出路径格式 - 改为.bmp后缀
# output_pattern = os.path.join(output_subdir, 'frame_%04d.bmp')
output_pattern = os.path.join(output_subdir, 'frame_%04d.jpg')
try:
# 从指定时间开始提取
# video2bmp(
# video_path,
# output_pattern,
# start_time=START_TIME,
# fps=EXTRACT_FPS
# )
video2img(
video_path,
output_pattern,
start_time=START_TIME,
fps=EXTRACT_FPS,
quality=JPEG_QUALITY
)
print(f"完成提取: {file_name} (从 {START_TIME} 秒开始)")
except Exception as e:
print(f"处理失败: {file_name} - {str(e)}")参考
- 官方文档:ffmpeg-python GitHub
ultralytics.YOLO(You Only Look Once)

.
├── __init__.py
├── assets: 测试图片
├── cfg: 配置文件,包括数据集、模型、目标跟踪等
├── data: 数据集处理代码,
├── engine: 核心引擎代码,包括YOLO模型结构代码、预测引擎代码、训练器代码
├── hub: Ultralytics Hub登录、连接等相关代码
├── models: 模型定义代码,包含YOLO, SAM, RTDetr,nas等
├── nn: 神经网络模块定义代码,基础组件所在处
├── solutions: 下游任务解决方案代码,如目标跟踪、区域计数、速度估计等
├── trackers: 目标跟踪模块代码,包括具体跟踪算法实现,如bot sort、byte tracker等
└── utils: 工具函数核心思想:端到端的统一检测
- 摒弃传统流程: 不同于早期的R-CNN系列(R-CNN, Fast R-CNN, Faster R-CNN)等两阶段方法(先提取候选区域,再对每个区域分类和回归),YOLO是单阶段(One-Stage) 方法的代表。
- “只看一眼”: 将整个输入图像一次性输入到一个单一的卷积神经网络(CNN)。
- 统一预测: 网络在单次前向传播中,直接预测图像中所有目标的位置(边界框)和类别。它将预测问题建模为一个端到端的回归任务。
1. 模型加载
https://docs.ultralytics.com/zh/models/
from ultralytics import YOLO
# 加载预训练模型(支持 .pt, .yaml, 或官方模型名)
model = YOLO("yolov8n.pt") # 加载预训练权重
# 或
model = YOLO("yolov8n.yaml") # 从配置文件构建新模型2. 训练模型 (train())
https://docs.ultralytics.com/zh/modes/train/#idle-gpu-training
model.train(
data='dataset.yaml', # 数据集配置文件路径
epochs=100, # 训练轮次
batch=16, # 批次大小
imgsz=640, # 输入图像尺寸
device='cuda', # 训练设备
workers=8, # 数据加载线程数
optimizer='SGD', # 优化器类型
lr0=0.01, # 初始学习率
weight_decay=0.0005, # 权重衰减
augment=True, # 数据增强开关
# 增强参数:
hsv_h=0.015, # 色相增强幅度
fliplr=0.5, # 左右翻转概率
mosaic=1.0, # Mosaic增强概率
mixup=0.1, # Mixup增强概率
# 输出控制:
project='runs/train', # 结果保存目录
name='exp1', # 实验名称
save_period=10, # 每N轮保存一次检查点
resume=False, # 恢复训练
)标准YAML格式示例
在YOLO(尤其是YOLOv5/YOLOv8)中,用于训练的数据集配置文件(如 basket_random_split.yaml)需要遵循特定格式。
# basket_random_split.yaml
path: ./datasets/basket # 数据集根目录
train: images/train # 训练集路径(相对于path)
val: images/val # 验证集路径(相对于path)
test: images/test # 测试集路径(可选)
# 类别数量
nc: 3
# 类别名称列表(按索引顺序)
names:
0: basketball
1: hoop
2: playernames(必须)- 类别名称列表(字符串数组或字典)
- 索引必须从0开始连续编号
- 两种写法:
yaml# 数组写法 names: ['basketball', 'hoop', 'player'] # 字典写法 names: 0: basketball 1: hoop 2: player
重要提示:YOLOv5/YOLOv8会自动根据
images路径查找对应的labels目录,确保目录结构匹配。如果测试集未标注,可省略test字段。
3. 预测 (predict())
https://docs.ultralytics.com/zh/modes/predict/#inference-arguments
model.predict(
source='path/to/data', # 数据源 (图像/视频/目录/URL)
conf=0.25, # 置信度阈值
iou=0.45, # NMS IoU阈值
# 输出控制:
show=True, # 实时显示结果
save=True, # 保存带检测框的图像
save_txt=False, # 保存YOLO格式标签
save_conf=True, # 在标签中包含置信度
save_crop=False, # 保存裁剪的目标
# 目标过滤:
classes=[0, 2], # 只检测特定类别
agnostic_nms=False, # 类别无关的NMS
# 性能优化:
stream=False, # 流模式 (减少内存)
max_det=300, # 每图最大检测数
half=True, # 使用FP16半精度
# 可视化:
line_width=3, # 边界框线宽
visualize=False, # 生成特征可视化
)4. 验证模型 (val())
https://docs.ultralytics.com/zh/modes/val/#arguments-for-yolo-model-validation
model.val(
data='dataset.yaml', # 数据集配置文件
split='val', # 使用哪个数据划分 (val/test)
batch=32, # 批次大小
imgsz=640, # 输入图像尺寸
conf=0.001, # 置信度阈值
iou=0.6, # NMS IoU阈值
device='cuda', # 推理设备
# 输出控制:
save_json=True, # 保存COCO格式结果
save_hybrid=True, # 保存混合标签结果
plots=True, # 生成评估图表
half=True, # 使用FP16半精度
# 特殊选项:
rect=False, # 是否使用矩形推理
dnn=False, # 是否使用ONNX DNN
)metrics
model.val() 方法返回的 metrics 对象包含了丰富的模型性能指标
核心指标 (metrics.box)
| 属性 | 类型 | 说明 |
|---|---|---|
map | float | mAP@0.5:0.95 (IoU 0.5-0.95 的平均精度) |
map50 | float | mAP@0.5 (IoU=0.5 的平均精度) |
map75 | float | mAP@0.75 (IoU=0.75 的平均精度) |
maps | list[float] | 每个类别的 mAP@0.5:0.95 |
ap50 | list[float] | 每个类别的 AP@0.5 |
ap | list[float] | 每个类别的 AP@0.5:0.95 |
precision | list[float] | 每个类别的精确率 (Precision) |
recall | list[float] | 每个类别的召回率 (Recall) |
f1 | list[float] | 每个类别的 F1 分数 |
ap_class_index | list[int] | 对应类别的索引 |
confusion_matrix | np.ndarray | 混淆矩阵 |
其他重要属性
| 属性 | 类型 | 说明 |
|---|---|---|
speed | dict | 处理速度指标 |
- preprocess | float | 预处理时间 (ms/图像) |
- inference | float | 推理时间 (ms/图像) |
- loss | float | 损失计算时间 (ms/图像) |
- postprocess | float | 后处理时间 (ms/图像) |
results_dict | dict | 所有结果的字典形式 |
class_names | list[str] | 类别名称列表 |
nt_per_class | list[int] | 每个类别的真实目标数量 |
mp | float | 平均精确率 (所有类别的均值) |
mr | float | 平均召回率 (所有类别的均值) |
fi | float | 平均 F1 分数 (所有类别的均值) |
完整指标获取示例
metrics = model.val(
data='dataset.yaml',
split='val',
conf=0.25,
iou=0.6,
plots=True
)
# 1. 核心指标
print(f"综合评估指标:")
print(f" mAP@0.5: {metrics.box.map50:.4f}")
print(f" mAP@0.5:0.95: {metrics.box.map:.4f}")
print(f" 平均精确率: {metrics.box.mp:.4f}")
print(f" 平均召回率: {metrics.box.mr:.4f}")
print(f" 平均F1分数: {metrics.box.fi:.4f}")
# 2. 类别详细指标
class_names = metrics.class_names
print("\n各类别详细指标:")
for i, cls_idx in enumerate(metrics.box.ap_class_index):
print(f" {class_names[cls_idx]} (ID:{cls_idx}):")
print(f" AP@0.5: {metrics.box.ap50[i]:.4f}")
print(f" AP@0.5:0.95: {metrics.box.ap[i]:.4f}")
print(f" 精确率: {metrics.box.precision[i]:.4f}")
print(f" 召回率: {metrics.box.recall[i]:.4f}")
print(f" F1分数: {metrics.box.f1[i]:.4f}")
print(f" 真实目标数: {metrics.nt_per_class[i]}")
# 3. 速度指标
print("\n处理速度:")
print(f" 预处理: {metrics.speed['preprocess']:.2f} ms/图像")
print(f" 推理: {metrics.speed['inference']:.2f} ms/图像")
print(f" 后处理: {metrics.speed['postprocess']:.2f} ms/图像")
# 4. 其他指标
print(f"\n混淆矩阵形状: {metrics.confusion_matrix.shape}")
print(f"结果字典键: {list(metrics.results_dict.keys())}")results_dict 中的完整键值
当访问 metrics.results_dict 时,会得到包含所有指标的字典:
{
'metrics/precision(B)': 平均精确率,
'metrics/recall(B)': 平均召回率,
'metrics/mAP50(B)': mAP@0.5,
'metrics/mAP50-95(B)': mAP@0.5:0.95,
'fitness': 综合适应度分数,
'val/box_loss': 验证集边界框损失,
'val/cls_loss': 验证集分类损失,
'val/dfl_loss': 验证集分布焦点损失,
'x/lr0': 当前学习率,
'x/lr1': 当前学习率(第二组),
'x/lr2': 当前学习率(第三组)
}注意事项
- 指标前缀说明:
(B)表示边界框相关指标(M)表示掩码相关指标(实例分割任务)(P)表示姿态相关指标(姿态估计任务)
- 指标计算依据:
- 所有指标基于设定的置信度阈值(
conf)和IoU阈值(iou) - 默认使用0.001置信度阈值来最大化召回率
- 所有指标基于设定的置信度阈值(
- 可视化输出: 当设置
plots=True时,会额外生成:- PR曲线图
- 混淆矩阵图
- 各类别误差分析图
- 预测结果示例图
5. 模型导出 (export())
model.export(
format="onnx", # 格式:onnx, engine, coreml, tflite...
imgsz=(640, 480), # 输入尺寸(高, 宽)
dynamic=False, # ONNX/TensorRT:动态维度
simplify=True, # ONNX:简化模型
opset=12, # ONNX:算子集版本
half=True, # FP16量化
device="cpu", # 导出设备
)常用参数说明表
| 参数 | 适用方法 | 说明 |
|---|---|---|
data | train, val | 数据集YAML配置文件路径 |
epochs | train | 训练总轮次 |
imgsz | 所有方法 | 输入图像尺寸(整数或元组) |
conf | predict, val | 置信度阈值(0-1) |
iou | predict, val | NMS的IoU阈值(0-1) |
device | 所有方法 | 运行设备(cpu, cuda, mps) |
batch | train, val | 批次大小(-1表示自动批大小) |
project | train | 结果保存的根目录(如 runs/train) |
name | train | 实验名称(在project下生成子目录) |
classes | predict | 指定检测的类别ID列表 |
save_txt | predict | 保存结果为YOLO格式的txt标签 |
save_json | val | 保存COCO格式的JSON结果 |
format | export | 导出格式(onnx, engine, tflite, coreml等) |
训练验证输出中各参数的详细解释
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size
1/30 0G 1.575 3.235 1.696 20 640: 100%|██████████| 20/20 [07:29<00:00, 22.47s/it]
Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 3/3 [00:30<00:00, 10.14s/it]
all 78 78 0.817 0.938 0.977 0.715训练迭代参数(每轮训练)
| 参数 | 说明 | 示例值 | 解读 |
|---|---|---|---|
| Epoch | 当前训练轮次/总轮次 | 1/30 | 第1轮训练(共30轮) |
| GPU_mem | GPU显存占用 | 0G | 显存使用较低(单位:GB) |
| box_loss | 边界框回归损失 | 1.575 | 预测框位置误差,值越小定位越准 |
| cls_loss | 分类损失 | 3.235 | 类别预测误差,值越小分类越准 |
| dfl_loss | 分布聚焦损失 | 1.696 | 边界框分布离散化误差(YOLOv8特有) |
| Instances | 当前批次目标数 | 20 | 本批含20个待检测目标 |
| Size | 输入图像尺寸 | 640 | 图像缩放至640×640像素 |
| 进度 | 批次进度 | 20/20 | 完成20个训练批次 |
| 时间 | 训练耗时 | 07:29<00:00 | 本轮耗时7分29秒 |
| 速度 | 批次处理速度 | 22.47s/it | 每批次平均耗时22.47秒 |
验证阶段参数(每轮训练后评估)
| 参数 | 说明 | 示例值 | 解读 |
|---|---|---|---|
| Class | 评估类别 | all | 所有类别的综合指标 |
| Images | 验证图片数 | 78 | 使用78张图片评估模型 |
| Instances | 目标实例数 | 78 | 验证集含78个待检测目标 |
| P | 边界框精确率 | 0.817 | 81.7%的预测框正确(查准率) |
| R | 边界框召回率 | 0.938 | 93.8%的目标被成功检出(查全率) |
| mAP50 | IoU=0.5的mAP | 0.977 | 97.7%的高精度检测(核心指标) |
| mAP50-95 | IoU[0.5:0.95]的mAP | 0.715 | 严格IoU阈值下的平均精度(鲁棒性指标) |
| 进度 | 验证批次进度 | 3/3 | 完成3个验证批次 |
| 时间 | 验证耗时 | 00:30<00:00 | 总耗时30秒 |
| 速度 | 批次处理速度 | 10.14s/it | 每批次平均耗时10.14秒 |
train/val/predict关键区别总结
| 特性 | train() | val() | predict() |
|---|---|---|---|
| 主要目的 | 模型训练 | 性能评估 | 新数据推理 |
| 数据源 | 数据集配置文件 | 数据集配置文件 | 任意图像/视频 |
| 增强处理 | ✓ 数据增强 | ✗ 无增强 | ✗ 无增强 |
| 输出类型 | 训练日志/模型 | 评估指标 | 检测结果图像 |
| 关键指标 | 训练损失 | mAP/Precision | 检测框/置信度 |
| 设备优化 | 训练优化 | 评估优化 | 推理优化 |
| 参数特点 | 学习率/优化器 | 评估阈值 | 可视化选项 |
| 典型使用 | 训练前 | 训练后评估 | 部署推理 |
mAP 详解
1. 核心概念
| 术语 | 说明 |
|---|---|
| IoU | 交并比(Intersection over Union) 预测框与真实框的重叠程度 |
| TP | 真正例(True Positive) IoU ≥ 阈值(如0.5)的正确检测 |
| FP | 假正例(False Positive) IoU < 阈值或重复检测 |
| FN | 假负例(False Negative) 未检测到的真实目标 |
| Precision | TP / (TP + FP) 检测结果的准确性 |
| Recall | TP / (TP + FN) 目标检测的完整性 |
$$IoU=\frac{预测框与真实框的交集面积}{并集面积}$$
2. 计算流程
生成PR曲线:
- 对每个类别,在不同置信度阈值下计算Precision和Recall
- 绘制Precision-Recall曲线
计算AP(Average Precision):
- 计算PR曲线下的面积
- 公式:$AP = \int_0^1 p(r) dr$
- 实际计算:对Recall进行插值后取平均精度
计算mAP:
- 对所有类别的AP取平均值
- 公式:$mAP = \frac{1}{N}\sum_{i=1}^{N} AP_i$
3. 常见变体
| 类型 | 说明 | 应用场景 |
|---|---|---|
| mAP@0.5 | IoU阈值固定为0.5 | 基础评估标准 |
| mAP@0.5:0.95 | IoU从0.5到0.95(步长0.05)取平均 | 严格评估定位精度 |
| mAP@0.75 | IoU阈值固定为0.75 | 高精度定位要求场景 |
mAP 在目标检测中的意义
- 综合性:同时考虑精确率和召回率
- 鲁棒性:不受置信度阈值选择的影响
- 类别平衡:平等对待所有类别
- 定位敏感:反映边界框的准确度(通过IoU)
mAP 解读指南
| mAP值范围 | 模型性能 |
|---|---|
| 0.9+ | 极好(接近完美) |
| 0.7-0.9 | 优秀(工业应用级) |
| 0.5-0.7 | 可用(需优化) |
| 0.3-0.5 | 较差(需大幅改进) |
| <0.3 | 基本无效 |
提升mAP的策略
数据层面:
- 增加困难样本
- 平衡类别分布
- 优化标注质量
模型层面:
- 使用更大模型(如YOLOv8x)
- 增加输入分辨率(
imgsz) - 调整锚框尺寸
训练技巧:
- 延长训练时间(增加
epochs) - 调整学习率策略
- 增强数据多样性(
augment=True)
- 延长训练时间(增加
后处理优化:
- 调整NMS参数(
iou) - 优化置信度阈值(
conf)
- 调整NMS参数(
mAP 是目标检测领域的"黄金标准",全面反映了模型在定位准确性和分类正确性上的综合能力。在工业应用中,mAP@0.5 > 0.7 通常是可部署的最低标准。
runs/detect日志讲解
- weights 是训练好的模型权重,保留了best.pt,last.pt
- args.yaml 是训练过程中的参数记录。
- results.csv 是训练过程中的记录。
- results.png 是训练过程中的记录的可视化。
- confusion_matrix.png ,confusion_matrix_normalized.png 是训练过程中的混淆矩阵的可视化和可视化归一化。
- labels.jpg,labels_correlogram.jpg 是训练过程中的标签和标签的correlogram。
- F1_curve.png,PR_curve.png,P_curve.png,R_curve.png 是训练过程中的F1曲线、PR曲线、P曲线、R曲线。
- train_batch0.jpg,train_batch1.jpg,train_batch2.jpg 是训练过程中的训练图片,采用了mosaic的数据增强方式。
- train_batch23250.jpg,train_batch23251.jpg,train_batch23252.jpg 是训练过程中的训练图片,不再采用mosaic的数据增强方式。
- val_batch0_labels.jpg,val_batch1_labels.jpg ,val_batch2_labels.jpg 是训练过程中的验证图片的标签。
- val_batch0_labels.jpg,val_batch1_labels.jpg ,val_batch2_labels.jpg 是训练过程中的验证图片的标签。
- val_batch0_pred.jpg,val_batch1_pred.jpg ,val_batch2_pred.jpg 是训练过程中的验证图片的预测值。
参考
- 官方文档参考:Ultralytics YOLO Docs
- YOLO系列模型之如何阅读ultralytics源码?
- 项目基础配置说明:https://docs.ultralytics.com/quickstart/#ultralytics-settings
- 下游任务解决方案:https://docs.ultralytics.com/solutions/
- 研发过程相关指导:https://docs.ultralytics.com/guides/
- LabelImg、X-AnyLabeling
OpenCV-Python(cv2)
1. 图像读取与保存
cv2.imread(filename, flags)
- 功能: 读取图像文件。
- 参数:
filename: 图像路径(支持 JPG、PNG、TIFF 等格式)。flags: 读取模式(可选):cv2.IMREAD_COLOR(默认): 加载 3 通道 BGR 彩色图像。cv2.IMREAD_GRAYSCALE: 加载灰度图像。cv2.IMREAD_UNCHANGED: 保留原始通道(如 PNG 的透明度)。
- 返回值:
numpy.ndarray格式的图像数据。
cv2.imwrite(filename, img, params)
- 功能: 保存图像。
- 参数:
filename: 保存路径(扩展名决定格式)。img: 要保存的图像数据。params(可选): 编码参数(如 JPEG 质量):[cv2.IMWRITE_JPEG_QUALITY, 95]: JPEG 质量(0-100)。[cv2.IMWRITE_PNG_COMPRESSION, 9]: PNG 压缩级别(0-9)。
cv2.imshow()
- 功能: 在窗口中显示图像。
- 用法: cv2.imshow("窗口名", image)
2. 图像处理
cv2.cvtColor(src, code)
- 功能: 颜色空间转换。
- 参数:
src: 输入图像。code: 转换类型:cv2.COLOR_BGR2GRAY: BGR → 灰度。cv2.COLOR_BGR2HSV: BGR → HSV。cv2.COLOR_BGR2RGB: BGR → RGB。
cv2.resize(src, dsize, fx, fy, interpolation)
- 功能: 调整图像尺寸。
- 参数:
dsize: 目标尺寸(width, height)。fx,fy: 沿 x/y 轴的缩放因子。interpolation: 插值方法(默认cv2.INTER_LINEAR):cv2.INTER_NEAREST: 最近邻插值(快)。cv2.INTER_CUBIC: 双三次插值(慢但质量高)。
为什么需要插值?
图像缩放时,输入与输出像素的位置并非一一对应:
- 放大图像:输出像素可能位于输入像素之间
- 缩小图像:多个输入像素映射到同一输出位置 插值通过数学估算解决这些位置的像素值问题,避免锯齿、模糊等失真。
cv2.GaussianBlur(src, ksize, sigmaX)
- 功能: 高斯模糊(降噪)。
- 参数:
ksize: 高斯核大小(width, height)(必须为奇数)。sigmaX: X 方向标准差(若为 0,则根据 ksize 自动计算)。
3. 阈值与二值化
cv2.threshold(src, thresh, maxval, type)
- 功能: 图像阈值处理。
- 参数:
thresh: 阈值(0-255)。maxval: 超过阈值时赋予的值。type: 阈值类型:cv2.THRESH_BINARY:dst = (src > thresh) ? maxval : 0。cv2.THRESH_OTSU: 自动计算阈值(需与cv2.THRESH_BINARY组合使用)。
- 返回值:
retval(实际使用的阈值),dst(二值化图像)。
4. 特征检测
cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)
- 功能: Canny 边缘检测。
- 参数:
threshold1: 低阈值(弱边缘过滤)。threshold2: 高阈值(强边缘保留)。apertureSize: Sobel 算子大小(默认 3)。L2gradient: 是否使用更精确的 L2 范数(默认 False,用 L1)。
cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
- 功能: 概率霍夫变换检测直线。
- 参数:
rho: 距离分辨率(像素)。theta: 角度分辨率(弧度)。threshold: 投票阈值(低于此值忽略)。minLineLength: 线段最小长度。maxLineGap: 线段最大间断距离。
5. 视频处理
cv2.VideoCapture(index)
- 功能: 打开摄像头或视频文件。
- 参数:
index: 摄像头 ID(0 为默认摄像头)或视频文件路径。
- 常用方法:
cap.read(): 读取帧(返回ret, frame)。cap.set(propId, value): 设置属性(如cv2.CAP_PROP_FPS,cv2.CAP_PROP_FRAME_WIDTH)。cap.release(): 释放资源。
cv2.VideoWriter(filename, fourcc, fps, frameSize)
- 功能: 保存视频。
- 参数:
fourcc: 编码器(如cv2.VideoWriter_fourcc(*'XVID'))。fps: 帧率(如 30)。frameSize: 帧尺寸(width, height)。
6. 绘图函数
cv2.rectangle(img, pt1, pt2, color, thickness)
- 参数:
pt1,pt2: 矩形对角点(x1,y1),(x2,y2)。color: BGR 元组(如(0, 255, 0)表示绿色)。thickness: 线宽(-1 表示填充)。
cv2.putText(img, text, org, fontFace, fontScale, color, thickness)
- 参数:
org: 文本左下角坐标(x, y)。fontFace: 字体(如cv2.FONT_HERSHEY_SIMPLEX)。fontScale: 字体缩放因子。
7. 形态学操作
cv2.erode(src, kernel, iterations)
- 功能: 腐蚀(缩小白色区域)。
- 参数:
kernel: 结构元素(如np.ones((3,3), np.uint8))。iterations: 执行次数。
cv2.dilate(src, kernel, iterations)
- 功能: 膨胀(扩大白色区域)。
cv2.morphologyEx(src, op, kernel)
- 功能: 高级形态学操作。
- 参数:
op: 操作类型:cv2.MORPH_OPEN: 开运算(去噪)。cv2.MORPH_CLOSE: 闭运算(填充空洞)。
8. 窗口管理
| 参数/函数 | 说明 | 常用值/用法 |
|---|---|---|
namedWindow() | 创建命名窗口 | cv2.namedWindow("窗口名", flags)• flags=cv2.WINDOW_NORMAL (可调整大小)• flags=cv2.WINDOW_AUTOSIZE (自动适应图像) |
WND_PROP_FULLSCREEN | 窗口全屏属性标识符 | 用于setWindowProperty()/getWindowProperty() |
WINDOW_FULLSCREEN | 设置全屏模式的标志 | cv2.setWindowProperty("win", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) |
setWindowProperty() | 设置窗口属性 | cv2.setWindowProperty("win", 属性, 值)• 属性: cv2.WND_PROP_FULLSCREEN• 值: cv2.WINDOW_FULLSCREEN |
getWindowImageRect() | 获取窗口坐标和尺寸 | x, y, w, h = cv2.getWindowImageRect("窗口名") |
resizeWindow() | 调整窗口尺寸 | cv2.resizeWindow("窗口名", 宽, 高) |
destroyWindow() | 关闭单个窗口 | cv2.destroyWindow("窗口名") |
destroyAllWindows() | 关闭所有窗口 | cv2.destroyAllWindows() |
标准RTSP地址格式
rtsp://[用户名]:[密码]@[相机IP地址]:[端口]/cam/realmonitor?channel=[通道号]&subtype=[码流类型]参数说明
[用户名]- 相机登录用户名(如
admin)。
- 相机登录用户名(如
[密码]- 该用户名的密码。
[相机IP地址]- 相机的网络IP(如
192.168.1.108)。
- 相机的网络IP(如
[端口](可选)- RTSP服务端口,默认为
554(若未修改可省略)。
- RTSP服务端口,默认为
[通道号]channel=1:单路相机固定为1;- NVR下的相机:按实际通道顺序填写(如
channel=2表示第2通道)。
[码流类型]subtype=0:主码流(高清,默认值);subtype=1:子码流(低码率,适用于移动端或带宽受限场景)。
调试工具建议
- 使用 VLC播放器 测试:
媒体→打开网络串流→ 粘贴RTSP地址 → 播放。 - 工具:ONVIF Device Manager 扫描相机,自动生成RTSP地址。