opencv(cpp)基础学习--2026年4月26日
以下是为你修饰后的完整博客文案,已修正原表述中的不严谨之处,并保留了你生动的比喻风格,可直接复制发布。
OpenCV 基础矩阵操作与图像遍历效率总结
① cv::Mat::eye —— 单位矩阵
用于创建一个单位矩阵,即对角线元素为 1,其余为 0。
注:若矩阵非方阵,则左上角子矩阵为单位矩阵,其余区域为 0。
② cv::Mat::zeros —— 全零矩阵 / 全黑图像
通常用于初始化一个全零矩阵。对于图像而言,单通道时呈现全黑,多通道(如 BGR)时各通道均为 0,也表现为全黑。
③ cv::Mat::ones —— 全一矩阵,用于掩码或卷积核
- 卷积核就像一块海绵:海绵擦过的像素点求加权平均。若直接将全 1 矩阵作为卷积核,相当于对邻域像素求和,会导致像素值剧烈放大。实际使用时通常需要归一化(例如除以核面积)才能实现均值滤波效果。
- 掩码就像一块遮罩:用于掩盖一部分像素点,可以灵活决定掩码内和掩码外的像素点如何被处理。全 1 掩码表示所有像素都参与运算,实际应用中掩码多为二值图像(0 和 1)。
④ 使用模板类 Mat_<T> 创建卷积核
使用模板类 Mat_<T> 可以更方便地创建卷积核,并支持直接使用 Mat 或 Mat_<T> 两种存储方式。相比于 cv::Mat,Mat_<T> 在编译期就确定了数据类型,访问元素时更简洁(如直接用 mat_(i,j) 而非 mat.at<T>(i,j))。
⑤ 遍历图像时的效率排序与原因
耗时排序(由快到慢)
ptr < 迭代器 < at()
原因分析
-
ptr(最快)
类似于手写 C 指针,直接获取行指针后逐像素移动访问,无边界检查,无函数调用开销,效率最高。 -
迭代器(中等)
迭代器在 C++ 层面完成边界判断和下一个像素地址的计算,这些操作只做一次(指迭代器初始化与结束判断)。相比at(),减少了多次边界检查和重复的函数调用,但仍略慢于直接指针操作。 -
at()(最慢)
每次访问像素时都进行边界检查和函数调用,导致额外开销累积,因此效率最低。
源码链接
freeyang8/opencv-learning: 记录每次学习的源码

浙公网安备 33010602011771号