当前位置: 首页 > article >正文

同样遍历 Mat,为什么你的代码慢 10 倍?

文章目录前言一、什么是不连续Mat1.产生不连续内存的常见场景2.连续与不连续内存本质区别二、常见错误遍历方式踩坑分析1.错误一:at()逐像素访问速度慢2.错误二强行使用一维 data 指针高危崩溃3.错误三使用clone() 转连续内存高开销三、不连续 Mat 高性能优化方案无拷贝、零额外开销1.行指针遍历通用稳定2.parallel_for_ 多核并行遍历四、不连续 Mat遍历方式速度对比总结前言做 OpenCV 视觉开发几乎所有人都听过一句话不要用 at() 遍历大图要用连续指针提速。但现实工程里绝大多数慢代码、莫名卡顿、偶发崩溃并不是出在普通连续图像上而是出在不连续 Mat。当我们使用 ROI 抠图、submat 截取、图像局部裁剪、矩阵分片处理后Mat 的内存结构会发生改变行与行之间存在内存空白填充内存不再线性连续。很多开发者习惯性套用连续矩阵的一维指针写法轻则遍历耗时暴涨几十倍重则直接内存越界、程序闪退。更棘手的是大型 Mat 场景4K/8K高清影像、红外遥感大图、工业高精度图像一旦内存不连续错误的遍历方式会让 CPU 缓存命中率暴跌即使开启 Release 优化代码依旧卡顿严重。很多人为了省事直接使用 clone() 强制转为连续内存看似解决问题却引入了超大内存拷贝开销在高频处理、嵌入式、实时视觉项目中完全不可用。那么问题来了在不拷贝、不重构内存、保留不连续结构的前提下如何最大限度提高大型 Mat 的访问速度本文避开网上泛滥的基础连续 Mat 教程从内存原理、避坑禁忌、基础优化、多核并行优化逐层讲解给出生产环境最优遍历方案帮你彻底解决不连续矩阵遍历慢的难题。一、什么是不连续Mat1.产生不连续内存的常见场景OpenCV 中 Mat 默认创建为连续内存但是以下操作会生成非连续 Mat也是工程开发最高频场景ROI 感兴趣区域截取mat(Rect(x,y,w,h))submat 子矩阵提取mat.rowRange() / colRange()图像不规则裁剪、局部切片图像金字塔、边缘填充后的矩阵2.连续与不连续内存本质区别连续内存整张图像像素在物理内存中一字排开、无间隔data 指针可以直接线性遍历全部像素。不连续内存每行像素末尾存在内存对齐填充字节padding下一行起始地址不紧跟当前行末尾行与行之间存在内存断层。我们可以通过两个关键参数理解step单行真实内存字节长度包含填充字节cols * channels单行有效像素字节长度判定公式step cols * channels 即为连续反之不连续。std::string pathR(d:\detect.jpg);cv::Mat srccv::imread(path,0);//16K图像大小为16384*16000intchannelsrc.channels();inttotalPixelssrc.total();// 总像素数intstepsrc.step;intcontinusrc.cols*src.channels();if(stepcontinu)std::coutsrc is continuousstd::endl;elsestd::coutsrc is not continuousstd::endl;cv::Mat roisrc(cv::Rect(1344,1152,8000,14000));steproi.step;continuroi.cols*roi.channels();if(stepcontinu)std::coutroi is continuousstd::endl;elsestd::coutroi is not continuousstd::endl;上述代码在原图中截取一个ROI截取后Mat的step不等于continu此时会输出roi是不连续的。二、常见错误遍历方式踩坑分析1.错误一:at()逐像素访问速度慢cv::Matdst(roi.size(),CV_8UC1);autostartstd::chrono::high_resolution_clock::now();for(inti0;iroi.rows;i){for(intj0;jroi.cols;j)dst.atuchar(i,j)255-roi.atuchar(i,j);}autoendstd::chrono::high_resolution_clock::now();autodurationstd::chrono::duration_caststd::chrono::microseconds(end-start);底层每次都要进行行列地址计算边界检查函数调用开销极大在大图不连续场景下CPU 缓存完全失效速度很慢。2.错误二强行使用一维 data 指针高危崩溃// 高危代码不连续Mat直接崩溃uchar*proi.data;for(inti0;itotal;i){}上述代码对于不连续内存将跳过行填充字节读取非法内存大概率会出现闪退、段错误等严重错误因此需谨慎使用。3.错误三使用clone() 转连续内存高开销//利用clone拷贝一份至连续内存if(!roi.isContinuous())roiroi.clone();clone 会完整拷贝一份内存4K、8K 、16K大图拷贝耗时极高实时项目、嵌入式设备完全无法承受。三、不连续 Mat 高性能优化方案无拷贝、零额外开销1.行指针遍历通用稳定利用 ptr() 获取每行起始指针行内线性连续访问避开行尾填充字节兼容所有不连续矩阵编译器可自动向量化优化。cv::Matdst(roi.size(),CV_8UC1);autostartstd::chrono::high_resolution_clock::now();for(inti0;iroi.rows;i){uchar*pSrcroi.ptruchar(i);uchar*pDstdst.ptruchar(i);for(intj0;jroi.cols;j)pDst[j]255-pSrc[j];}autoendstd::chrono::high_resolution_clock::now();autodurationstd::chrono::duration_caststd::chrono::microseconds(end-start);2.parallel_for_ 多核并行遍历针对超大尺寸不连续 Mat4K/8K利用 OpenCV 原生并行接口自动拆分行任务、绑定 CPU 多核无需手动创建线程性能翻倍提升。classParallelTraverse:publicParallelLoopBody{private:Mat*src;Mat*dst;public:ParallelTraverse(Mat_src,Mat_dst):src(_src),dst(_dst){}voidoperator()(constRangerange)constoverride{intcolssrc-cols;intchannelssrc-channels();for(intirange.start;irange.end;i){constuchar*pSrcsrc-ptruchar(i);uchar*pDstdst-ptruchar(i);for(intj0;jcols*channels;j){pDst[j]255-pSrc[j];}}}};cv::Matdst(roi.size(),CV_8UC1);autostartstd::chrono::high_resolution_clock::now();parallel_for_(Range(0,roi.rows),ParallelTraverse(roi,dst));autoendstd::chrono::high_resolution_clock::now();autodurationstd::chrono::duration_caststd::chrono::microseconds(end-start);四、不连续 Mat遍历方式速度对比在同一台电脑上读取一张大小为16384x16000的图像并截取大小为8000x14000的ROI对ROI进行遍历反转测试at()ptr()和parallel_for_ 三种方法的速度对比结果如下遍历方式耗时(ms)安全性at() 逐像素遍历350~380安全ptr() 逐行遍历130~150安全parallel_for_遍历20~28安全运行结果如下图上面耗时是在优化已禁用(/Od)情况下测试的结果若启用最大优化速度(/O2)情况下耗时会更短。总结很多开发者把优化重心放在连续矩阵却忽略了 ROI、切片带来的不连续内存这也是工业视觉项目中隐性卡顿、偶发闪退的核心原因。OpenCV 的性能优化从来不是单一语法技巧而是对内存布局、CPU缓存、编译指令、多核调度的综合把控。本文摒弃冗余理论全部代码均可直接复制编译、投入生产。如果你正在做实时检测、工业分拣、遥感图像处理、嵌入式视觉开发这套不连续 Mat 优化方案可以帮你低成本拉高程序帧率、减少内存占用、规避莫名崩溃。后续我会持续更新 OpenCV 工业级优化干货如果本文对你有帮助欢迎点赞收藏关注有任何问题可以在评论区留言交流。

