牛骨文教育服务平台(让学习变的简单)
博文笔记

OpenCV2 的像素值读写

创建时间:2015-02-07 投稿人: 浏览次数:1643

之前一直在看OpenCV1,现在发现主流都在用OpenCV2了,所以这两天看了看于仕琪老师写的《OpenCV入门教程》,基本对OpenCV2 的语法有了了解。

OpenCV2 中有了 Mat 类,使得像素的读写更加容易。有三种方法可以读写Mat的像素值。分别是:at() 函数,迭代器,指针。

例子如下:

1. 使用 at() 函数

核心代码:

uchar value = grayim.at<uchar>(i,j);
grayim.at<uchar>(i,j)=128;

完整代码:

#include<iostream>
#include<opencv2opencv.hpp>
using namespace std;
using namespace cv;

int main(int argc,char* argv[]){
	Mat grayim(600,800,CV_8UC1);
	Mat colorim(600,800,CV_8UC3);
	for(int i=0;i<grayim.rows;i++){
		for(int j=0;j<grayim.cols;j++){
			grayim.at<uchar>(i,j)=(i+j)%255;
		}
	}
	for(int i=0;i<colorim.rows;i++){
		for(int j=0;j<colorim.cols;j++){
			Vec3b pixel;
			pixel[0]=i%255;
			pixel[1]=j%255;
			pixel[2]=0;
			colorim.at<Vec3b>(i,j)=pixel;
		}
	}
	imshow("grayim",grayim);
	imshow("colorim",colorim);
	waitKey(0);
	return 0;
}

2. 使用迭代器

这里不再使用 i,j 变量,而是直接用迭代器获取每个像素的指针,然后依次操作像素

核心代码:

MatIterator_<uchar> grayit, grayend;
grayit = grayim.begin<uchar>();
grayend=grayim.end<uchar>();

完整代码:

int main(int argc,char* argv[]){
	Mat grayim(600,800,CV_8UC1);
	Mat colorim(600,800,CV_8UC3);
	MatIterator_<uchar> grayit, grayend;
	for(grayit=grayim.begin<uchar>(),grayend=grayim.end<uchar>();grayit!=grayend;grayit++){
		*grayit=rand()%255;
	}
	MatIterator_<Vec3b> colorit, colorend;
	for(colorit=colorim.begin<Vec3b>(),colorend=colorim.end<Vec3b>();colorit!=colorend;colorit++){
		(*colorit)[0]=rand()%255;
		(*colorit)[1]=rand()%255;
		(*colorit)[2]=rand()%255;
	}
	imshow("grayim",grayim);
	imshow("colorim",colorim);
	waitKey(0);
	return 0;
}

3. 使用指针

指针操作不可靠,除非注重程序运行速度,一般情况不用

核心代码:

uchar* p=grayim.ptr<uchar>(i); //第i行开头的指针
p[j]=(i+j)%255;//第i行第j列的像素值

完整代码:

int main(int argc,char* argv[]){
<span style="white-space:pre">	</span>Mat grayim(600,800,CV_8UC1);
<span style="white-space:pre">	</span>Mat colorim(600,800,CV_8UC3);
<span style="white-space:pre">	</span>for(int i=0;i<grayim.rows;i++){
<span style="white-space:pre">		</span>uchar* ptr=grayim.ptr<uchar>(i);
<span style="white-space:pre">		</span>for(int j=0;j<grayim.cols;j++)
<span style="white-space:pre">			</span>ptr[j]=(i+j)%255;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>for(int i=0;i<colorim.rows;i++){
<span style="white-space:pre">		</span>Vec3b* ptr=colorim.ptr<Vec3b>(i);
<span style="white-space:pre">		</span>for(int j=0;j<colorim.cols;j++){
<span style="white-space:pre">			</span>ptr[j][0]=i%255;
<span style="white-space:pre">			</span>ptr[j][1]=j%255;
<span style="white-space:pre">			</span>ptr[j][2]=0;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>imshow("grayim",grayim);
<span style="white-space:pre">	</span>imshow("colorim",colorim);
<span style="white-space:pre">	</span>waitKey(0);
<span style="white-space:pre">	</span>return 0;
}


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。