Skip to content

@TOC

ffmpeg-python

ffmpeg-python 是一个用于操作 FFmpeg 的 Python 库,它通过 Python 对象和链式调用封装了 FFmpeg 的命令行参数。


核心概念

  1. input():创建输入流

    python
    input_stream = ffmpeg.input('input.mp4', ss=10, t=5)  # 从第10秒开始,读取5秒
    • 关键参数:
      • filename:输入文件路径
      • ss:起始时间(秒或 HH:MM:SS
      • t:持续时间
      • f:强制输入格式(如 f='rawvideo'
  2. output():生成输出流

    python
    output_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'
  3. run():执行命令

    python
    ffmpeg.run(output_stream, overwrite_output=True)  # 覆盖已存在文件

常用过滤器(Filters)

通过 .filter() 方法调用:

python
filtered = input_stream.filter('filter_name', **params)
  1. 视频缩放

    python
    scaled = input_stream.filter('scale', width=640, height=-1)  # 宽度640,高度按比例
  2. 裁剪

    python
    cropped = input_stream.filter('crop', w=100, h=100, x=20, y=20)
  3. 旋转

    python
    rotated = input_stream.filter('rotate', angle=45*math.pi/180)  # 45度
  4. 叠加水印

    python
    watermarked = ffmpeg.overlay(
        input_stream, 
        ffmpeg.input('watermark.png').filter('scale', 50, 50),
        x=10, y=10
    )
  5. 音频降噪

    python
    denoised = input_stream.filter('afftdn', nf=-20)  # 降噪强度

高级操作

  1. 合并多个输入

    python
    video = ffmpeg.input('video.mp4')
    audio = ffmpeg.input('audio.mp3')
    output = ffmpeg.output(video, audio, 'merged.mp4', vcodec='copy', acodec='aac')
  2. 提取音轨

    python
    ffmpeg.input('video.mp4').output('audio_only.mp3', acodec='libmp3lame').run()
  3. 生成 GIF

    python
    (
        ffmpeg.input('video.mp4', t=3)
        .filter('fps', fps=10)
        .output('output.gif', loop=0)
        .run()
    )
  4. 硬件加速(NVIDIA)

    python
    (
        ffmpeg.input('input.mp4')
        .output('output.mp4', 
                vcodec='h264_nvenc',   # NVIDIA 编码器
                preset='p1', 
                rc='constqp', 
                qp=21)
        .run()
    )

视频截帧转换图片示例

python
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)}")

参考


ultralytics.YOLO(You Only Look Once)

在这里插入图片描述

python
.
├── __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/

python
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

python
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)需要遵循特定格式。

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: player
  • names (必须)
    • 类别名称列表(字符串数组或字典)
    • 索引必须从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

python
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

python
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)
属性类型说明
mapfloatmAP@0.5:0.95 (IoU 0.5-0.95 的平均精度)
map50floatmAP@0.5 (IoU=0.5 的平均精度)
map75floatmAP@0.75 (IoU=0.75 的平均精度)
mapslist[float]每个类别的 mAP@0.5:0.95
ap50list[float]每个类别的 AP@0.5
aplist[float]每个类别的 AP@0.5:0.95
precisionlist[float]每个类别的精确率 (Precision)
recalllist[float]每个类别的召回率 (Recall)
f1list[float]每个类别的 F1 分数
ap_class_indexlist[int]对应类别的索引
confusion_matrixnp.ndarray混淆矩阵

其他重要属性
属性类型说明
speeddict处理速度指标
- preprocessfloat预处理时间 (ms/图像)
- inferencefloat推理时间 (ms/图像)
- lossfloat损失计算时间 (ms/图像)
- postprocessfloat后处理时间 (ms/图像)
results_dictdict所有结果的字典形式
class_nameslist[str]类别名称列表
nt_per_classlist[int]每个类别的真实目标数量
mpfloat平均精确率 (所有类别的均值)
mrfloat平均召回率 (所有类别的均值)
fifloat平均 F1 分数 (所有类别的均值)

完整指标获取示例
python
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 时,会得到包含所有指标的字典:

python
{
    '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': 当前学习率(第三组)
}

注意事项
  1. 指标前缀说明
    • (B) 表示边界框相关指标
    • (M) 表示掩码相关指标(实例分割任务)
    • (P) 表示姿态相关指标(姿态估计任务)
  2. 指标计算依据
    • 所有指标基于设定的置信度阈值(conf)和IoU阈值(iou)
    • 默认使用0.001置信度阈值来最大化召回率
  3. 可视化输出: 当设置 plots=True 时,会额外生成:
    • PR曲线图
    • 混淆矩阵图
    • 各类别误差分析图
    • 预测结果示例图

