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();
}
posted @ 2021-01-30 20:10  Eunice呀  阅读(450)  评论(0)    收藏  举报