OpenCV基础篇之Mat数据结构程序及分析/* * FileName : MatObj.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Thu 15 May 2014 09:12:45 PM CST * Brief : * * Copyright (C) MICL,USTB */ #include <cv.h> #include <highgui.h> #include <iostream>using namespace std; using namespace cv;int main(void) { /* * Create Mat */ Mat M(2,2,CV_8UC3, Scalar(0,0,255)); cout << "M=" << endl << " " << M << endl << endl; /* * Matlab style */ Mat E = Mat::eye(4,4,CV_64F); cout << "E=" << endl << " " << E << endl << endl; E = Mat::ones(4,4,CV_64F); cout << "E=" << endl << " " << E << endl << endl; E = Mat::zeros(4,4,CV_64F); cout << "E=" << endl << " " << E << endl << endl; /* * Convert IplImage to Mat */ IplImage *img = cvLoadImage("../test_imgs/Lena.jpg"); Mat L(img); namedWindow("Lena.jpg", CV_WINDOW_AUTOSIZE); imshow("Lena.jpg", L); waitKey(0); /* * Init Mat with separated data */ Mat C = (Mat_<int>(3,3) << 0,1,2,3,4,5,6,7,8); cout << "C=" << endl << " " << C << endl << endl; return 0; } 1. Mat是OpenCV最基本的数据结构,Mat即矩阵(Matrix)的缩写,Mat数据结构主要包含2部分:Header和Pointer。Header中主要包含矩阵的大小,存储方式,存储地址等信息;Pointer中存储指向像素值的指针。我们在读取图片的时候就是将图片定义为Mat类型,其重载的构造函数一大堆, class CV_EXPORTS Mat { public: //! default constructor Mat(); //! constructs 2D matrix of the specified size and type // (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.) Mat(int _rows, int _cols, int _type); Mat(Size _size, int _type); //! constucts 2D matrix and fills it with the specified value _s. Mat(int _rows, int _cols, int _type, const Scalar& _s); Mat(Size _size, int _type, const Scalar& _s); //! constructs n-dimensional matrix Mat(int _ndims, const int* _sizes, int _type); Mat(int _ndims, const int* _sizes, int _type, const Scalar& _s); //! copy constructor Mat(const Mat& m); //! constructor for matrix headers pointing to user-allocated data Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP); Mat(Size _size, int _type, void* _data, size_t _step=AUTO_STEP); Mat(int _ndims, const int* _sizes, int _type, void* _data, const size_t* _steps=0); //! creates a matrix header for a part of the bigger matrix Mat(const Mat& m, const Range& rowRange, const Range& colRange=Range::all()); Mat(const Mat& m, const Rect& roi); Mat(const Mat& m, const Range* ranges); //! converts old-style CvMat to the new matrix; the data is not copied by default Mat(const CvMat* m, bool copyData=false); //! converts old-style CvMatND to the new matrix; the data is not copied by default Mat(const CvMatND* m, bool copyData=false); //! converts old-style IplImage to the new matrix; the data is not copied by default Mat(const IplImage* img, bool copyData=false); ...... } 要了解如何初始化Mat结构,就应该了解它的构造函数,比如程序中的第一初始化方式调用额就是 Mat(int _rows, int _cols, int _type, const Scalar& _s); 这个构造函数。IplImage*是C语言操作OpenCV的数据结构,在当时C操纵OpenCV的时候,地位等同于Mat,OpenCV为其提供了一个接口,很方便的直接将IplImage转化为Mat,即使用构造函数 Mat(const IplImage* img, bool copyData=false); 上面程序中的第二种方法就是使用的这个构造函数。--------------------------------------分割线 --------------------------------------Ubuntu Linux下安装OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htmUbuntu 12.04 安装 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htmCentOS下OpenCV无法读取视频文件 http://www.linuxidc.com/Linux/2011-07/39295.htmUbuntu 12.04下安装OpenCV 2.4.5总结 http://www.linuxidc.com/Linux/2013-06/86704.htmUbuntu 10.04中安装OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm基于QT和OpenCV的人脸识别系统 http://www.linuxidc.com/Linux/2011-11/47806.htm--------------------------------------分割线 --------------------------------------2. 关于Mat数据复制:前面说过Mat包括头和数据指针,当使用Mat的构造函数初始化的时候,会将头和数据指针复制(注意:只是指针复制,指针指向的地址不会复制),若要将数据也复制,则必须使用copyTo或clone函数更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-08/105085p2.htm