OpenCV代码实现摄像头风格迁移



前言

在社交媒体滤镜风靡全球的今天,那些实时变化的梵高星空滤镜或二次元动漫特效背后,究竟隐藏着怎样的技术魔法?摄像头风格迁移(Real-time Camera Style Transfer)正在重新定义我们与数字世界的互动方式。


一、从实验室到手机镜头:风格迁移的技术进化

1、神经风格迁移的诞生

2015年,Gatys等人用VGG网络分离图像内容与风格,开创了AI艺术创作的先河。但传统方法需对每帧迭代优化,处理单张图需数分钟,难以实时应用。

2、实时化突破之路

Johnson提出的快速风格迁移网络(2016)将处理速度提升1000倍,结合MobileNet等轻量架构,使手机端实时渲染成为可能。模型大小从500MB压缩到2MB,延时控制在15ms内。

3、工业级应用场景

1) 智能安防

  • 人脸卡通化隐私保护(日本便利店已部署)

  • 夜间监控→水墨画风格增强

2) 影视制作

  • 实时场景预渲染:《曼达洛人》拍摄现场实时生成科幻场景

  • 多机位风格统一系统

3) 医疗影像

  • 内窥镜画面艺术化处理,降低医生视觉疲劳

  • X光片→3D油画风格,增强病灶对比度

二、案例

1、下载训练好的模型

每个模型代表不同的风格
在这里插入图片描述
在这里插入图片描述

2、代码

1)读取帧

import cv2
img = cv2.VideoCapture(0)

while True:
    ret,frame = img.read()
    if not ret:
        break
    cv2.imshow('frame',frame)
    (h,w) = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(frame,1,(w,h),(0,0,0),swapRB=False,crop=False)

代码逐行解析

  • 导入OpenCV库,用于计算机视觉操作。
  • 创建VideoCapture对象,参数0表示使用默认摄像头(第一个连接的摄像头)。
  • img.read()读取摄像头帧,ret为是否读取成功的布尔值,frame是当前帧的图像数据。
  • 若读取失败(如摄像头断开),break退出循环。
  • 将当前帧显示在名为frame的窗口中。
  • 提取帧的高度(h)和宽度(w)。
  • 使用cv2.dnn.blobFromImage将帧转换为深度学习模型所需的输入格式(Blob)。

blobFromImage参数详解:

frame:输入图像。

1:缩放因子(像素值不缩放,若需归一化可设为1/255.0)。

(w, h):目标尺寸(此处保持原图尺寸,但通常模型会指定固定尺寸如(224, 224))。

(0, 0, 0):均值减法(此处不应用,若模型需要需替换为特定均值)。

swapRB=False:不交换红蓝通道(OpenCV默认BGR格式,若模型需要RGB则设为True)。

crop=False:不裁剪图像,保持比例缩放。

2)加载模型

 '''--------------------加载模型----------------------'''
    # net = cv2.dnn.readNet(r'.\model\candy.t7')
    # net = cv2.dnn.readNet(r'.\model\composition_vii.t7')
    # net = cv2.dnn.readNet(r'.\model\feathers.t7')
    net = cv2.dnn.readNet(r'.\model\la_muse.t7')
    # net = cv2.dnn.readNet(r'.\model\mosaic.t7')
    # net = cv2.dnn.readNet(r'.\model\starry_night.t7')
    # net = cv2.dnn.readNet(r'.\model\the_scream.t7')
    # net = cv2.dnn.readNet(r'.\model\the_wave.t7')
    # net = cv2.dnn.readNet(r'.\model\udnie.t7')

    net.setInput(blob)# 将预处理后的Blob输入神经网络
    out = net.forward()# 执行前向传播,获取模型输出

每次只能加载一个模型,切换一个net即可更换风格。

3)输出处理

    out_new = out.reshape(out.shape[1],out.shape[2],out.shape[3])
    cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX)

    result = out_new.transpose(1,2,0)

    cv2.imshow('Stylized Image',result)
    if cv2.waitKey(10)==27:
        break

img.release()
cv2.destroyAllWindows()

代码逐行解析

  • 将模型输出从四维张量 (1, C, H, W) 转换为三维 (C, H, W)
    模型输出通常为 (Batch=1, Channels, Height, Width)
    out.shape[1] 是通道数,out.shape[2] 是高度,out.shape[3] 是宽度
  • normalize关键参数
    src:输入数据(out_new)
    dst:输出数据(直接覆盖out_new)
    norm_type=cv2.NORM_MINMAX:线性缩放数据到[0,1]
  • 维度变换:从 (C, H, W) → (H, W, C)
  • 显示风格化结果。
  • cv2.waitKey(10):等待10ms的键盘输入
    27 是ESC键的ASCII码
    用户按下ESC时退出循环。
  • img.release():关闭摄像头连接
    cv2.destroyAllWindows():销毁所有OpenCV窗口

3、效果

在这里插入图片描述


总结

当4K/120fps成为新常态,风格迁移技术正在突破艺术与现实的次元壁。从手机镜头到电影工业,从医疗影像到元宇宙构建,这项技术正在书写人机交互的新篇章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值