opencv2.0以后c++接口的API函数成为一种趋势,常用的IplImage与cvMat数据结构也淡出,新数据结构cv::Mat成为新宠。目前国内,新数据结构cv::Mat的资料还是比较少的。新数据结构cv::Mat元素的访问(读取、存取)的方法对很多初学者来还是很不明了的。
现在综合一些资料,在此抛砖引玉。
//http://blog.csdn.net/moc062066
//20111128
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc,char** argv)
{
const char* filename = "google.png";
//CV_8UC3
//相应的CV_8SC3---Vec3s
//相应的CV_16UC3---Vec3w
Mat mat_CV_8UC3 = imread(filename,IMREAD_COLOR);
for( size_t nrow = 0; nrow < mat_CV_8UC3.rows; nrow++)
{
for(size_t ncol = 0; ncol < mat_CV_8UC3.cols; ncol++)
{
Vec3i bgr = mat_CV_8UC3.at<Vec3b>(nrow,ncol);//用Vec3b也行
cout << "("<<bgr.val[0]<<","
<<bgr.val[1]<<","
<<bgr.val[2]<<")";
}
cout << endl;
}
for( size_t nrow = 0; nrow < mat_CV_8UC3.rows; nrow++)
{
uchar* data = mat_CV_8UC3.ptr<uchar>(nrow);
for(size_t ncol = 0; ncol < mat_CV_8UC3.cols * mat_CV_8UC3.channels(); ncol++)
{
cout << int( data[ncol] ) ;
}
cout << endl;
}
//------CV_8UC1----------start---
//
Mat mat_CV_8UC1 = imread(filename,IMREAD_GRAYSCALE);
for( size_t nrow = 0; nrow < mat_CV_8UC1.rows; nrow++)
{
for(size_t ncol = 0; ncol < mat_CV_8UC1.cols; ncol++)
{
uchar val = mat_CV_8UC1.at<uchar>(nrow,ncol);
//
cout << (int(val) > 200 ? 1 :0) ;//cout<<int(val)<< endl ;
}
cout << endl ;
}
cout << endl;
for ( size_t row = 0 ; row < mat_CV_8UC1.rows ; ++row)
{
uchar* ptr = mat_CV_8UC1.ptr<uchar>(row);
for ( size_t col = 0 ; col < mat_CV_8UC1.cols ; ++col)
{
cout << ( int(ptr[col]) > 200 ? 1 :0) ;//cout<<int(val)<< endl ;
}
cout << "\n" ;
}
cout << endl;
MatIterator_<uchar> it = mat_CV_8UC1.begin<uchar>(), it_end = mat_CV_8UC1.end<uchar>();
for(int cnt = 1; it != it_end; ++it)
{
cout << ( int(*it) > 200 ? 1 : 0) ;
if( (cnt++ % mat_CV_8UC1.cols) ==0 )
cout << endl;
}
//------CV_8UC1----------end---
return 0;
}
参考:1
所有图像:
(245,245,245)(245,245,245)(245,245