相关文章:

同样遍历 Mat,为什么你的代码慢 10 倍?

文章目录前言一、什么是不连续Mat&#xff1f;1.产生不连续内存的常见场景2.连续与不连续内存本质区别二、常见错误遍历方式&踩坑分析1.错误一:at<>()逐像素访问&#xff08;速度慢&#xff09;2.错误二&#xff1a;强行使用一维 data 指针&#xff08;高危崩溃&…...

为什么你的ChatGPT生成帖文零互动?揭秘Instagram 2024算法对AI内容的3重隐性过滤机制

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的ChatGPT生成帖文零互动&#xff1f;揭秘Instagram 2024算法对AI内容的3重隐性过滤机制 Instagram 2024年Q2核心算法更新引入了「人类意图验证层&#xff08;HIVL&#xff09;」&#xff0c;该…...

收藏这篇就够了!日薪 2700 护网 HW 面试攻略,2026 护网全流程提前吃透

前言 参与hvv的事情还是要想办法规避掉很多坑的。网络安全这个行业现阶段还是主要政策驱动&#xff0c;后面应该是客户意识&#xff0c;现在用户教育成本明显比以前低太多。 1.关于HVV的一个简单流程 首先我带大家从甲方和厂商的角度来分解一下整个护网流程的核心逻辑 第一阶段…...

