【计算机视觉系列实战教程 (六)】:opencv的Core模块基本介绍(Mat的构造和赋值、图像像素点四种访问方式、Rect类的介绍等)

1、矩阵Mat操作

(1)Mat的构造函数

Mat(); //无参构造函数(默认)
Mat(int rows,int cols, int type); //指定形状
Mat(cv::Size size, int type);
Mat(int rows,int cols, int type, const Scalar&s); //指定像素值
Mat(cv::Size size, int type, const Scalar &s);
Mat(const Mat&m); //拷贝构造函数,共用同一份图像数据,不会进行深拷贝
Mat(int rows,int cols,int type, void *data, size_t step=AUTO_STEP);//使用指定的data作为该Mat对象的图像数据
Mat(const Mat& m,const Range& rRange,const Range& cRange); //创建的Mat对象共用m的一部分图像数据
Mat(const Mat& m,const Rect& rect); //创建的Mat对象共用m的一部分图像数据
Mat(int ndims,const int *sizes,int type,const Scalar& s);

(2)Mat的数据类型

CV_位数+数据类型+通道数

CV_8U == CV_8UC1; //8bits uchar 0-255, 1 channels
CV_16SC3; //16bits shart -32768-32767, 3 channels

(3)Mat的拷贝(深拷贝和浅拷贝)

注意Mat的深拷贝和浅拷贝

// 浅拷贝:
Mat imNew = Mat(imIn);
Mat imNew02 = imIn;
// 深拷贝:
Mat imNew = imIn.clone();
Mat imNew02;
imIn.copyTo(imNew02);

(4)Mat的赋值(四种赋值方式)

  • A. 直接赋值
Mat m = (Mat_<double>(3,3) << 1,2,3,4,5,6,7,8,9);
  • B. 使用数组赋值
int a[2][3] = {1,2,3,4,5,6};
Mat m1(2,3,CV_32S,a);
  • C. create函数随机赋值
cv::Mat imSrc;
imSrc.create(4,4,CV_8UC1); //对imSrc进行随机赋值
  • D. 设置矩阵新值
imSrc.setTo(255,mask);//将imSrc指定的掩膜区域设置为255(单通道),如果是双通道,应该使用cv::Scalar(255,255,255)

(5)特殊矩阵(0矩阵、1矩阵、单位矩阵)

Mat im01 = Mat::zeros(100,100,CV_8SC1); //全0矩阵
Mat im02 = Mat::ones(cv::Size(100,100),CV_16F); //全1矩阵
Mat eye = Mat::eye(cv::Size(3,3),CV_32F); //单位矩阵

(6)创建矩阵头

在opencv中,矩阵类Mat的数据结构 = 矩阵头 + 指向矩阵数据部分的指针。
矩阵头用于存储矩阵尺寸、存储方法、存储地址和引用次数等

以下成员函数用于创建新的矩阵头,并共享原矩阵的数据

cv::Mat row(int y); //该函数根据指定的行索引创建一个矩阵头
cv::Mat col(int x); //根据指定的列索引创建一个矩阵头
cv::Mat rowRange(int iStartRow, int iEndRow);
cv::Mat colRange(int iStartCol, int iEndCol);

(7)图像的遍历(指针、ptr、at、迭代器iterator)

  • A. 指针数组方式
uchar *pData = (uchar*)imSrc.data;
pData = pData + j*imSrc.step + i*imSrc.elemSize;
  • B. .ptr方式
// 单通道
uchar * data00 = imSrc.ptr<uchar>(0); //指向第一行的第一个元素
uchar * data01 = imSrc.ptr<uchar>(0)[1]; //指定第一行的第二个元素
// 多通道
cv::Vec3b *data00 = imSrc.ptr<cv::Vec3b>(0)[1];// 类似,只是type不一样
  • C. at方式
imSrc.at<cv::Vec3b>(i,j)[k]; // 第i行j列k通道的数值
  • D. 迭代器遍历方式
cv::MatConstIterator_<cv::Vec3b> iter = imSrc.begin<cv::Vec3b>();
cv::MatConstIterator_<cv::Vec3b> iterEnd = imSrc.end<cv::Vec3b>();
while(iter!=iterEnd){
	//TODO
	iter++;
}

2. 矩阵类Rect基本介绍

(1)构造函数(两种方式)

cv::Rect(int x, int y, int iwid, int ihgt); //x,y表示矩形的左上角坐标,iwid表示矩形的宽度,ihgt表示矩形的高度
cv::Rect(cv::Point PLftTop, cv::Point PRgtBtm); //PLeftTop表示矩形的左上点,PRgtBtm表示矩形的右下角点

(2)相关函数

Rect对象的面积、尺寸、左上角和右下角坐标、高度和宽度、是否包含某一位置等

rect.area();//返回rect的面积
rect.size();//rect的尺寸
rect.tl(); //rect左上角坐标
rect.br(); //rect右下角坐标
rect.width(); //rect的宽度
rect.height(); //rect的高度
rect.contains(cv::Point(x,y)); //rect是否包含点(x,y)

(3)矩形的交集和并集

cv::Rect rect = rect01 & rect01; //交集
cv::Rect rect = rect01 | rect02; //并集

(4)矩形的平移和缩放

cv::Rect rect = rect01 + cv::Point(-100,-100); //矩形平移
cv::Rect rect = rect01 + cv::Size(-100,-50); //矩形的缩放

3、总结

  • Mat相关操作:矩阵的构造、图像的数据类型、图像的拷贝、图像的4种赋值方式、特殊矩阵的介绍、图像像素的4种遍历方式
  • Rect类的相关介绍:构造Rect对象的两种方式、和Rect相关的几个函数、Rect的交集和并集、Rect的平移和缩放方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值