Ubuntu下OpenCV编程[2]-cv::Mat类

来源:互联网 发布:淘宝产品搜索不到 编辑:程序博客网 时间:2024/06/06 05:19

cv::Mat类介绍

遍历cv::Mat图像矩阵

  • 使用at函数进行遍历
  • 使用迭代器进行遍历
  • 使用指针进行遍历
  • 使用子类 cv::Mat_ 运算符重载函数()

由于像素点的数据类型不同,将这几种方式遍历的测试函数,封装成模板函数,如下所示:

namespace Hui {    // 1. 使用 for循环 + at函数 遍历图像矩阵    template <typename T>    void travelMatByAt(cv::Mat &mat, T &pixel)    {        for (int i = 0; i < mat.rows; ++i)            for (int j = 0; j < mat.cols; ++j)                mat.at<T>(i, j) = pixel;    }    // 2. 使用 for循环 + 指针操作 遍历图像矩阵    template <typename T>    void travelMatByPointer(cv::Mat &mat, T &pixel)    {        for (int i = 0; i < mat.rows; ++i) {            T *pCol = mat.ptr<T>(i);            for (int j = 0; j < mat.cols * mat.channels(); ++j) {                pCol[j] = pixel;            }        }    }    // 3. 使用迭代器遍历图像矩阵    template <typename T>    void travelMapByIterator(cv::Mat &mat, T &pixel)    {        for (cv::MatIterator_<T> it = mat.begin<T>(); it != mat.end<T>(); ++it)            *it = pixel;    }    // 4. 使用子类 cv::Mat_ 运算符重载函数()    template <typename T>    void travelMapByMap_(cv::Mat &mat, T &pixel)    {        cv::Mat_<T> mat_ = mat; //模板类Mat_继承自Mat,=使用的是浅拷贝        for (int i = 0; i < mat_.rows; ++i)            for (int j = 0; j < mat_.cols; ++j)                mat_(i, j) = pixel;    }}
原创粉丝点击