计算机视觉全系列实战教程:(六)opencv的Core模块基本介绍

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)特殊矩阵

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)矩阵的遍历

  • A. 指针数组方式
uchar *pData = (uchar*)imSrc.data;`在这里插入代码片`
for(int i=0;i<imSrc.rows; ++i)
{
	for(int j=0;j<imSrc.cols*imSrc.channels();++j)
	{
		std::cout<<(int)pData[j]<<std::endl;
	}
}
  • 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.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); //矩形的缩放
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。下面是一个简要的OpenCV计算机视觉基础教程: 1. 安装OpenCV:首先,你需要下载并安装OpenCV库。你可以从OpenCV官方网站上找到适合你操作系统的安装包,并按照官方文档中的指导进行安装。 2. 图像读取和显示:使用OpenCV可以轻松地读取和显示图像。你可以使用`cv2.imread()`函数读取图像文件,并使用`cv2.imshow()`函数显示图像。 3. 图像处理:OpenCV提供了许多图像处理函数,例如调整图像大小、改变图像亮度和对比度、图像平滑、边缘检测等。你可以根据需要选择适当的函数来处理图像。 4. 特征提取:在计算机视觉中,特征提取是一个重要的步骤。OpenCV提供了各种特征提取算法,如Harris角点检测、SIFT、SURF、ORB等。这些算法可以帮助你在图像中找到感兴趣的特征点。 5. 目标检测:OpenCV还提供了一些目标检测算法,如Haar级联检测器、HOG+SVM等。这些算法可以用于在图像或视频中检测出特定的目标物体。 6. 图像分割:图像分割是将图像划分为不同的区域或对象的过程。OpenCV提供了一些图像分割算法,如基于阈值的分割、基于边缘的分割、基于区域的分割等。 7. 机器学习与深度学习:OpenCV还集成了一些机器学习和深度学习的功能,如支持向量机(SVM)、神经网络等。你可以使用这些功能来进行图像分类、目标识别等任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值