Opencv4快速入门笔记
opencv4
一、数据载入显示和储存
1.Mat类
cv::Mat a(640,480,CN_8UC3); //640*480 3通道
cv::Mat a(Size(480,640),CV_8UC1);
Mat m = a.clone();//克隆
Mat b = (a,Range(2,5),Range(3,5));//截取a中2-5行,3-5列
Mat b(2,2,CV_8UC3,Scalar(0,0,255));//构造时赋值
Mat a = Mat::eye(3,3,CV_8UC1)//构造单位矩阵
Mat::diag(...),Mat::ones(...),Mat::zeros(...);
2.Mat的加减乘除
3.Mat类元素读取
1)at方法
//uchar 表示八位无符号整数
int value = (int)a.at<uchar>(0,0);//单通道
Vec3b vc3 = b.at<Vec3b>(0,0);//三通道
2)指针ptr
uchar *ptr = b.ptr<uchar>(0);
3)迭代器
MatIterator_<uchar> it = a.begin<uchar>();
MatIterator_<uchar> it_end = a.end<uchar>();
4.图形读取和显示
1)imread()
2)namedWindow()
创建窗口,可赋予窗口部分属性
3)imshow()
5.视频加载和摄像头调用
string path = "Resources/video_test.mp4";
//VideoCapture cap(0)调用摄像头
VideoCapture cap(path);
Mat img;
while (1){cap.read(img);//namedWindow("image",WINDOW_FREERATIO);imshow("image",img);waitKey(10);
}
6.数据保存
imwrite()
VideoWriter()
FileStorage() open() write() 处理XML
二、图像基本操作
1.图像颜色空间
RGB 0-255
HSV 色度、饱和度、亮度
GRAY 灰度
YUV、Lab
1)cvtcolor()
COLOR_BGR2GRAY
COLOR_BGR2HSV
...
2)convertTo() 类型转换
2.多通道分离和合并
####split()、merge()
3.图像像素操作处理
1)minMaxLoc() 寻找图像像素最大最小值
2)meanStdDev() 计算图像平均值和标准差
3)两图像间操作
max() min() 分别比较两幅图像中每一个元素灰度值的大小,保留较大〈较小〉的灰度值
逻辑运算
4.图像二值化
"非黑即白"图像像素灰度值无论在什么数据类型中都只有最大值和最小值两种取值,因此称为二值图像.
threshold(src,dst,thresh,maxval,type)
thresh 为阈值,maxval为最大值
adaptiveThreshold()
5.LUT
显示查找表(LUT).简单来说.LUT就是一个像素灰度值的映射表。
6.图像变换
1)图像连接
vconcat() 上下连接
hconcat() 左右连接
2)risize() 尺寸变换
3)flip() 图像翻转变换
4)图像仿射变换
在 OpenCV 中并没有专门图像旋转的函数,而是通过图像的仿射变换实现图像的旋转。实现图像的旋转,首先需要确定旋转角度和旋转中心,之后确定旋转矩阵,最终通过仿射变换实现图像旋转
1.getRotationMatrix2D()
2.warpAffine()
3.getAffineTransform()
仿射变换又叫三点变换,可利用3个对应像素点来确定变换矩阵 M M M的函数
5)图像透视变换
透射变换又叫四点变换
1.getPerspectiveTransform()
2.warpPerspective()
应用:将相机视线不垂直于二维码平面拍摄的图像经过透视变换成相机视线垂直于二维码平面
6)warpPolar() 极坐标变换
7.绘制几何图形
circle() line() ellipse() 椭圆
矩形 rectangle()
Rect变量,储存左上角像素坐标,矩形长宽
fillPoly() 生成矩形
文字生成 putText()
8.感兴趣区域(ROI)
Rect Range() 深浅拷贝与copyTo()
Mat img = imread("test.png");
img2 = img;//浅拷贝
//深拷贝两种方式
img.copyTo(img_copy2);
copyTo(img,img_copy,img);
Rect rect (206,206,200,200);//定义ROI
ROI1 = img(rect);//截图
ROI2 = img(Range(300,500),Range(300,500));//第二种截图方式
img(range(300,500),range(300,500)).copyTo(ROI2_copy);//深拷贝
9.图像“金字塔”
多种分辨率表示图像,分辨率逐渐降低、变大
1)高斯金字塔
pyrDown()
2)拉普拉斯金字塔
pyrUp()
10.窗口交互操作
1)图像窗口滑动条
createTrackbar()
2)鼠标响应
setMouseCallback()
三、图像直方图与模板匹配
图像直方图就是统计图像中每个灰度值的个数,之后将图像灰度值作为横轴,以灰度值个数或者灰度值所占比率作为纵轴绘制的统计图.
在通常情况下 像素灰度值代表亮暗程度,因此
通过图像直方图可以分析图像亮暗对比度并调整图像的亮暗程度
1.图像直方图绘制
1)calcHist() 建议统计单通道
绘制直方图 通过不断绘制矩形的方式实现直方图的绘制,由于图像中部分灰度值像素数目较多,因此将每个灰度值数目缩小。
Mat hist;//存放直方图计算结果
const int channels[1] = { 0 }//通道索引
float inRanges[2] = {0,255};
const float *ranges[1] = {inRanges};//像素灰度值范围
const int bins[1] = {256};//直方图维度,其实就是像素灰度值最大值
calcHist(&gray,1,channels,Mat(),hist,1,bins,ranges);
...//绘制过程
2.直方图操作
1)直方图归一化
normalize()
2)直方图比较
compareHist() 比较直方图相似程度
3.直方图应用
调整直方图分布提高图像对比度
利用直方图反向投影寻找相同区域
将图像的对比度调整为指定的形式
1)直方图均衡化
通过映射关系,将图像中的灰度值范围扩大,增加原来两个灰度值之间的差值,提高图像的对比度,进而将图像中的纹理凸显出来
equalizeHist(src,dst)
用于单通道灰度图
2)直方图匹配
映射成指定分布形式,可凸显某一部分
一般来说n映射为r,V表示个灰度级的积累概率
满足 n , r = a r g m i n ∣ V 原 ( n ) − V 匹 ( r ) ∣ n,r = argmin|V_原(n) - V_匹(r)| n,r=argmin∣V原(n)−V匹(r)∣
3)直方图反向投影
首先计算某一特征的直方图模型,然后使用该模型去寻找图像中是否存在该特征
calcBackProject()
4.图像的模板匹配
滑动窗口比较像素灰度值
matchTemplate()
四、图像滤波
1.图像卷积
如果卷积模板选取不当,那么极有可能造成卷积结果超过数据范围的情况发生,因此,图像卷积操作常通过缩放使得所有数值的和为1
filter2D()
2.噪声的种类与生成
1)椒盐噪声(脉冲噪声)
随机改变图像中的像素值
int a = cvflann::rand()
2)高斯噪声
噪声分布的概率密度函数服从高斯分布(正态分布)
fill(),RNG::fill()
3.线性滤波
1)均值滤波
blur() 滤波器的尺寸越大,滤波后图像越模糊
2)方框滤波
boxFilter() 与blur类似,可以选择输出图像的数据类型及是否进行归一化操作
sqrBoxFilter()
3)高斯滤波 GaussianBlur()
getGaussianKernel()
4)可分离滤波 sepFilter2D()
4.非线性滤波
非线性滤波可能包含排序,逻辑计算,可能通过逻辑判断将噪声过滤掉
线性滤波中噪声不会被消除,而是以更柔和的形式存在
1)中值滤波 medianBlur()
中值滤波就是用滤波器范围内所有像素值的中值来替代滤波器中心位置像索值的滤波方法 基于排序统计原理
2)双边滤波 bilateralFilter()
保留图像边缘信息 运行时间长,需要合理选择效果 “美颜”效果
5.图像的边缘检测
1)原理
像素灰度值突然变化的区域
变化趋势可用导数描述
filter2D()
convertScaleAbs() 计算矩阵中所有数据绝对值
2)Sobel算子 Sobel()
3)Scharr算子 Scharr() 对较弱边缘提取效果差
4)生成边缘检测滤波器 myGetDerivKernels()
5)Laplacian() 有各方向性的特点(X,Y)
6)Canny算法 不易受噪声影响,能识别图像中弱边缘和强边缘 十分优越
先要高斯模糊
五、图像形态学操作
1.像素距离与连通域
1)图像像素距离变换
2)图像连通域分析
车牌识别、文字识别、目标检测等领域对roi的分割与识别
邻域 4-邻域 8-邻域
2.腐蚀和膨胀
腐蚀清除面积较小的连通域
1)腐蚀 erode()
getStructingElement()
2)膨胀 dilate()
3.形态学应用
腐蚀可去除细小噪声区域,但会将图像主要区域的面积缩小,造成主要区域的形状发生改变
膨胀可以扩充每一个区域的面积,填充较小的空洞,但会增加噪声的面积
主要函数:morphologyEx()
1)开运算:腐蚀后膨胀
消除较小连通域,保留较大连通域,在两个物体的纤细连接处分离
2)闭运算:膨胀后腐蚀
去除连通域内小型空洞,平滑物体轮廓,连接两个临近的连通域
3)形态学梯度
4)顶帽运算:原图像与开运算结果之间的差值
往往用来分离比邻近点亮一些的斑块
5)黑帽运算
往往用来分离比邻近点暗一些的斑块
6)击中击不中变换
7)图像细化 thinning()
主要应用于线条形状组成的物体,常用于文字识别
六、目标检测
1.形状检测
1)霍夫变换
B站看原理解释 将x-y直线用垂直于他的r-θ直线 r-θ曲线交点
HoughLines()
HoughLinesP() 可以进一步确定直线位置
HoughLinesPointSet() 在二维点集中寻找直线
2)直线拟合 fitLine()
最小二乘法
3)圆形检测
霍夫变换 HoughCircles()
2.轮廓检测
1)轮廓发现与绘制
轮廓层级关系
四个参数表示 同层下一个,同层上一个,子层第一个,父层
没有的用-1表示
findContors() 在二值图像中检测图像所有轮廓并生成不同轮廓结构关系
drawContours()
2)轮廓面积,周长
contourArea(),arcLength()
3)轮廓外接多边形
boundingRect() 最大外接矩形
minAreaRect() 最小外接矩形
approxPolyDP() 用于寻找逼近轮廓的多边形
4)点到轮廓距离 pointPolygonTest()
5)凸包检测
3.矩的计算
1)几何矩与中心矩
2)Hu矩与基于Hu矩的轮廓匹配
4.点集拟合
minEnclosingTriangle() minEnclosingCircle()
QR二维码检测
定位 detect() 解码 decode()
detectAndDecode()
七、图像分析与修复
1.傅里叶变换
1)离散傅里叶变换
2)傅里叶变换进行卷积
将两个矩阵的卷积转换成两个矩阵傅里叶变换结果的乘积
极大提高卷积的计算速度
mulSpectrums() 计算两个复数矩阵的乘积
3)离散余弦变换 dct() idct()
2.积分图像
快速计算图像某些区域像素的平均灰度
3.图像分割
将图像中属于某一类的像素点与其他像素点分开
1)漫水填充法
floodFill() 局部分割
2)分水岭法
全局分割 watershed()
3)Grabcut法
grabCut()
4)Mean-Shift法
输出 颜色渐变,纹理平缓
pyrMeanShiftFiltering()
4.图像修复
图像修复技术就是利用图像中损坏区域边缘的像素,根据像素值的大小以及像素间的结构关系,估计出损坏区域可能的像素排列。
inpaint() 对较少污染进行修复
八、特征点检测与匹配
1.角点检测
角点:图像中某些属性突出的像素点
1)显示关键点
通常可以理解为特征点是关键点与描述子的组合
drawKeypoints() 一次性绘制所有关键点
KeyPoint类
2)Harris角点检测
3)Shi-Tomas角点检测
4)亚像素级别角点检测
2.特征点检测
1)关键点
Features2D虚类
类中定义了关键点检测函数,描述子计算函数,描述子类数据类型及读写操作等函数
detect()
2)描述子
compute() detectAndCompute()
3)SIFT特征点检测
计算速度较慢,无法应用于实时的系统中
4)SURF特征点检测
5)ORB特征点检测
更快
3.特征点匹配
在两个图像中寻找具有相似描述子的两个特征点
两类,1.计算两个描述子之间的欧氏距离 SIFT SURF
2.计算两个描述子之间的汉明距离 ORB BRISK
相机移动导致成像视场发生改变,同一个物体会出现在图像中的不同位置
特征点匹配可以快速定位物体在新图像中的位置
1)DescriptorMatcher类
2)暴力匹配
计算训练描述字迹合中每个描述子与查询描述子之间的距离,之后将所有距离排序,选择距离最小或者距离满足阈值要求的描述子作为匹配结果
BFMatcher()
3)显示特征点匹配结果 drawmathces()
4)FLANN匹配 FlannBasedMatcher()
5)RANSAC优化特征点匹配
提高特征点匹配精度
九、立体视觉
1.单目视觉
1)单目相机模型
像素坐标系 图像坐标系
小孔成像+凸透镜 畸变
齐次坐标 非齐次坐标
2)标定板角点提取
3)单目相机标定
4)单目相机校正
5)单目投影
6)单目位姿估计
只要知道世界坐标系中 个点的三维坐标和对应图像中的坐标,根据相机内参
矩阵和畸变系数就可以解算世界坐标系与相机坐标系之间的转换关系.
2.双目视觉
获得空间点的深度信息
1)双目相机模型
2)双目相机标定
3)双目相机校正
十、视频分析
1.差值法检测移动物体
通常转换成灰度图像再计算差值,减少复杂性
易受到光照、噪声等干扰的影响---->通过二值化、开闭运算等操作减少影响
absdiff()
2.均值迁移法目标跟踪
1) meanShift()
鼠标选取目标区域 selectROI()
2)自适应均值迁移法
根据目标的状态更改目标区域的大小
CamShift()
3.光流法目标跟踪
1)Farneback多项式扩展算法
处理慢,难以实时跟踪
2)基于LK稀疏光流法的跟踪
相关文章:
Opencv4快速入门笔记
opencv4 一、数据载入显示和储存 1.Mat类 cv::Mat a(640,480,CN_8UC3); //640*480 3通道 cv::Mat a(Size(480,640),CV_8UC1); Mat m a.clone();//克隆 Mat b (a,Range(2,5),Range(3,5));//截取a中2-5行,3-5列 Mat b(2,2,CV_8UC3,Scalar(0,0,255));//构造时赋值…...
three.js 点按钮,相机飞行靠近观察设备
效果: 点击按钮或直接点击模型都可以实现运动效果 代码: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…...
什么情况下物理服务器会运行出错?
物理服务器,也称为裸机服务器,一般可以提供高性能计算水平和巨大的存储容量。然而,它们也难免会遇到一些问题。运行出错时,可能会导致停机和数据丢失。在这篇文章中,介绍了常见的物理服务器在一些情况下显示出错…...
配置免费的SSL
1 引言 本文介绍了如何在 Linux 环境下使用免费的 Let’s Encrypt 为你的网站配置 SSL 证书的方法,以及如何在 Nginx 服务器中启用 SSL。对于需要在自己的网站上启用 HTTPS 的用户来说非常实用。 2 SSL 简介 SSL,全称为 Secure Sockets Layer…...
(2)(2.1) Andruav Android Cellular(一)
文章目录 前言 1 Andruav 是什么? 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App 前言 Andruav 是一个基于安卓的互联系统,它将安卓手机作为公司计算机,为你的无人机和遥控车增添先进功能。 1 Andruav 是什么ÿ…...
[GN] Vue3.2 快速上手 ---- 核心语法(终章)_3
文章目录 路由器工作模式命名路由to的三种写法嵌套路由路由传参query参数params参数 路由的props配置replace 和 push编程式导航重定向 总结 路由器工作模式 history模式 优点:URL更加美观,不带有#,更接近传统的网站URL。 缺点:后…...
在k8s上部署ClickHouse
概述 clickhouse的容器化部署,已经有非常成熟的生态了。在一些互联网大厂也已经得到了大规模的应用。 clickhouse作为一款数据库,其容器化的主要难点在于它是有状态的服务,因此,我们需要配置PVC。 目前业界比较流行的部署方式有…...
快速入门:使用 Gemini Embeddings 和 Elasticsearch 进行向量搜索
Gemini 是 Google DeepMind 开发的多模态大语言模型家族,作为 LaMDA 和 PaLM 2 的后继者。由 Gemini Ultra、Gemini Pro 和 Gemini Nano 组成,于 2023 年 12 月 6 日发布,定位为 OpenAI 的竞争者 GPT-4。 本教程演示如何使用 Gemini API 创建…...
【网络安全】-入门版
secure 一、基本工具1、metasploit framework ps.本着兴趣爱好,加强电脑的安全防护能力,并严格遵守法律和道德规范。一、基本工具 1、metasploit framework msf(metasploit framework)是一个开源的渗透测试框架,用于…...
Elasticsearch各种高级文档操作3
本文来记录几种Elasticsearch的文档操作 文章目录 初始化文档数据聚合查询文档概述对某个字段取最大值 max 示例对某个字段取最小值 min 示例对某个字段求和 sum 示例对某个字段取平均值 avg 示例对某个字段的值进行去重之后再取总数 示例 State 聚合查询文档概述操作实例 桶聚…...
【算法题】66. 加一
题目 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入:…...
查看服务器资源使用情况
查看服务器资源使用情况 一、top命令二、理解IOPS三、腾讯云机器cvm四、iotop五、atop六、查看内存使用情况一、top命令 "top"命令是一个Linux系统的实用工具,用于动态监视系统的运行状态。它会实时显示系统中正在运行的进程列表,并按照CPU使用率、内存使用率等指…...
锐浪报表 Grid++Report 明细表格标题重复打印
一、问题提出 锐浪报表 GridReport,打印表格时,对于明细表格的标题,打开换页时,需要重复打印明细表格的标题,或取消打印明细表格的标题。见下表: 首页: 后续页:(无明细表…...
编程笔记 html5cssjs 048 CSS链接
编程笔记 html5&css&js 048 CSS链接 一、设置链接样式二、文本装饰三、背景色四、链接按钮五、练习小结 通过 CSS,可以用不同的方式设置链接的样式。 一、设置链接样式 链接可以使用任何 CSS 属性(例如 color、font-family、background 等&…...
Spring DI
目录 什么是依赖注入 属性注入 构造函数注入 Setter 注入 依赖注入的优势 什么是依赖注入 依赖注入是一种设计模式,它通过外部实体(通常是容器)来注入一个对象的依赖关系,而不是在对象内部创建这些依赖关系。这种方式使得对象…...
CorelDRAW Graphics Suite2024专业图形设计软件Mac/Windows版
以激情为创造动力,以目的为设计导向。“对专业的图形设计人士来说,CorelDRAW 是市面上最易于使用的软件。 我用它设计过标牌、横幅、T 恤,甚至 45 英尺长的房车图形!” 使用 CorelDRAW 全新的聚焦模式,现在可以单独编…...
如何本地部署虚拟数字克隆人 SadTalker
环境: Win10 SadTalker 问题描述: 如何本地部署虚拟数字克隆人 SadTalker 解决方案: SadTalker:学习逼真的3D运动系数,用于风格化的音频驱动的单图像说话人脸动画 单张人像图像🙎 ♂️音频dz…...
电容充电时间的计算
电容充电时间的计算公式有两种。一种用于已知V0,Vu,Vt,R和C的情况,另一种用于已知E,R和C的情况。 当已知V0,Vu,Vt,R和C时: 设 V0 为电容上的初始电压值设 Vu 为电容充满…...
MicroPython核心(1):源码获取、编译构建
本文介绍了MicroPython在主要平台进行构建的基本方法,包括如何进行版本控制、获取和构建移植的源代码、构建文档、运行测试,以及MicroPython代码库的目录结构。 使用git进行源码管理 MicroPython托管在GitHub上,并使用Git进行源码管理。在进…...
pyspark之Structured Streaming file文件案例1
# generate_file.py # 生成数据 生成500个文件,每个文件1000条数据 # 生成数据格式:eventtime name province action ()时间 用户名 省份 动作) import os import time import shutil import time FIRST_NAME [Zhao, Qian, Sun, Li, Zhou, Wu, Zheng, Wang] SEC…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