边缘TTS实战:本地部署高质量语音合成与性能优化指南

1. 项目概述&#xff1a;当TTS遇见边缘计算最近在折腾一个需要实时语音合成的项目&#xff0c;发现了一个挺有意思的仓库&#xff1a;travisvn/openai-edge-tts。这名字一看就很有料&#xff0c;把“OpenAI”和“Edge-TTS”这两个词组合在一起&#xff0c;背后指向的是一个非常…...

全网珍藏网安学习网站大全,一次性整理齐全,错过容易被删速收藏!

我们学习网络安全&#xff0c;很多学习路线都有提到多逛论坛&#xff0c;阅读他人的技术分析帖&#xff0c;学习其挖洞思路和技巧。但是往往对于初学者来说&#xff0c;不知道去哪里寻找技术分析帖&#xff0c;也不知道网络安全有哪些相关论坛或网站&#xff0c;所以在这里给大…...

bittorrent-tracker与WebTorrent生态:现代浏览器P2P下载的终极指南 [特殊字符]

bittorrent-tracker与WebTorrent生态&#xff1a;现代浏览器P2P下载的终极指南 &#x1f30a; 【免费下载链接】bittorrent-tracker &#x1f30a; Simple, robust, BitTorrent tracker (client & server) implementation 项目地址: https://gitcode.com/gh_mirrors/bit/…...

从多媒体到HPC:聊聊IBM GPFS(Spectrum Scale)那些鲜为人知的“前世今生”

从多媒体到HPC&#xff1a;IBM GPFS的技术进化与商业智慧 1993年&#xff0c;当第一代数字视频编辑系统还在为处理480p分辨率视频而焦头烂额时&#xff0c;IBM实验室里的一组工程师正在解决一个更根本的问题——如何让多个工作站同时高效访问同一组视频素材。这个看似简单的需求…...

Smart-SSO分布式部署踩坑实录:从POM依赖改写到Nginx配置的那些‘坑’

Smart-SSO分布式部署实战&#xff1a;从POM依赖到Nginx配置的深度避坑指南 去年我们团队在推进Smart-SSO分布式改造时&#xff0c;原以为按照官方文档两小时就能搞定&#xff0c;结果整整折腾了三天。这篇文章不是标准教程&#xff0c;而是我们踩过的坑和填坑经验。如果你正在…...

React Native Actions Sheet源码解析:深入理解其架构与实现原理

React Native Actions Sheet源码解析&#xff1a;深入理解其架构与实现原理 【免费下载链接】react-native-actions-sheet A Cross Platform(Android, iOS & Web) ActionSheet with a flexible api, native performance for react native. Create anything you want inside…...

告别兼容性烦恼:在Vue/React项目中优雅集成sm-crypto国密算法(附IE9+解决方案)

