OpenCV 学习:从光流跟踪到艺术风格迁移
文章目录一、光流法运动轨迹跟踪关键技术分析二、基于深度学习的艺术风格迁移blobFromImage函数详解三、实时目标跟踪跟踪器工作流程四、多风格实时艺术滤镜多线程优化策略性能优化技巧一、光流法运动轨迹跟踪光流法是一种通过分析连续帧之间的像素变化来追踪物体运动轨迹的技术。下面的代码展示了如何使用Shi-Tomasi角点检测和Lucas-Kanade光流法实现运动跟踪importcv2importnumpyasnp# 读取视频文件capcv2.VideoCapture(test.avi)# Shi-Tomasi角点检测参数配置feature_paramsdict(maxCorners100,# 设置检测的最大角点数量qualityLevel0.3,# 角点质量阈值值越小检测到的角点越多minDistance7# 角点间的最小像素距离避免角点过于密集)# Lucas-Kanade光流法参数配置lk_paramsdict(winSize(15,15),# 搜索窗口大小较大的窗口能处理更大的运动maxLevel2# 金字塔层数用于处理不同尺度下的运动)# 生成随机颜色用于绘制不同轨迹colornp.random.randint(0,255,(100,3))# 读取视频第一帧并转换为灰度图ret,old_framecap.read()old_graycv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY)# 检测初始角点作为跟踪起点p0cv2.goodFeaturesToTrack(old_gray,maskNone,**feature_params)# 创建与视频帧大小相同的黑色画布用于绘制轨迹masknp.zeros_like(old_frame)# 主循环逐帧处理视频whileTrue:ret,framecap.read()ifnotret:break# 当前帧转换为灰度图frame_graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 计算光流追踪p0点在当前帧中的新位置p1,st,errcv2.calcOpticalFlowPyrLK(old_gray,frame_gray,p0,None,**lk_params)# 筛选跟踪成功的点状态为1表示跟踪成功good_newp1[st1]good_oldp0[st1]# 绘制运动轨迹fori,(new,old)inenumerate(zip(good_new,good_old)):a,bnew.ravel()# 当前帧中的点坐标c,dold.ravel()# 上一帧中的点坐标a,b,c,dint(a),int(b),int(c),int(d)# 在掩模上绘制连接线显示运动路径maskcv2.line(mask,(a,b),(c,d),color[i].tolist(),2)# 在当前帧上标记角点位置cv2.circle(frame,(a,b),5,color[i].tolist(),-1)# 将轨迹叠加到当前帧上imgcv2.add(frame,mask)# 显示结果cv2.imshow(frame,img)# 更新前一帧数据和特征点old_grayframe_gray.copy()p0good_new.reshape(-1,1,2)# 检测ESC键退出kcv2.waitKey(150)ifk27:break# 释放资源cap.release()cv2.destroyAllWindows()关键技术分析Shi-Tomasi角点检测maxCorners控制检测角点的最大数量平衡精度和性能qualityLevel决定角点质量的阈值值越小检测越敏感minDistance确保角点分布均匀避免聚集Lucas-Kanade光流法winSize搜索窗口大小影响运动检测的敏感度maxLevel图像金字塔层数用于处理多尺度运动二、基于深度学习的艺术风格迁移OpenCV的dnn模块支持加载预训练的深度学习模型实现艺术风格转换importcv2# 读取并调整输入图像大小imagecv2.imread(rpicture_1.jpg)imagecv2.resize(image,None,fx0.5,fy0.5)# 显示原始图像cv2.imshow(yuan tu,image)cv2.waitKey(0)# 获取图像尺寸(h,w)image.shape[:2]# 图像预处理创建神经网络输入格式blobcv2.dnn.blobFromImage(image,# 输入图像scalefactor1,# 像素值缩放因子size(w,h),# 输出blob的尺寸mean(0,0,0),# 各通道的均值不进行均值减法swapRBFalse,# 不交换R和B通道OpenCV使用BGR格式cropFalse# 不进行裁剪)# 加载预训练的艺术风格模型# 支持多种框架格式Caffe、TensorFlow、PyTorch、Darknet等netcv2.dnn.readNet(rmodel\starry_night.t7)# PyTorch格式的星空风格模型# 设置网络输入net.setInput(blob)# 前向传播获得风格化输出outnet.forward()# 输出数据处理四维转三维out_newout.reshape(out.shape[1],out.shape[2],out.shape[3])# 数据归一化到[0,1]范围cv2.normalize(out_new,out_new,norm_typecv2.NORM_MINMAX)# 调整维度顺序CHW → HWCresultout_new.transpose(1,2,0)# 显示风格化结果cv2.imshow(Stylized Image,result)cv2.waitKey(0)cv2.destroyAllWindows()blobFromImage函数详解cv2.dnn.blobFromImage()是将图像转换为神经网络输入格式的关键函数scalefactor每个像素值的缩放倍数常用于数据归一化size指定输出blob的宽度和高度通常与网络输入层匹配mean各通道的均值用于均值减法数据标准化swapRBOpenCV使用BGR格式而大多数模型使用RGB此参数控制是否交换通道crop是否在调整大小后进行中心裁剪三、实时目标跟踪OpenCV提供多种跟踪算法CSRT跟踪器在准确性和速度之间取得良好平衡importcv2# 创建CSRT跟踪器实例trackercv2.TrackerCSRT_create()# 跟踪状态标志trackingFalse# 打开摄像头capcv2.VideoCapture(0)whileTrue:# 读取摄像头帧ret,framecap.read()ifnotret:break# 按下s键开始跟踪选择ROI区域ifcv2.waitKey(1)ord(s):trackingTrue# 交互式选择跟踪区域roicv2.selectROI(Tracking,frame,showCrosshairFalse)# 初始化跟踪器tracker.init(frame,roi)# 如果正在跟踪更新跟踪器位置iftracking:success,boxtracker.update(frame)ifsuccess:# 提取边界框坐标x,y,w,h[int(v)forvinbox]# 绘制跟踪框cv2.rectangle(frame,(x,y),(xw,yh),(0,255,0),2)# 显示跟踪结果cv2.imshow(Tracking,frame)# 按下ESC键退出ifcv2.waitKey(1)27:break# 释放资源cap.release()cv2.destroyAllWindows()跟踪器工作流程初始化阶段用户通过鼠标选择感兴趣区域(ROI)跟踪阶段跟踪器根据目标的纹理、颜色等特征在后续帧中定位目标更新阶段tracker.update()返回跟踪状态和边界框坐标四、多风格实时艺术滤镜将摄像头画面分割为四个区域分别应用不同的艺术风格importcv2importnumpyasnpimportthreadingfromqueueimportQueue# 加载四种不同的艺术风格模型defload_models():models[cv2.dnn.readNet(rmodel\starry_night.t7),# 梵高星空风格cv2.dnn.readNet(rmodel\candy.t7),# 糖果风格cv2.dnn.readNet(rmodel\composition_vii.t7),# 康定斯基风格cv2.dnn.readNet(rmodel\la_muse.t7)# 缪斯风格]returnmodels# 对单个图像块应用风格迁移defapply_style(image_block,model):(h,w)image_block.shape[:2]# 图像预处理blobcv2.dnn.blobFromImage(image_block,scalefactor1.0,size(w,h),mean(0,0,0),swapRBFalse,cropFalse)# 模型推理model.setInput(blob)outmodel.forward()# 后处理out_newout.reshape(out.shape[1],out.shape[2],out.shape[3])cv2.normalize(out_new,out_new,norm_typecv2.NORM_MINMAX)resultout_new.transpose(1,2,0)resultnp.uint8(result*255)# 转换为8位图像returnresult# 并行处理器类使用多线程加速处理classStyleProcessor:def__init__(self,models):self.modelsmodels self.results[None]*4defprocess_block(self,block_idx,block,model):resultapply_style(block,model)self.results[block_idx]resultdefprocess_all_blocks(self,blocks):threads[]foriinrange(4):# 为每个区域创建独立线程threadthreading.Thread(targetself.process_block,args(i,blocks[i],self.models[i]))threads.append(thread)thread.start()# 等待所有线程完成forthreadinthreads:thread.join()returnself.results# 主函数优化版本defmain_optimized():# 初始化模型和处理器modelsload_models()processorStyleProcessor(models)# 设置摄像头capcv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)print(按ESC键退出程序...)whileTrue:ret,framecap.read()ifnotret:break# 统一图像尺寸framecv2.resize(frame,(640,480))height,widthframe.shape[:2]# 计算分割点mid_h,mid_wheight//2,width//2# 将画面分割为四个区域blocks[frame[0:mid_h,0:mid_w],# 左上区域frame[0:mid_h,mid_w:width],# 右上区域frame[mid_h:height,0:mid_w],# 左下区域frame[mid_h:height,mid_w:width]# 右下区域]# 并行处理四个区域styled_blocksprocessor.process_all_blocks(blocks)# 创建输出画布output_framenp.zeros_like(frame)# 拼接处理后的区域output_frame[0:mid_h,0:mid_w]styled_blocks[0]output_frame[0:mid_h,mid_w:width]styled_blocks[1]output_frame[mid_h:height,0:mid_w]styled_blocks[2]output_frame[mid_h:height,mid_w:width]styled_blocks[3]# 绘制区域分割线cv2.line(output_frame,(mid_w,0),(mid_w,height),(255,255,255),2)cv2.line(output_frame,(0,mid_h),(width,mid_h),(255,255,255),2)# 显示多风格画面cv2.imshow(Multi-Style Camera View,output_frame)ifcv2.waitKey(1)0xFF27:break# 清理资源cap.release()cv2.destroyAllWindows()if__name____main__:main_optimized()多线程优化策略区域分割将摄像头画面均匀分为四个独立区域并行处理每个区域使用独立线程应用不同的风格模型结果拼接将处理后的区域重新组合为完整画面性能优化技巧降低分辨率减小处理数据量提高实时性多线程处理充分利用多核CPU并行计算模型选择选择轻量级模型或优化模型大小帧率控制可适当降低处理帧率平衡质量和速度这些代码示例展示了OpenCV在计算机视觉领域的多样化应用从传统的运动跟踪到基于深度学习的艺术创作体现了计算机视觉技术的强大功能和广泛应用前景。

