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