aihot  2017-05-18 01:46:51  图像处理 |   查看评论   
程序员手动管理内存的释放。opencv2.3中提到Mat是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。 

View Code
class CV_EXPORTS Mat { public: int flags;(Note :目前还不知道flags做什么用的) int dims; int rows,cols;  uchar *data;  int * refcount;  ... };

 从以上结构体可以看出Mat也是一个矩阵头,默认不分配内存,只是指向一块内存(注意读写保护)。初始化使用create函数或者Mat构造函数,以下整理自opencv2.3.1 Manual:

View Code
Mat(nrows, ncols, type, fillValue]);  M.create(nrows, ncols, type);
例子: Mat M(7,7,CV_32FC2,Scalar(1,3));  M.create(10060, CV_8UC(15));
int sz[] = {100100100};  Mat bigCube(3, sz, CV_8U, Scalar:all(0));
double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}}; Mat M = Mat(33, CV_64F, m).inv();
Mat img(Size(320,240),CV_8UC3);  Mat img(height, width, CV_8UC3, pixels, step);
IplImage* img = cvLoadImage("greatwave.jpg"1); Mat mtx(img,0); // convert IplImage* -> Mat;

访问Mat的数据元素:

View Code
Mat M; M.row(3) = M.row(3) + M.row(5) * 3;  Mat M1 = M.col(1); M.col(7).copyTo(M1);  Mat M; M.at<double>(i,j);  M.at(uchar)(i,j);  Vec3i bgr1 = M.at(Vec3b)(i,j)  Vec3s bgr2 = M.at(Vec3s)(i,j)  Vec3w bgr3 = M.at(Vec3w)(i,j)  double sum = 0.0ffor(int row = 0; row < M.rows; row++) { const double * Mi = M.ptr<double>(row);  for (int col = 0; col < M.cols; col++)  sum += std::max(Mi[j], 0.); } double sum=0; MatConstIterator<double> it = M.begin<double>(), it_end = M.end<double>(); for            
          
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自IplImage, CvMat, Mat 的关系和相互转换

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]