1. 安装opencv 教程 看这个大佬的链接 (实测有用)(操作简单)
链接: (1条消息) 【OpenCV】windows Qt环境搭建_logani的博客-CSDN博客
2. 使用opencv 的注意事项
1.首先要在工程文件 .pro 文件里面 加入路径,与引用的头文件 (根据自己的安装路径 来)
INCLUDEPATH +=D:\windows_opencv\opencv\opencv_3.4.2_Qt\include
LIBS +=D:\windows_opencv\opencv\opencv_3.4.2_Qt\x86\bin\libopencv_*.dll
2. 使用的时候,加上使用的命名空间
#include<opencv2/opencv.hpp>
using namespace cv;
3. 根据测试代码 , 基本了解opencv 在 QT 的使用
1. 注意:你把这段代码放在 可以运行的地方就行了, (构造函数里面)
2. 代码功能: 使用电脑摄像头, 进行每帧图像的抓拍, 使用opencv语句开辟一个opencv 窗口, 把摄像头抓拍的图像数据导入 图片, 对图片进行处理, 显示在 opencv的窗口里面.
VideoCapture cap(0);//从视屏设备中读取视频
if(!cap.isOpened())//判断摄像头,是否打开
{
qDebug()<<"cap not open !" << endl;//没有打开 有提示
}
Mat frame, edges; //Mat opencv中表示图片的类型
namedWindow("edges", WINDOW_AUTOSIZE);//namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,你无需取销毁它。
for(;;)//死循环
{
cap >> frame; //opertor>>方法利用函数重载提取单帧图像image,read方法的输入是Mat的引用,这种方式得到的实际是VideoCapture解析得到的单帧图像的引用,当后续再读取帧时,Mat数据将会自动释放,自动更新成新的数据信息。Mat复制构造函数和赋值操作共享数据空间,当需要同时获取多帧图像源时,可以利用Mat提供的Mat::clone()方法进行复制操作。
cvtColor(frame, edges, COLOR_BGR2GRAY); //opencv使用cvtColor()函数对图像进行色彩空间的转换。
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(30) >= 0) break;//按键就会退出
}
3.VideoCapture 语句 分析 (打开摄像头,或者打开视频获取其中的图像数据)
VideoCapture cap(0);//从视屏设备中读取视频
1. 原型:
VideoCapture::VideoCapture(); //打开视频文件或捕获设备或用于视频捕获的IP视频流
VideoCapture::VideoCapture(const string &filename); // 使用API首选项打开视频文件或捕获设备或IP视频流进行视频捕获
VideoCapture::VideoCapture(const String& filename, int apiPreference);//打开相机进行视频拍摄
VideoCapture::VideoCapture(int device);//要打开的视频捕获设备的 + id
2. 参数 解析
filename | 表示视频文件的路径及名称 |
device | 要打开的视频捕获设备的id。要使用默认后端打开默认相机,只需传递0。 |
apiPreference | 首选要使用的捕获API后端 |
3.功能
实际功能: 这个函数用来从本地文件或摄像头设备中读取视频。
4.测试语句的代码:
VideoCapture cap(0);//从视屏设备中读取视频
if(!cap.isOpened())//判断摄像头,是否打开
{
qDebug()<<"cap not open !" << endl;//没有打开 有提示
}
Mat frame, edges; //Mat opencv中表示图片的类型
namedWindow("edges", WINDOW_AUTOSIZE);//namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,你无需取销毁它。
for(;;)//死循环
{
cap >> frame; //opertor>>方法利用函数重载提取单帧图像image,read方法的输入是Mat的引用,这种方式得到的实际是VideoCapture解析得到的单帧图像的引用,当后续再读取帧时,Mat数据将会自动释放,自动更新成新的数据信息。Mat复制构造函数和赋值操作共享数据空间,当需要同时获取多帧图像源时,可以利用Mat提供的Mat::clone()方法进行复制操作。
imshow("edges", edges);
if(waitKey(30) >= 0) break;//按键就会退出
}
5.相关函数
函数 | 方法 |
VideoCapture::open | 打开视频文件或视频获取装置 |
VideoCapture::isOpened | 判断视频文件是否正确,返回true则正确 |
VideoCapture::release | 关闭视频流文件 |
VideoCapture::grab | 抓住下一帧的视频文件或捕获设备 |
VideoCapture::retrieve | 解码并返回了视频帧 |
VideoCapture::read | 抓住,解码并返回下一个视频帧 |
VideoCapture::get | 返回指定视频类的相关参数信息 |
VideoCapture::set | 设置类信息的一个属性 |
4.namedWindos 语句 (建立opencv 的窗口)
1.原型:
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
2.参数 解析
winname | 窗口标题 |
flags | 窗口的标志 |
flags:
-
WINDOW_AUTOSIZE会自动根据图像大小,显示窗口大小,不能人为改变窗口大小
-
WINDOW_NORMAL,跟QT集成的时候会使用,允许修改窗口大小。
3.功能
实际功能:namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,你无需取销毁它。
4. 测试代码
namedWindow("edges", WINDOW_AUTOSIZE);//namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,你无需取销毁它。
//后面的参数可以不要
5. cvtColor 语句 (图像转换)
1. 原型:
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
2. 参数解析:
src | 输入图像 |
dst | 输出与src大小和深度相同的图像 |
code | 颜色空间转换代码 |
dstCn | 目标图像中的信道数;如果参数为0 频道是从src和代码中自动导出的。 |
3.功能
实际功能:函数对图像进行色彩空间的转换。
6. GaussianBlur 语句 (高斯滤波)
1.函数原型:
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
2.参数解析:
src | 输入图像 |
dst | 输出图像 |
ksize | 高斯核大小 ksize.width和ksize.height可以不同,但两者必须相同 正和奇数。或者,它们可以是零,然后根据sigma计算。 |
sigmax | X方向上的高斯核标准偏差 |
sigmaY | Y方向上的高斯核标准偏差 |
borderType | 像素外推方法 (可以不写这个参数) |
3.功能:
实际功能: 这个函数用来对图像进行 高斯滤波 。
4.高斯滤波:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
7. Canny() 语句 (边缘检测)
1.函数原型
void Canny( InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize = 3, bool L2gradient = false );
2. 参数分析
image | 输入图像 |
edges | 输出边缘映射的图像 |
threshold1 | 滞后过程的第一阈值。 |
threshold2 | 滞后过程的第二阈值。 |
apertureSize | 运算符的孔径大小 (参数默认是3 ) |
L2gradient | 计算图像梯度幅度标志 (这个参数可以不要填) |
3. 功能:
Canny边缘检测算子是John.F.Canny与1986年开发出来的一个多级边缘检测算法;边缘检测是计算机视觉中一个非常古老的问题,它涉及到检测图像中的边缘来确定目标的边界,从而分离感兴趣的目标。最流行的边缘检测技术之一是Canny边缘检测。
8. imshow 语句 (显示函数)
1.函数原型
void imshow(const String& winname, const ogl::Texture2D& tex);
2. 参数解析
winname | 窗口的名称 (那个窗口) |
tex | 图片名称 (或者是数据名称) |
3. 功能:
实际功能:再某一个窗口显示一个 一张照片的数据。 (窗口加载图片)
4.测试程序
imshow("edges", edges);
9. imread 语句 (加载一个 绝对路径的图片,, 变成 opencv Mat 照片 )
1. 函数原型:
Mat imread( const String& filename, int flags = IMREAD_COLOR );
2. 参数:
filename | 要加载的文件的名称 (路径) |
flags | 表示加载的图像是什么类型,支持常见的三个参数值 |
flags:
3. 功能:
实际功能: 把电脑里面的 图片数据 转化为 opencv Mat 照片
4.测试语句
//创建一个Mat对象并在里面写入图片数据(图片即存储像素点的矩阵数组)
Mat src = imread("D://xixi.jpg"); //路径要改
5. 与opencv Mat图片相关的函数
一个链接 : (2条消息) Opencv Mat类常用构造函数和成员函数整理_Gargamel97的博客-CSDN博客_opencv mat构造函数
10. waitKey 语句 (不断刷新图像,等待键盘按下退出这个状态)
1. 函数原型:
int waitKey(int delay = 0);
2. 参数:
delay | delay延时时间 (一张图片图像刷新时间),单位ms; |
3. 功能:
waitKey函数功能是不断刷新图像,频率时间为delay,单位为ms;该函数通常用在显示图像函数之后。
4.返回值:
返回值:key -- 当前键盘按键值ASCII。(键盘按键与 ASCII 字符集对照表)