OpenCV中6種訪問Mat元素的方法
阿新 • • 發佈:2018-11-21
Mat中不管是以at訪問還是ptr訪問,都是行優先 ,先Y軸後X軸(即先行後列)
1、使用at訪問
/* *OpenCV2中Mat的at操作訪問矩陣元素 * */ #include <highgui.h> 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<Vec3b>(h , w)[0] = 255 ; image.at<Vec3b>(h , w)[1] = 0 ; image.at<Vec3b>(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<Vec3b>(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<uchar>(h , w) = 128 ; } } imshow("gray" , image) ; waitKey(0) ; return 0 ; }
2、使用ptr訪問
/* *OpenCV2中Mat操作ptr訪問矩陣元素 * */ #include <highgui.h> 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<uchar>(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<Vec3b>(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<uchar>(h , w) ; *ptr = 255 ; } } imshow("gray2" , image) ; waitKey(0) ; return 0 ; }
3、迭代器訪問
/* *OpenCV2中Mat的迭代器訪問Mat元素 * */ #include <highgui.h> using namespace std ; using namespace cv ; int main() { Mat image = imread("forest.jpg") ; imshow("image" , image) ; //三通道影象 Mat_<Vec3b>::iterator it = image.begin<Vec3b>() ; Mat_<Vec3b>::iterator itend = image.end<Vec3b>() ; for(;it != itend ; ++ it) { (*it)[0] = 255 ; (*it)[1] = 0 ; (*it)[2] = 0 ; } imshow("color1" , image) ; //單通道影象 image = imread("forest.jpg" , 0) ; Mat_<uchar>::iterator it1 = image.begin<uchar>() ; Mat_<uchar>::iterator itend1 = image.end<uchar>() ; for (;it1 != itend1 ; ++ it1) { (*it1) = 128 ; } imshow("gray" , image) ; waitKey(0) ; return 0 ; }
4、data操作
/*
*Mat中的data操作
*/
#include <highgui.h>
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 <highgui.h>
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 <highgui.h>
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<uchar>(h) ;
for(int w = 0 ; w < nCols ; ++ w)
{
//ptr[w] = 128 ;
*ptr ++ = 128 ;
}
}
imshow("high" , image) ;
waitKey(0) ;
return 0 ;
}