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