文章目录
这篇笔记有两个目的。
一,作为练习,达到熟练使用常用的基本类型操作,尤其是Mat;
二,不常用的类型混个脸熟,以后用到的时候知道怎么快速掌握其用法,而且不至于一问三不知。
1. cv::Mat
cv::Mat是OpenCV的基础类型,很多操作与STL相似。动态管理内存,逐行存储。
该类包含两部分数据,即:
矩阵头 | 像素数据指针 |
---|---|
大小、存储方式、存储地址 | 指向图像数据 |
1.1 使用
cv::Mat共有21种构造方法。分为两类,一类是常用的数据构造,另一类是模板构造。
常用构造
- 创建空矩阵
cv::Mat img;//img是一个空矩阵
- 创建一个特定大小的矩阵
cv::Mat (rows, cols, type)
type参考:
Mat_<uchar> | Mat_<char> | Mat_<short> | Mat_<ushort> | Mat_<int> | Mat_<float> | Mat_<double> |
---|---|---|---|---|---|---|
CV_8U | CV_8S | CV_16S | CV_16U | CV_32S | CV_32F | CV_64F |
type后加通道数,比如:
CV_8UC3表示图像每一位的数据类型为8位无符号char类型,图像通道数为3。
type可以由宏生成:
cv::CV_MAKE_TYPE(CV_8U, 3, dataptr)
- 创建大小为Size类型的矩阵
Mat img(Size(320,240), CV_8UC3);//创建宽320,高240的3通道图像矩阵
- 创建矩阵并初始化
创建一个宽320,高240的图像矩阵,并将每个元素初始化为(255, 0, 0)
cv::Mat(240, 320, CV_8UC3, cv::Scalar(255, 0, 0))
- 和4一样
cv::Mat(Size(320,240), CV_8UC3, cv::Scalar(255, 0, 0))
- 创建多维矩阵
int sizes[] = {3, 3}
cv::Mat(2, sizes, CV_64FC1);//创建一个二维3*3矩阵,即每个像素上存储3*3的矩阵
cv::Mat(1, sizes, CV_64FC1);//创建一个一维3*1矩阵,即每个像素上存储3*1的矩阵,等同于三通道图像
- 创建多维矩阵并初始化
int sizes[] = {3, 3}
cv::Mat(2, sizes, CV_64FC1, Scalar(1));
cv::Mat(1, sizes, CV_64FC1, Scalar(1));
- 拷贝矩阵
cv::Mat img (240, 320, CV_8UC1, Scalar(255));
cv::Mat(img);//仅复制矩阵头
cv::Mat img1 = img;//仅复制矩阵头
cv::Mat img2;
img.CopyTo(img2);//为img2开辟新的内存空间
img2 = img.clone();//
- Rec
cv::Mat D(A, Rect(10,10,100,100));//用A的Rect部分初始化D
- Range
cv::Mat E(A, Range(1,3), Range::all());//用A的第1到3行初始化E,第三个缺省情况下为all
- Range数组
cv::Range* range;
cv::Mat E(A, range);
- 指针1
cv::Mat img(240, 320, CV_8U3C1, *data, step =AUTO_STEP) //用指针数据初始化矩阵,并制定步长
- 指针2
cv::Mat img(1, sizes, CV_8U3C1, *data, const size_t steps = 0) //用指针数据初始化矩阵,并制定步长
- 指针3
cv::Mat img(cv::Size(320, 240), CV_8U3C1, *data, const size_t steps = AUTO_STEP) //用指针数据初始化矩阵,并制定步长
模板构造
- 使用vector容器
std::vector<Point3f> vec;
cv::Mat img(vec, bool copyData = false)
- 使用cv::Vec
- 使用cv::Matx
- 使用cv::Point_
- 使用cv::Point3_
- 使用cv::MatCommaInitializer_
- 使用cuda::GpuMat
1.2 派生类
由cv::Mat派生出的类有:
cv::Mat_<_Tp>
cv::Mat_<double>
cv::Mat_<float>
cv::Mat_<uchar>
cv::Mat_<unsigned char>