Ubuntu下OpenCV編程[2]-cv::Mat類

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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章