OpenCV基础知识点(C++)
OpenCV环境配置:
-
每个项目需要单独配置
-
添加包含目录
点击VC++目录 -> 点击包含目录 -> 点击右边向下的小箭头
-> 点击<编辑…>
文件路径为:D:\software\OpenCV\opencv\opencv\build\include
-
添加库目录
操作一样,只是路径不同.
opencv -> build -> x64 -> vc15 -> lib
文件路径为:D:\software\OpenCV\opencv\opencv\build\x64\vc16\lib
-
添加附加依赖项
点击链接器 -> 点击输入 -> 附加依赖项
文件名为:opencv_world470d.lib
全部弄完该项目就可以正常启动了
Mat类介绍
什么是Mat类
- OpenCV里用于存储矩阵数据的类型
- 与int、double等相同
内容Mat能存储的数据
Mat能存储的数据
Tp:用户自定义的类型
Mat类的创建
-
利用矩阵宽、高和类型参数创建Mat类
Mat() cv::Mat::Mat(int rows,//行数 int cols,//列数 int type//矩阵中存储的数据类型。此处除了CV_8UC1(单通道)、CV_64FC4(四通道)等从1到4通道以外,还提供了更多通道的参数,通过CV_8UC(n)中的n来构建多通道矩阵,其中n最大可以取到512. )
-
利用矩阵Size()结构和数据类型参数创建Mat类
Mat() cv::Mat:Mat(Size size,//size:2D数组变量尺寸,通过Size(cols , rows)进行赋值。 int type//与前面一致 )
-
利用已有Mat类创建新的Mat类
Mat() cv::Mat::Mat(const Mat& m,//m:已经创建完成的Mat类矩阵数据 const Range & rowRange,//wRange:在已有矩阵中需要截取的行数范围,是一个Range变量,例如从第二行到第五行可以表示为Range(2,5)。 const Range & colRange = Range::all()//colRange:在已有矩阵中需要截取的列数范围,是一个Range变量,例如从第2列到第5列可以表示为Range(2,5),当不输入任何值时表示所有列都会被截取 )
注:要求原有的Mat类里面是有数据的,这样创建的新Mat类才是有意义的
Mat类的赋值
OpenCV常用头文件:opencv2/opencv.hpp
OpenCV的命名空间为cv
-
创建时赋值
Mat() cv::Mat::Mat(int rows,//行数 int cols,//列数 int type,//存储数据的类型 const Scalar & s//给矩阵中的每个像素赋值的参数变量,例如:Scalar(0,0,255) )
-
类方法赋值
- eye:单位矩阵,例如
a=Mat::eye(3,3,type)
- diag:对角矩阵
- ones:元素全为1的矩阵
- zeros:元素全为0的矩阵
- eye:单位矩阵,例如
-
枚举法赋值
-
cv::Mat a = (cv::Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
-
cv::Mat b = (cv::Mat_<double>(2,3)<<1.0,2.1,3.2,4.0,5.1,6.2);
注:“<>”里面的内容是c语言里面的类型,而不是cv-8u类型
-
Mat类元素的读取
Mat数据在内存中存放形式
3x3的三通道元素在计算机中存储应是3x9的形式
Mat类矩阵的常用属性
属性 | 作用 |
---|---|
cols | 矩阵的列数(以像素为单位) |
rows | 矩阵的行数 |
step | 以字节为单位的矩阵的有效宽度 |
elemSize() | 每个元素的字节数 |
total() | 矩阵中元素的个数 |
channels() | 矩阵的通道数 |
Mat元素的读取
-
at方法读取Mat矩阵元素
at(int row,int col)
-
单通道
int value = (int)a.at<uchar>(0,0);
- 要先知道at类中存储的数据类型at<数据类型>(0,0)地址
-
多通道
cv::Vec3b vc3 = b.at<cv::Vec3b>(0,0);
int first = (int)vc3.val[0];
- vec3b:三个通道的uchar类型
- vec2b:两个通道的uchar类型
- vec3d:三个通道的double类型
- vec4i:四个通道的int类型
-
-
矩阵元素地址定位方式访问元素
- 单通道
(int)(*(b.data + b.step[0] * row + b.step[1] * col + channel));
- 比较直观
- 不用考虑数据类型
- 单通道
Mat类支持的运算
四则运算
-
运算符号
直接利用符号运算:加减乘除取余
注:要保证两个Mat类的尺寸和存储的数据量一样
-
两个矩阵相乘
注:.mul()
不仅要求两个矩阵维度相同而且两个矩阵内存储的数据类型相同
提供的运算函数
函数名 | 作用 |
---|---|
absdiff() | 两个矩阵对应元素差的绝对值 |
add() | 两个矩阵求和 |
addWeighted() | 两个矩阵线性求和 |
divide() | 矩阵除法 |
invert() | 矩阵求逆 |
log() | 矩阵求对数 |
max()/min() | 两个矩阵计算最大值/最小值 |
图像加载与显示
图像加载(读取)
imread()
Mat cv::imread(const String & filename,int flags = IMREAD_COLOR)
- filename:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名(图片路径是反斜杠)
- flags:读取图像形式的标志(官网查询详细参数)
图像显示
nameWindow()
void cv::namedWindow(const String & Winname,int flags = WINDOW_AUTOSIZE)
- winnname:窗口名称,用作窗口的标识符
- flags:窗口属性设置标志
imshow()
void cv::imshow ( const String & winname,InputArray mat)
- winname:要显示图像的窗口名字,用字符串形式赋值
- mat:要显示的图像矩阵
图像保存
imwrite()
bool cv::imwrite(const String & filename,
InputArray img,
const std::vecter<int> & patams = std::vecter<int>()
)
- filename:保存图像的地址和文件名,包含图像格式
- img:将要保存的Mat类矩阵变量
- params:保存图片格式属性设置标志
waitKey(0)
暂停执行,避免关闭过快
InputArray img,
const std::vecter & patams = std::vecter()
)
- filename:保存图像的地址和文件名,包含图像格式
- img:将要保存的Mat类矩阵变量
- params:保存图片格式属性设置标志
`waitKey(0)`暂停执行,避免关闭过快