opencv訪問圖片中畫素的方法(二)——迭代器iterator
opencv訪問圖片畫素的第二種方法為:迭代法。在迭代法中,我們所需要的僅僅是獲得矩陣的begin和end,然後增加迭代直至
從begin到end。將*操作符新增在迭代指標前,即可訪問當前指向的內容。相比於指標直接訪問可能出現越界問題,迭代器絕對
是非常安全的方法。用關鍵字“STL迭代器”進行搜尋可以找到各種相關的博文和資料。
下面為一個示例程式。
#include "stdafx.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "iostream"
using namespace std;
using namespace cv;
void colorReduce(Mat& inputImage, Mat& outputImage, int div);
int main()
{
Mat srcImage = imread("1.jpg");//插入圖片
imshow("原始影象", srcImage);
Mat dstImage;
dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());
double time0 = static_cast<double>(getTickCount());
colorReduce(srcImage, dstImage, 32);
time0 = ((double)getTickCount() - time0) /getTickFrequency();
cout << "此方法執行時間為:" << time0 << "秒" << endl;
imshow("效果圖", dstImage);
waitKey(0);
return 0;
}
void colorReduce(Mat& inputImage, Mat& outputImage,int div)//引用傳遞方式,可以改變實參的值。
{
outputImage = inputImage.clone();//複製實參到臨時變數
Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();//初始位置的迭代器
Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();//終止位置的迭代器
for (; it != itend; ++it) {
//處理每個畫素
(*it)[0] = (*it)[0] / div*div + div / 2;
(*it)[1] = (*it)[1] / div*div + div / 2;
(*it)[2] = (*it)[2] / div*div + div / 2;
}
}