告别兼容性烦恼&#xff1a;在Vue/React项目中优雅集成sm-crypto国密算法&#xff08;附IE9解决方案&#xff09; 国密算法作为国内信息安全领域的重要标准&#xff0c;在前端项目中的集成需求日益增长。然而&#xff0c;现代前端框架与老旧浏览器兼容性问题往往成为开发者的拦…...

GitHub企业版MCP服务器:为AI助手集成私有化GitHub工作流

1. 项目概述&#xff1a;一个为开发者定制的GitHub企业版MCP服务器如果你是一名重度依赖GitHub Enterprise进行团队协作的开发者&#xff0c;并且正在探索如何将AI助手&#xff08;比如Claude、Cursor等&#xff09;无缝集成到你的日常开发工作流中&#xff0c;那么你很可能已经…...

CocoaPods终极版本管理指南:掌握语义化版本控制与依赖锁定策略

CocoaPods终极版本管理指南&#xff1a;掌握语义化版本控制与依赖锁定策略 【免费下载链接】CocoaPods The Cocoa Dependency Manager. 项目地址: https://gitcode.com/gh_mirrors/co/CocoaPods CocoaPods是iOS和macOS开发中最受欢迎的依赖管理器&#xff0c;它通过智能…...

《蔚蓝档案》鼠标指针主题:从设计到安装的完整桌面美化指南

1. 项目概述&#xff1a;为你的桌面注入《蔚蓝档案》的学园气息如果你和我一样&#xff0c;既是《蔚蓝档案》的玩家&#xff0c;又是个喜欢折腾桌面美化的爱好者&#xff0c;那么今天分享的这个项目绝对会让你眼前一亮。它不是什么复杂的软件&#xff0c;而是一套精心制作的Win…...

Neo-Launcher数据库架构:数据存储和管理的深度解析

Neo-Launcher数据库架构&#xff1a;数据存储和管理的深度解析 【免费下载链接】Neo-Launcher Neo-Launcher 项目地址: https://gitcode.com/gh_mirrors/ne/Neo-Launcher Neo-Launcher是一款由Neo Collective开发的开源启动器应用&#xff0c;其高效的数据存储和管理系统…...

PICAXE单片机驱动DS18B20温度传感器:从硬件连接到数据处理

1. 项目概述&#xff1a;用PICAXE玩转DS18B20数字温度传感器如果你手头有一块PICAXE单片机&#xff0c;想快速实现一个温度监测项目&#xff0c;那么DS18B20这颗数字温度传感器绝对是你的绝佳拍档。它只需要一根数据线就能和MCU通信&#xff0c;抗干扰能力强&#xff0c;还能通…...

Unity游戏任务系统框架解析:数据驱动与事件架构实战

1. 项目概述&#xff1a;一个为游戏开发者准备的灵活任务系统如果你正在开发一款RPG、开放世界或者任何需要任务驱动的游戏&#xff0c;那么“任务系统”绝对是你绕不开的核心模块。最近我在GitHub上发现了一个名为shomykohai/quest-system的开源项目&#xff0c;它不是一个完整…...

三星48层3D V-NAND深度拆解:从电荷陷阱架构到存储密度革命

1. 初探三星48层3D V-NAND&#xff1a;一次深度拆解与工艺解析作为一名长期关注半导体存储技术的从业者&#xff0c;每次拿到业界巨头的新品进行物理层面的拆解分析&#xff0c;都像是一次充满惊喜的“寻宝”之旅。2016年初&#xff0c;当三星将其早在2015年8月就已预告的256Gb…...

AirMapView自定义地图类型开发:扩展新的地图提供商完整指南 [特殊字符]️

AirMapView自定义地图类型开发&#xff1a;扩展新的地图提供商完整指南 &#x1f5fa;️ 【免费下载链接】AirMapView A view abstraction to provide a map user interface with various underlying map providers 项目地址: https://gitcode.com/gh_mirrors/ai/AirMapView …...

PortAudio性能测试与调优:如何实现最低延迟音频处理的完整指南