5. 模型导出 (export())

python
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",             # 导出设备
)

常用参数说明表

参数适用方法说明
datatrain, val数据集YAML配置文件路径
epochstrain训练总轮次
imgsz所有方法输入图像尺寸(整数或元组)
confpredict, val置信度阈值(0-1)
ioupredict, valNMS的IoU阈值(0-1)
device所有方法运行设备(cpu, cuda, mps
batchtrain, val批次大小(-1表示自动批大小)
projecttrain结果保存的根目录(如 runs/train
nametrain实验名称(在project下生成子目录)
classespredict指定检测的类别ID列表
save_txtpredict保存结果为YOLO格式的txt标签
save_jsonval保存COCO格式的JSON结果
formatexport导出格式(onnx, engine, tflite, coreml等)

训练验证输出中各参数的详细解释

python
      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_memGPU显存占用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.81781.7%的预测框正确(查准率)
R边界框召回率0.93893.8%的目标被成功检出(查全率)
mAP50IoU=0.5的mAP0.97797.7%的高精度检测(核心指标)
mAP50-95IoU[0.5:0.95]的mAP0.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)
未检测到的真实目标
PrecisionTP / (TP + FP)
检测结果的准确性
RecallTP / (TP + FN)
目标检测的完整性

$$IoU=\frac{预测框与真实框的交集面积}{并集面积}$$

2. 计算流程

  1. 生成PR曲线

    • 对每个类别,在不同置信度阈值下计算Precision和Recall
    • 绘制Precision-Recall曲线
  2. 计算AP(Average Precision)

    • 计算PR曲线下的面积
    • 公式:$AP = \int_0^1 p(r) dr$
    • 实际计算:对Recall进行插值后取平均精度
  3. 计算mAP

    • 对所有类别的AP取平均值
    • 公式:$mAP = \frac{1}{N}\sum_{i=1}^{N} AP_i$

3. 常见变体

类型说明应用场景
mAP@0.5IoU阈值固定为0.5基础评估标准
mAP@0.5:0.95IoU从0.5到0.95(步长0.05)取平均严格评估定位精度
mAP@0.75IoU阈值固定为0.75高精度定位要求场景

mAP 在目标检测中的意义

  1. 综合性:同时考虑精确率和召回率
  2. 鲁棒性:不受置信度阈值选择的影响
  3. 类别平衡:平等对待所有类别
  4. 定位敏感:反映边界框的准确度(通过IoU)

mAP 解读指南

mAP值范围模型性能
0.9+极好(接近完美)
0.7-0.9优秀(工业应用级)
0.5-0.7可用(需优化)
0.3-0.5较差(需大幅改进)
<0.3基本无效

提升mAP的策略

  1. 数据层面

    • 增加困难样本
    • 平衡类别分布
    • 优化标注质量
  2. 模型层面

    • 使用更大模型(如YOLOv8x)
    • 增加输入分辨率(imgsz
    • 调整锚框尺寸
  3. 训练技巧

    • 延长训练时间(增加epochs
    • 调整学习率策略
    • 增强数据多样性(augment=True
  4. 后处理优化

    • 调整NMS参数(iou
    • 优化置信度阈值(conf

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 是训练过程中的验证图片的预测值。

参考


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地址格式

bash
rtsp://[用户名]:[密码]@[相机IP地址]:[端口]/cam/realmonitor?channel=[通道号]&subtype=[码流类型]

参数说明

  1. [用户名]

    • 相机登录用户名(如 admin)。
  2. [密码]

    • 该用户名的密码。
  3. [相机IP地址]

    • 相机的网络IP(如 192.168.1.108)。
  4. [端口](可选)

    • RTSP服务端口,默认为 554(若未修改可省略)。
  5. [通道号]

    • channel=1:单路相机固定为 1
    • NVR下的相机:按实际通道顺序填写(如 channel=2 表示第2通道)。
  6. [码流类型]

    • subtype=0:主码流(高清,默认值);
    • subtype=1:子码流(低码率,适用于移动端或带宽受限场景)。

调试工具建议

  • 使用 VLC播放器 测试:
    媒体打开网络串流 → 粘贴RTSP地址 → 播放。
  • 工具:ONVIF Device Manager 扫描相机,自动生成RTSP地址。

参考

Released under the MIT License.