OpenCV进阶一:常用数据类型


这篇笔记有两个目的。
一,作为练习,达到熟练使用常用的基本类型操作,尤其是Mat;
二,不常用的类型混个脸熟,以后用到的时候知道怎么快速掌握其用法,而且不至于一问三不知。

1. cv::Mat

cv::Mat是OpenCV的基础类型,很多操作与STL相似。动态管理内存,逐行存储。
该类包含两部分数据,即:

矩阵头像素数据指针
大小、存储方式、存储地址指向图像数据

1.1 使用

cv::Mat共有21种构造方法。分为两类,一类是常用的数据构造,另一类是模板构造。

常用构造
  1. 创建空矩阵
cv::Mat img;//img是一个空矩阵
  1. 创建一个特定大小的矩阵
cv::Mat (rows,  cols,  type)

type参考:

Mat_<uchar>Mat_<char>Mat_<short>Mat_<ushort>Mat_<int>Mat_<float>Mat_<double>
CV_8UCV_8SCV_16SCV_16UCV_32SCV_32FCV_64F

type后加通道数,比如:
CV_8UC3表示图像每一位的数据类型为8位无符号char类型,图像通道数为3。
type可以由宏生成:

cv::CV_MAKE_TYPE(CV_8U, 3, dataptr)
  1. 创建大小为Size类型的矩阵
Mat img(Size(320,240), CV_8UC3);//创建宽320,高240的3通道图像矩阵
  1. 创建矩阵并初始化
    创建一个宽320,高240的图像矩阵,并将每个元素初始化为(255, 0, 0)
cv::Mat(240, 320, CV_8UC3,  cv::Scalar(255, 0, 0))
  1. 和4一样
cv::Mat(Size(320,240), CV_8UC3,  cv::Scalar(255, 0, 0))
  1. 创建多维矩阵
int sizes[] = {3, 3}
cv::Mat(2, sizes, CV_64FC1);//创建一个二维3*3矩阵,即每个像素上存储3*3的矩阵
cv::Mat(1, sizes, CV_64FC1);//创建一个一维3*1矩阵,即每个像素上存储3*1的矩阵,等同于三通道图像
  1. 创建多维矩阵并初始化
int sizes[] = {3, 3}
cv::Mat(2, sizes, CV_64FC1, Scalar(1));
cv::Mat(1, sizes, CV_64FC1, Scalar(1));
  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();//
  1. Rec
  cv::Mat D(A, Rect(10,10,100,100));//用A的Rect部分初始化D
  1. Range
 cv::Mat E(A, Range(1,3), Range::all());//用A的第1到3行初始化E,第三个缺省情况下为all
  1. Range数组
cv::Range* range;
 cv::Mat E(A, range);
  1. 指针1
cv::Mat  img(240, 320, CV_8U3C1, *data,  step =AUTO_STEP) //用指针数据初始化矩阵,并制定步长
  1. 指针2
cv::Mat  img(1, sizes, CV_8U3C1, *data,  const size_t steps = 0) //用指针数据初始化矩阵,并制定步长
  1. 指针3
cv::Mat  img(cv::Size(320, 240), CV_8U3C1, *data,  const size_t steps = AUTO_STEP) //用指针数据初始化矩阵,并制定步长
模板构造
  1. 使用vector容器
std::vector<Point3f> vec;
cv::Mat img(vec, bool copyData = false)
  1. 使用cv::Vec
  2. 使用cv::Matx
  3. 使用cv::Point_
  4. 使用cv::Point3_
  5. 使用cv::MatCommaInitializer_
  6. 使用cuda::GpuMat

1.2 派生类

由cv::Mat派生出的类有:

cv::Mat_<_Tp>
cv::Mat_<double>
cv::Mat_<float>
cv::Mat_<uchar>
cv::Mat_<unsigned char>

2. cv::Matx和cv::Vec

3. cv::Rect、cv::RotatedRect和cv::RotatedRect

5. cv::Scalar

6. cv::Point

7. cv::Size

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值