OpenCV访问图像像素方法 C++代码
OpenCV访问图像像素
图像在内存中的存储方式
图像矩阵的大小取决于所用的颜色模型(通道数)
可以用isContinuous()判断矩阵是否连续存储的
动态地址计算访问图像像素
image.at<Vec3b>(i,j)[channel] = value;
//成员函数at用来读取像素,at方法不会进行类型转换,所以需要制定图像元素类型,并且要和矩阵内类型一致
#include "opencv2/opencv.hpp"
using namespace cv;
void main() {
Mat img = imread("1.jpg");
Mat dst = img.clone();
imshow("src", img);
int rowNum = img.rows;
int colNum = img.cols;
for (int i = 0; i <rowNum; i++) {
for (int j = 0; j < colNum; j++) {
dst.at<Vec3b>(i, j)[0] = 0;//访问i行j列像素蓝色通道
dst.at<Vec3b>(i, j)[1] = 255;//访问i行j列像素绿色通道
dst.at<Vec3b>(i, j)[2] = 0;
//dst.at<uchar>(i,j)=255;//灰度图像
}
}
imshow("dst", dst);
waitKey(0);
destroyAllWindows();
}
指针访问
Mat类提供了ptr函数可以得到图像任意行的首地址
#include "opencv2/opencv.hpp"
using namespace cv;
void main() {
Mat img = imread("1.jpg");
Mat dst = img.clone();
imshow("src", img);
int rowNum = img.rows;
int colNum = img.cols*img.channels();//列数*通道数=每行元素个数
for (int i = 0; i < rowNum; i++) {
uchar* data = dst.ptr<uchar>(i);//获取第i行首地址
for (int j = 0; j < colNum; j++) {
switch (j % 3) {
case 0:
data[j] = 255;
break;
case 1:
data[j] = 255;
break;
case 2:
data[j] = 0;
break;
default:
break;
}
}
}
imshow("dst", dst);
waitKey(0);
destroyAllWindows();
}
迭代器访问
Mat_类是Mat的模板子类,begin和end模板方法可以获得迭代器的开始和结束位置
#include "opencv2/opencv.hpp"
using namespace cv;
void main() {
Mat img = imread("1.jpg");
Mat dst = img.clone();
imshow("src", img);
Mat_<Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置
Mat_<Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置
for (; it != itend; it++) {
(*it)[0] = 0;
(*it)[1] = 255;
(*it)[2] = 0;
}
imshow("dst", dst);
waitKey(0);
destroyAllWindows();
}

浙公网安备 33010602011771号