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;
}
}