核心内容摘要
17c隐藏入口:探寻都市传说背后的神秘低语
项目介绍1 实现效果运行程序后调用电脑默认摄像头实时采集画面并分割为左上、右上、左下、右下四个区域每个区域独立应用不同的艺术风格迁移模型星月夜、缪斯、海浪、马赛克最终拼接为完整画面实时展示按下 Esc 键即可退出程序。
预训练风格模型准备本文使用的是 OpenCV dnn 模块兼容的Torch 格式.t7 风格迁移预训练模型这类模型体积小、推理速度快适合实时场景
模型下载可从 OpenCV 官方示例库、GitHub 开源仓库获取星月夜starry_night.t
缪斯la_muse.t
海浪the_wave.t
马赛克mosaic.t7等经典模型
路径配置在项目根目录下创建model文件夹将下载的所有.t7 模型放入其中保证代码中模型路径与实际文件一致。
核心功能模块
1 模型加载模块load_style_model功能封装 OpenCV dnn 模型加载逻辑接收模型文件路径返回加载好的神经网络对象为后续风格迁移做准备。
import cv2 def load_style_model(model_path): net cv
dnn.readNet(model_path) # 加载预训练模型 return netcv
dnn.readNet()是 OpenCV dnn 模块的通用模型加载函数支持 Torch.t
Caffe.prototxt/.caffemodel、TensorFlow.pb等多种格式
2 风格迁移处理模块apply_style_transfer功能接收单区域画面、加载好的风格模型、模型输入目标尺寸完成图像预处理→模型前向传播→结果后处理的完整风格迁移流程返回风格化后的单区域画面是项目的核心算法模块。
import cv2 import numpy as np def apply_style_transfer(frame, net, target_sizeNone): h, w frame.shape[:2] if target_size is None: target_size (w, h) # 预处理转换为dnn模块支持的blob格式 blob cv
dnn.blobFromImage(frame, 1, target_size, (0, 0,
, swapRBFalse, cropFalse) # 前向传播输入blob获取风格化结果 net.setInput(blob) output net.forward() # 后处理恢复维度、归一化、转换为常规图像格式 output output.reshape(output.shape[1], output.shape[2], output.shape[3]) cv
normalize(output, output, norm_typecv
NORM_MINMAX) output output.transpose(1, 2,
# 恢复原区域尺寸 output cv
resize(output, (w, h)) return output
尺寸初始化若未指定目标尺寸默认使用输入画面的原始尺寸保证兼容性
图像预处理blob 转换cv
dnn.blobFromImage()是 dnn 模块的核心预处理函数将常规的 HWC高度 - 宽度 - 通道格式图像转换为 NCHW批次 - 通道 - 高度 - 宽度格式的 blob深度学习模型标准输入格式参数说明scale1像素值不缩放、mean(0,0,
不做均值消减、swapRBFalse风格模型要求 RGB 格式OpenCV 读取的图像为 BGR需根据模型需求调整、cropFalse不裁剪保持画面完整
模型前向传播net.setInput(blob)设置模型输入net.forward()执行推理计算直接输出风格化后的特征图
结果后处理reshape调整特征图维度适配后续处理cv
normalize()使用 MINMAX 归一化将特征图数值映射到 [0,1] 区间避免像素值溢出transpose将 NCHW 格式转回 HWC 格式恢复为常规图像的维度顺序resize将风格化后的画面恢复为原区域尺寸保证拼接后无变形。
3 主程序模块main功能项目的入口和总控模块整合所有功能完成参数配置→摄像头初始化→模型批量加载→主循环实时处理→资源释放的完整流程是程序的运行核心。
2.
1配置参数定义将所有可自定义的参数集中定义便于后续调试和修改# 摄像头ID默认0为电脑内置摄像头外接摄像头可改为1/2 CAMERA_ID 0 # 四格区域与对应风格模型的映射键为区域名称值为模型文件路径 MODEL_PATHS { top_left: rmodel\starry_night.t7, top_right: rmodel\la_muse.t7, bottom_left: rmodel\the_wave.t7, bottom_right: rmodel\mosaic.t7 } TARGET_SIZE (200,
# 模型输入尺寸越小推理速度越快可根据性能调整 ESC_KEY 27 # Esc键的ASCII码用于退出程序
2.
2 摄像头初始化调用 OpenCV 的 VideoCapture 类打开摄像头# 打开摄像头 cap cv
VideoCapture(CAMERA_ID) if not cap.isOpened(): print(f错误无法打开摄像头ID{CAMERA_ID}) return
2.
3 预训练模型批量加载通过字典推导式批量加载 MODEL_PATHS 中的所有风格模型加入异常捕获若模型加载失败则释放摄像头并退出程序try: models { key: load_style_model(path) for key, path in MODEL_PATHS.items() } print(所有风格模型加载成功) except Exception as e: print(f模型加载失败{e}) cap.release() # 及时释放摄像头资源 return
2.