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…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...