OpenCV知识点

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的矩阵
  • 枚举法赋值

    • 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)`暂停执行,避免关闭过快

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值