感谢C++的强大和灵活,灵活到我不愿钻研它。因此在解决各种问题时,我都寻找相对通用的方法。
OpenCV提供多种像素遍历方法,一搜一大堆,我之前都是使用迭代器来查询,如下:
Mat_<Vec3b>::iterator it = img.begin<Vec3b>();
Mat_<Vec3b>::iterator itend = img.end<Vec3b>();
for (; it != itend; ++it){
cout<<(*it)[0]<<endl;
cout<<(*it)[1]<<endl;
cout<<(*it)[2]<<endl;
}
用起来还算方便,但今天需要处理灰度图像了,灰度图像,数据格式就不再是Vec3b了,我暂未找到它的数据格式,但是找到了适用于灰度图的像素遍历方法,而且也适用于三通道图像;这似乎更像是OpenCV提供给我们的方法,方法如下:
int row = 0;
int col = 0;
cout << (int)*(img.data+img.step[0] * row + img.step[1] * col) << endl;
这句话就能输出灰度图img的第一行第一列像素的灰度值。img是Mat类型数据,Mat.data返回的是Mat的指针,row是行代号,0代表第一行,col是列代号,0代表第一列。
同样的语句,处理三通道图像则是:
int row = 0;
int col = 0;
cout << (int)*(img.data+img.step[0] * row + img.step[1] * col) << endl;//第一通道
cout << (int)*(img.data+img.step[0] * row + img.step[1] * col) +1<< endl;//第二通道
cout << (int)*(img.data+img.step[0] * row + img.step[1] * col)+2 << endl;//第三通道
其他遍历方式,见:http://blog.csdn.net/daoqinglin/article/details/23628125