先上代码:
#include<iostream> #include<opencv2/core/core.hpp> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat diff=imread("/home/lisa/dataset/02m16001200/0.jpg"); for(int i=0;i<diff.rows;i++) { for(int j=0;j<diff.cols;j++) { Vec3b bgrPixel=diff.at<Vec3b>(i,j); cout<<"rows=="<<i<<"cols=="<<j<<" "<<bgrPixel<<endl; } } cv::waitKey(0); cout<<"hello world"<<endl; return 0; }
Vec3b这种数据结构,存放了某个点的BGR三个通道的值,比如:这个代码输出如下:
rows==0cols==0 [0, 0, 0]
rows==0cols==1 [0, 0, 0]
rows==0cols==2 [0, 0, 0]
rows==0cols==3 [0, 0, 0]
rows==0cols==4 [0, 0, 0]
rows==0cols==5 [0, 0, 0]
rows==0cols==6 [0, 0, 0]
rows==0cols==7 [0, 0, 0]
rows==0cols==8 [0, 0, 0]
rows==0cols==9 [0, 0, 0]
rows==0cols==10 [0, 0, 0]
rows==0cols==11 [0, 0, 0]
rows==0cols==12 [0, 0, 0]
rows==0cols==13 [0, 0, 0]
rows==0cols==14 [0, 0, 0]
rows==0cols==15 [0, 0, 0]
rows==0cols==16 [0, 0, 0]
rows==0cols==17 [0, 0, 0]
rows==0cols==18 [0, 0, 0]
rows==0cols==19 [0, 0, 0]
rows==0cols==20 [0, 0, 0]
rows==0cols==21 [0, 0, 0]
rows==0cols==22 [1, 1, 1]
rows==0cols==23 [0, 0, 0]
rows==0cols==24 [0, 0, 0]
rows==0cols==25 [0, 0, 0]
rows==0cols==26 [0, 0, 0]
rows==0cols==27 [0, 0, 0]
rows==0cols==28 [1, 1, 1]
rows==0cols==29 [0, 0, 0]
rows==0cols==30 [0, 0, 0]
rows==0cols==31 [1, 1, 1]
rows==0cols==32 [0, 0, 0]
rows==0cols==33 [0, 0, 0]
rows==0cols==34 [0, 0, 0]
rows==0cols==35 [0, 0, 0]
rows==0cols==36 [0, 0, 0]
rows==0cols==37 [1, 1, 1]
rows==0cols==38 [0, 0, 0]
rows==0cols==39 [0, 0, 0]
rows==0cols==40 [0, 0, 0]
rows==0cols==41 [0, 0, 0]
rows==0cols==42 [0, 0, 0]
rows==0cols==43 [0, 0, 0]
rows==0cols==44 [0, 0, 0]
rows==0cols==45 [0, 0, 0]
若需要获取每个通道的像素点的值,可以如下:
for (int i = 0; i < image.cols; i++) { for (int j = 0; j < image.rows; j++) { Vec3b intensity = image.at<Vec3b>(j, i); for(int k = 0; k < image.channels(); k++) { uchar col = intensity.val[k]; } } }