OpenCV中6种访问Mat元素的方法

Mat中不管是以at访问还是ptr访问,都是行优先 ,先Y轴后X轴(即先行后列)

1、使用at访问

/*
*OpenCV2中Mat的at操作访问矩阵元素
*
*/

#include 

using namespace std ;
using namespace cv ;

int main()
{
	Mat image = imread("forest.jpg") ;
	imshow("image" , image) ;

	//三通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)
	//第一种方法
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			image.at(h , w)[0] = 255 ;
			image.at(h , w)[1] = 0 ;
			image.at(h , w)[2] = 0 ;
		}
	}
	imshow("color1" , image) ;
	//方法二
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			Vec3b &bgr = image.at(h , w) ;
			bgr.val[0] = 0 ;
			bgr.val[1] = 255 ;
			bgr.val[2] = 0 ;
		}
	}
	imshow("color2" , image) ;

	image = imread("forest.jpg" , 0) ;
	//单通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			image.at(h , w) = 128 ;
		}
	}
	imshow("gray" , image) ;
	waitKey(0) ;
	return 0 ;
}

2、使用ptr访问

/*
*OpenCV2中Mat操作ptr访问矩阵元素
*
*/

#include 

using namespace std ;
using namespace cv ;

int main()
{
	Mat image = imread("forest.jpg") ;
	imshow("image" , image) ;

	//三通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)
	//第一种方法
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			uchar *ptr = image.ptr(h , w) ;
			ptr[0] = 255 ;
			ptr[1] = 0 ;
			ptr[2] = 0 ;
		}
	}
	imshow("color1" , image) ;
	//第二种方法
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			Vec3b *ptr = image.ptr(h , w) ;
			ptr->val[0] = 0 ;
			ptr->val[1] = 255 ;
			ptr->val[2] = 0 ;
		}
	}
	imshow("color2" , image) ;

	image = imread("forest.jpg" , 0) ;
	//单通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)
	//第一种方法
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		uchar *ptr = image.ptr(h) ;
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			ptr[w] = 128 ;
		}
	}
	imshow("gray1" , image) ;

	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols / 2 ; ++ w)
		{
			uchar *ptr = image.ptr(h , w) ;
			*ptr = 255 ;
		}
	}
	imshow("gray2" , image) ;

	waitKey(0) ;
	return 0 ;
}

3、迭代器访问

/*
*OpenCV2中Mat的迭代器访问Mat元素
*
*/

#include 

using namespace std ;
using namespace cv ;

int main()
{
	Mat image = imread("forest.jpg") ;
	imshow("image" , image) ;

	//三通道图像
	Mat_::iterator it = image.begin() ;
	Mat_::iterator itend = image.end() ;

	for(;it != itend ; ++ it)
	{
		(*it)[0] = 255 ;
		(*it)[1] = 0 ;
		(*it)[2] = 0 ;
	}
	imshow("color1" , image) ;
	//单通道图像
	image = imread("forest.jpg" , 0) ;
	Mat_::iterator it1 = image.begin() ;
	Mat_::iterator itend1 = image.end() ;
	for (;it1 != itend1 ; ++ it1)
	{
		(*it1) = 128 ;
	}

	imshow("gray" , image) ;
	waitKey(0) ;
	return 0 ;
}

4、data操作

/*
*Mat中的data操作
*/

#include 

using namespace std ;
using namespace cv ;

int main()
{
	Mat image = imread("forest.jpg") ;
	imshow("image" , image) ;
	//三通道
	uchar *data = image.data ;

	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols/2 ; ++ w)
		{
			*data ++ = 128 ;
			*data ++ = 128 ;
			*data ++ = 128 ;
		}
	}
	imshow("data" , image) ;
	//单通道
	image = imread("forest.jpg" , 0) ;
	imshow("image" , image) ;

	data = image.data ;
	for(int h = 0 ; h < image.rows ; ++ h)
	{
		for(int w = 0 ; w < image.cols/2 ; ++ w)
		{
			*data ++ = 128 ;
		}
	}
	imshow("data1" , image) ;

	waitKey(0) ;
	return 0 ;
}

5、row , col操作

#include 

using namespace std ;
using namespace cv ;

int main()
{
	Mat image = imread("forest.jpg") ;
	imshow("image" , image) ;

	for(int i = 0 ; i < 100 ; ++ i)
	{
		image.row(i).setTo(Scalar(0 , 0 , 0)) ;//设定第i行数据
		image.col(i).setTo(Scalar(0 , 0 , 0)) ;//设定第i列数据
	}

	imshow("image" , image) ;
	waitKey(0) ;
	return 0 ;
}

6、高效访问

#include 

using namespace std ;
using namespace cv ;

int main()
{
	Mat image = imread("forest.jpg") ;
	imshow("image" , image) ;
	//单通道多通道都适用
	int nRows = image.rows ;
	int nCols = image.cols * image.channels() ;

	if(image.isContinuous())
	{
		nCols = nRows * nCols ;
		nRows = 1 ;
	}

	for(int h = 0 ; h < nRows ; ++ h)
	{
		uchar *ptr = image.ptr(h) ;
		for(int w = 0 ; w < nCols ; ++ w)
		{
			//ptr[w] = 128 ;
			*ptr ++ = 128 ;
		}
	}

	imshow("high" , image) ;

	waitKey(0) ;
	return 0 ;
}

转自:http://lib.csdn.net/article/opencv/28174

你可能感兴趣的:(OpenCv,C/C++)