使用opencv读取图像时图像的排列方式是一个三维数组,但并非是三维数组按照[r:[[]] g:[[]] b:[[]]] 然后组合的方式存储。
图片的存储方式可以理解成有个长 * 宽 的矩阵 矩阵的每一个点包括[b, g, r]三个点的数据 是按照[b, g, r][b, g, r] 的方式存储
#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace std;
using namespace cv;
int main() {
string path = "005.jpg";
Mat srcImage = imread(path);
namedWindow("show", 0);
imshow("show", srcImage);
waitKey(0);
Mat dst;
dst.create(srcImage.size(), srcImage.type());
//遍历每一个像素
for(int i = 0; i < srcImage.rows; i++){
for(int j = 0; j < srcImage.cols; j++){
/*
* 使用at模板函数来访问每一行每一列的像素
* 如 img.at<Vec3b>(i, j) 其中[0]为b [1] g [2] r
* 由此可以看出RGB的排列方式,是一个三维数组 其中第一维是长 第二维是宽,第三维度包含三个点分别是BGR
* */
int b = srcImage.at<Vec3b>(i, j)[0];
int g = srcImage.at<Vec3b>(i, j)[1];
int r = srcImage.at<Vec3b>(i, j)[2];
//打印结果:[b, g, r][b, g, r][b, g, r][b, g, r]
cout << srcImage.at<Vec3b>(i, j) << endl;
dst.at<Vec3b>(i, j)[0] = b;
dst.at<Vec3b>(i, j)[1] = g;
dst.at<Vec3b>(i, j)[2] = r;
}
}
namedWindow("show1", 0);
imshow("show1", dst);
waitKey(0);
return 0;
}