相关新闻

ChatGLM-6B优化技巧:如何调整参数获得最佳对话效果

ChatGLM-6B优化技巧:如何调整参数获得最佳对话效果

ChatGLM-6B优化技巧:如何调整参数获得最佳对话效果 在实际使用 ChatGLM-6B 过程中,很多人发现:同样的问题,有时回答精准专业,有时却答非所问、逻辑混乱,甚至重复啰嗦。这并非模型本身不稳定,而是…

2026/7/5 19:10:13 阅读更多 →
零基础玩转AI绘画:Z-Image-Turbo极速创作室保姆级使用指南

零基础玩转AI绘画:Z-Image-Turbo极速创作室保姆级使用指南

零基础玩转AI绘画:Z-Image-Turbo极速创作室保姆级使用指南 1. 为什么你不需要懂代码,也能秒出电影级高清图? 你有没有过这样的经历: 想给新项目做个概念图,翻遍图库找不到合适的; 想为朋友圈配一张独一无…

2026/7/6 9:06:22 阅读更多 →
Qwen3-32B接入Clawdbot全流程:支持OpenTelemetry分布式追踪

Qwen3-32B接入Clawdbot全流程:支持OpenTelemetry分布式追踪

Qwen3-32B接入Clawdbot全流程:支持OpenTelemetry分布式追踪 1. 为什么需要把Qwen3-32B接入Clawdbot? 你有没有遇到过这样的情况:团队刚部署好Qwen3-32B大模型,本地调用很流畅,但一接入聊天平台,就出现响应…

