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> 可以更方便地创建卷积核,并支持直接使用 MatMat_<T> 两种存储方式。相比于 cv::MatMat_<T> 在编译期就确定了数据类型,访问元素时更简洁(如直接用 mat_(i,j) 而非 mat.at<T>(i,j))。

⑤ 遍历图像时的效率排序与原因

耗时排序(由快到慢)
ptr < 迭代器 < at()

原因分析

  • ptr(最快)
    类似于手写 C 指针,直接获取行指针后逐像素移动访问,无边界检查无函数调用开销,效率最高。

  • 迭代器(中等)
    迭代器在 C++ 层面完成边界判断和下一个像素地址的计算,这些操作只做一次(指迭代器初始化与结束判断)。相比 at(),减少了多次边界检查重复的函数调用,但仍略慢于直接指针操作。

  • at()(最慢)
    每次访问像素时都进行边界检查函数调用,导致额外开销累积,因此效率最低。


源码链接
freeyang8/opencv-learning: 记录每次学习的源码


posted @ 2026-04-26 16:57  freeyang8  阅读(11)  评论(0)    收藏  举报