PortAudio性能测试与调优&#xff1a;如何实现最低延迟音频处理的完整指南 【免费下载链接】portaudio PortAudio is a cross-platform, open-source C language library for real-time audio input and output. 项目地址: https://gitcode.com/gh_mirrors/po/portaudio …...

蓝奏云直链解析:从繁琐到一键的下载革命

蓝奏云直链解析&#xff1a;从繁琐到一键的下载革命 【免费下载链接】LanzouAPI 蓝奏云直链&#xff0c;蓝奏api&#xff0c;蓝奏解析&#xff0c;蓝奏云解析API&#xff0c;蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 你是否厌倦了蓝奏云…...

WarcraftHelper:让经典魔兽在现代电脑上重获新生

WarcraftHelper&#xff1a;让经典魔兽在现代电脑上重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还记得那些在网吧通宵对战《魔兽争…...

Buzz音频转录工具故障快速定位:5大紧急级别终极排查指南 [特殊字符]

Buzz音频转录工具故障快速定位&#xff1a;5大紧急级别终极排查指南 &#x1f6a8; 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz…...

【Claude JavaScript开发支持终极指南】:20年前端架构师亲测的5大生产力跃迁技巧

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Claude JavaScript开发支持的演进与定位 Claude 系列模型自发布以来&#xff0c;持续增强对前端及全栈开发场景的理解能力&#xff0c;其中 JavaScript 作为核心支持语言之一&#xff0c;其支持深度随版…...

Crush性能优化指南:如何利用半懒惰流处理大数据集

Crush性能优化指南&#xff1a;如何利用半懒惰流处理大数据集 【免费下载链接】crush Crush is a command line shell that is also a powerful modern programming language. 项目地址: https://gitcode.com/gh_mirrors/cr/crush Crush是一个革命性的命令行shell和现代…...

DocX入门指南:如何在不安装Word的情况下快速创建第一个Word文档

DocX入门指南&#xff1a;如何在不安装Word的情况下快速创建第一个Word文档 【免费下载链接】DocX Fast and easy to use .NET library that creates or modifies Microsoft Word files without installing Word. 项目地址: https://gitcode.com/gh_mirrors/doc/DocX Do…...

FinRL_Podracer:基于深度强化学习的高性能量化交易框架解析

1. 项目概述&#xff1a;当强化学习遇上量化交易最近几年&#xff0c;量化交易圈子里有个词儿越来越热&#xff0c;那就是“强化学习”。你可能听说过AlphaGo下围棋&#xff0c;或者AI在星际争霸里打败人类高手&#xff0c;这些背后都是强化学习在发力。简单来说&#xff0c;它…...

终极指南:如何免费使用Umi-OCR实现高效离线文字识别

终极指南&#xff1a;如何免费使用Umi-OCR实现高效离线文字识别 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库…...

Day3:拆箱ROS2|一起搭建机器人开发车间

Day1:一起学习了ros2是什么以及ros2为机器人开发提供了哪些核心功能. Day2一起安装了ros2。 接下来自然会想到如果现在要用ROS2开发一个机器人&#xff0c;应该怎样开始&#xff1f; 下面我们以雷达小车机器人举例说明&#xff1a; 1、需要为机器人创建一个【工作空间】作为顶层…...

“为什么我的NotebookLM Agent总在胡说?”——20年NLP老兵手把手调试LLM引用可信度的5个黄金检查点

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM Agent研究辅助 核心能力与适用场景 NotebookLM Agent 是 Google 推出的基于私有文档理解的 AI 助手&#xff0c;专为研究者设计。它支持上传 PDF、TXT、Markdown 等格式的研究资料&#xf…...

本地部署AI代码解释器:基于大模型的对话式编程实践指南

1. 项目概述&#xff1a;当本地代码解释器遇上大模型最近在折腾一个挺有意思的项目&#xff0c;叫local-code-interpreter。这名字听起来有点学术&#xff0c;但说白了&#xff0c;它就是一个能让你在自己电脑上&#xff0c;通过自然语言对话来编写、执行和调试代码的“智能助手…...