2026/7/3 16:02:24 阅读更多 →

最新新闻

Playwright网络请求拦截与模拟实战:从原理到六大应用场景详解

Playwright网络请求拦截与模拟实战:从原理到六大应用场景详解

1. 项目概述与核心价值 如果你正在用 Playwright 做自动化测试或者数据抓取,有没有遇到过这样的场景:测试一个下单流程,但支付接口总是不稳定,导致你的测试脚本动不动就失败;或者你想测试前端页面在网络超时或服务器返…

2026/7/6 9:04:10 阅读更多 →
PyTorch LSTM 多变量多任务预测:3种损失函数加权策略对比与代码实现

PyTorch LSTM 多变量多任务预测:3种损失函数加权策略对比与代码实现

PyTorch LSTM 多变量多任务预测:3种损失函数加权策略对比与代码实现在时间序列预测领域,多任务学习正逐渐成为提升模型性能的关键技术。当我们需要同时预测多个相关变量时,传统的单任务学习方法往往难以捕捉变量间的复杂关系。本文将深入探讨…

2026/7/6 9:04:10 阅读更多 →
Python Selenium自动化校园网登录:从环境搭建到打包部署全攻略

Python Selenium自动化校园网登录:从环境搭建到打包部署全攻略

1. 项目概述与核心价值 校园网登录,尤其是像深澜Srun这类需要跳转认证页面的系统,对于需要长时间保持网络连接的用户来说,是个不大不小的痛点。手动打开浏览器、输入账号密码、点击登录,这套流程每天重复几次,不仅繁琐…

2026/7/6 9:04:10 阅读更多 →
Python自动化破解WIPO六宫格验证码:图像处理与网络请求实战

Python自动化破解WIPO六宫格验证码:图像处理与网络请求实战

1. 项目概述与核心痛点最近在做一个专利数据分析的小工具,需要从世界知识产权组织(WIPO)的专利数据库里批量抓取一些公开数据。本来以为用Python的requests库写个脚本,模拟登录后按部就班爬取就完事了,结果第一步就卡在…

2026/7/6 9:02:09 阅读更多 →
基于MCP协议为AI编程助手集成逆向分析能力:从静态反编译到动态Hook的完整实践

基于MCP协议为AI编程助手集成逆向分析能力:从静态反编译到动态Hook的完整实践

1. 项目概述:当AI编程助手学会“拆解”程序 想象一下,你正在分析一个加密的Android应用,试图找到它的网络通信密钥。传统流程是:打开IDA Pro反汇编引擎库,在十六进制视图中搜索可疑字符串;同时启动Frida&am…

2026/7/6 9:00:06 阅读更多 →
AI模型测试:从确定性断言到统计判定的工程实践

AI模型测试:从确定性断言到统计判定的工程实践

1. 项目概述:当AI的“不确定性”撞上测试的“确定性” 干了这么多年测试,从功能、性能到安全,感觉什么大风大浪都见过了。但最近两年,随着公司业务里AI驱动的功能越来越多,比如智能客服的意图识别、内容平台的个性化推…

2026/7/6 9:00:06 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