图像处理中的梯度计算、边缘检测与凸包特征分析技术详解
前言
书接上文
OpenCV图像处理实战全解析:镜像、缩放、矫正、水印与降噪技术详解-CSDN博客文章浏览阅读1.1k次,点赞38次,收藏29次。本文系统解析OpenCV图像处理五大实战场景:镜像反转的三种坐标变换模式,图像缩放的尺寸控制与插值方法,透视变换的四点定位原理与三维投影消除,基于二值化模板的水印叠加技术,以及均值/高斯/中值滤波器的噪声消除机制。通过11个完整代码示例,详解关键参数设置与算法选择策略,涵盖flip、resize、warpPerspective、bitwise_and、GaussianBlur等核心函数应用,提供从基础操作到复杂形变矫正的全栈解决方案,为计算机视觉开发提供完备的技术参考。https://blog.csdn.net/qq_58364361/article/details/146971848?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
一、图像梯度处理
1.1 图像梯度
dx和dy是x和y的微分,趋向于无穷小,这是在连续的函数中求导的过程,可以认为这就是函数某一个点的梯度。
上面的连续的函数,但是实际中图像是离散的。如果图像也能微分,可以理解为图像的像素点无穷小,图像的分辨率无穷大。
理想情况下图像的数据组成也应该可以进行微分的,因此存在x轴和y轴的梯度,需要同时考虑两个方向
图像在计算机中是以离散的像素点分布的,因此使用的差分
1.2 边缘计算 Filter2D
梯度计算的目的是为了寻找图像的边缘,因此把寻找图像边缘的计算称为边缘计算,也是通过卷积核实现的,下面的是一个常用于边缘计算的卷积核:
上面的核用于提取图片的垂直边缘,下图是水平梯度的计算,来提取垂直边缘。
同理,改变卷积核形态,可以把图像的水平边缘提取,进行垂直梯度的计算:
可以看到相关参数如下:
ddepth 深度,-1表示保持原图的位深度(通常为8位无符号整型)
kernel 卷积核
可自定义核数值
edge_ex_method 边缘检测的方向
upright 垂直 level 水平
此参数在OpenCV函数接口中并不存在
import cv2
import numpy as npif __name__ == '__main__':path = "QiPan.jpg" # 图片文件路径img = cv2.imread(path) # 读取图片,返回BGR格式的numpy数组#构建卷积核kernel = np.array([[-1, 0, 1], # Sobel算子X方向卷积核[-2, 0, 2], # 用于边缘检测[-1, 0, 1]],dtype=np.float32 # 指定数据类型为32位浮点数)#边缘计算dts_img = cv2.filter2D(img, -1, kernel) # 使用卷积核进行图像滤波"""cv2.filter2D参数说明:src: 输入图像ddepth: 输出图像深度(-1表示与输入相同)kernel: 卷积核"""#显示图片cv2.imshow("dts_img", dts_img) # 在窗口中显示处理后的图像cv2.waitKey(0) # 等待任意按键按下
1.3 Sobel算子
Sobel算子是一种特殊的Filter2D,也是最常用的一种边缘检测算法,使用特定的卷积核进行计算。
- 使用k1,对原始图像src进行卷积操作,得到水平方向的梯度图Gx
- 使用k2,对原始图像src进行卷积操作,得到垂直方向的梯度图Gy
- 支持适应Gx和Gy求出总梯度,这种用法比较严格,需要同时具有水平和垂直梯度的像素才会显示比较明显
dx,dy参数分别表示是否考虑x和y方向的梯度,不支持全零。
k1和k2必须使用上述的参数,否则就不是Sobel算子。除了Sober算子外,也可以更改卷积核的权重比例形成其他的算子:
import cv2
import numpy as npif __name__ == '__main__':path = "QiPan.jpg" # 图片文件路径img = cv2.imread(path) # 读取图片,返回BGR格式的numpy数组# 灰度图转换# 将BGR格式图像转换为灰度图img_h = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图# Sobel算子边缘检测"""使用Sobel算子计算图像梯度参数:img_h: 输入灰度图像cv2.CV_16S: 输出图像深度(16位有符号整型)1: x方向上的差分阶数1: y方向上的差分阶数ksize=3: Sobel核大小返回:包含梯度值的图像(可能有负值)"""img_sobel = cv2.Sobel(img_h,cv2.CV_16S,1, # x方向上的差分阶数1, # y方向上的差分阶数ksize=3 # Sobel算子大小)# 梯度绝对值处理img_j = np.abs(img_sobel) # 取梯度绝对值,消除负值# 归一化处理max = np.max(img_j) # 获取图像最大梯度值img_g = (img_j / max) * 255 # 归一化到0-255范围# 类型转换img_end = img_g.astype(np.uint8) # 转换为8位无符号整型# 显示结果cv2.imshow("img_end", img_end) # 显示处理后的图像cv2.waitKey(0) # 等待用户按键
1.4 Laplacian(拉普拉斯)算子
上面的算子都是一阶导数求极值,在这些极值的地方,二阶倒数为0,因此梯度计算可以通过二阶倒数。
推理过程如下:
import cv2if __name__ == '__main__':# 图片文件路径path = "QiPan.jpg"# 读取图片,返回BGR格式的numpy数组# @param path 图片路径# @return numpy.ndarray BGR格式的图像数组img = cv2.imread(path)# 拉普拉斯边缘检测# @param img 输入图像# @param ddepth 输出图像深度(-1表示与输入相同)# @return numpy.ndarray 边缘检测结果img_l = cv2.Laplacian(img,-1)# 显示处理后的图像# @param winname 窗口名称# @param mat 要显示的图像cv2.imshow("Laplacian", img_l)# 等待键盘输入# @param delay 延迟时间(毫秒),0表示无限等待cv2.waitKey(0)
拉普拉斯是二阶算子的典型代表,相比于一阶算子各有优缺点:
综上所述,一阶求导和二阶求导算法在图像梯度处理中各有优缺点,在实际应用中,应根据具体需求选择合适的方法。
二、图像边缘检测
上一章中仅仅进行梯度计算,如果要进行边缘检测需要继续优化流程
本实验使用的算法为Canny算法,此算法进行边缘检测被誉为最优方法。
Canny算法的输入图像应该为二值化图像,包括以下步骤:
1. 高斯滤波
2. 计算图像的梯度和方向
3. 非极大值抑制
4. 双阈值筛选
2.1 高斯滤波
边缘检测属于对噪点比较敏感的算法,因此需要降噪,对图像进行平滑处理,这里直接使用一个5*5的高斯核对图像降噪:
经过高斯滤波后,图下会变得更加模糊,边缘会变粗。
2.2 计算图像梯度与方向
内部使用的是Sobel算子来计算图像的梯度值,分为水平和垂直方向的核:
同时计算两个方向的梯度Gx和Gy,然后根据欧式距离(L2距离)来计算具体的梯度值:
根据三角函数,可以基于直角三角形的边长求出对应的角度:
这个角度θ就是总梯度放在哪个,按照以下规定制定角度:
根据上面的设定,可以得到每个边缘像素点所在的边缘方向:
2.3 非极大值抑制
之前使用高斯滤波会让画面的边缘变粗,但是变粗的同时边缘的也会变得模糊,因此这种图像经过梯度计算后,得到的边缘像素点会比原始图像更多,因此需要对这些像素点进行过滤。
非极大值抑制就是过滤边缘像素点的一种方法,可以让边缘变细。假设当前的像素点为(x, y),其梯度方向是0°,梯度值为G(x, y),需要比较G(x, y)与两个相邻像素点的梯度值:G(x, y-1)和G(x, y+1)。如果G(x, y)是这三个梯度值中最大的,就保留该梯度值,否则直接抑制为0。
经过了非极大值抑制之后,还需要经过双阈值筛选。如果阈值设置的太低,就会出现假边缘;如果阈值设置的太高,一些较弱的边缘就会被丢弃,因此适应双阈值再次筛选,需要设定高低阈值的比例。
双阈值对应的像素梯度值可以分为以下几种情况:
- 强边缘 → A
如果像素的梯度值超过高阈值maxVal时,该像素必然是边缘像素。
- 弱边缘
如果像素的梯度值低于高阈值maxVal且高于低阈值minVal时,分为以下两种情况:
(a) 如果该点能连接到一个强边缘点,该像素为边缘像素。→ C
(b) 如果该点不能连接到一个强边缘点,该像素不是边缘像素,被称为伪边缘点。 → B
- 非边缘
如果像素的梯度值低于低阈值minVal时,该像素必然不是边缘点。
import cv2
import numpy as npif __name__ == '__main__':# 1. 图片输入path = 'QiPan.jpg'image_np = cv2.imread(path)# 2. 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3. 二值化ret, image_np_thresh = cv2.threshold(image_np_gray, 40, 255, cv2.THRESH_BINARY)# 4.高斯滤波(可能多次效果更好)no_noise_image = cv2.GaussianBlur(image_np_thresh, (7, 7), 0)# Canny算法: 5.计算梯度与方向 + 6. 非极大值抑制 + 7. 双阈值筛选edges_image = cv2.Canny(image_np_thresh, # 源图像30, # 低阈值70 # 高阈值)# 8. 图片输出cv2.imshow('edges_image', edges_image)cv2.waitKey(0)
三、凸包特征检测
3.1 凸包
凸包就是将一张图片中物体的最外层的点连接起来构成的凸多边形,它能包含物体中所有的像素点。
假如在图像中有一些点:
经过凸包检测并绘制之后,应该得到下面的结果:
可以看到整个物体所有的像素点均涵盖在这个凸多边形中。
3.2 基础凸包检测算法
1. 先找到最左边和最右边的点。
2. 连接上面的两个点连接,将点集分为上半区和下半区,以上半区为例:
3. 找到上半区中离直线最远的点。
假设直线的方程为:,则点(x0,y0)到直线的公式为:
4. 把最远的像素点与之前最左和最右的像素点连接,把这两条直线明明为y1和y2。
5. 求出y1和y2的直线方程,把上半区所有的点带入计算与y1和y2的距离(分正负):
- d=0表示点在y1或y2上,可以忽略
- d>0时,表示点在y1或y2上方,这表示需要更新凸包点
- d<0时,表示点在y1和y2下方,忽略
6. 当上一步出现d>0的情况时,需要更新凸包点,重新连接,形成新的y2和y3:
7. 在新的y2和y3中重新反复计算新凸包点,直到上半区计算完成。
8. 下半区执行跟上半区相似的操作,但是判断条件改为寻找d<0的点。
上面的过程都是基于已知坐标点进行的处理,实际上对于未处理的图像,可能并不能直接获取点的坐标,特别是彩色图像,需要转换为二值化后的图像,并通过轮廓检测算法获取边界点的坐标。
在实际图像处理中,通常会直接调用OpenCV的函数接口提取轮廓点并应用凸包算法,不需要手动实现上述过程。这些算法已经内置,可以更加高效。
3.3 Graham扫描法
Graham扫描法是一种用于寻找二维平面上点集凸包的算法。其基本思想是先找一个基点,从这个基点出发,按照逆时针方向逐个寻找凸包点。
算法的主要步骤如下:
1. 寻找基点(P0)
通常选择y坐标最小的点,如果有多个这样的点,则选择x坐标更小的点作为基点P0,以P0为原点构建二维直角坐标系。
2. 计算剩下所有点相对P0的极角α(即该点与P0连线与x轴正方向的夹角)。
按照极角从小到大的顺序对点进行排序。如果极角相同,则比较与P0的距离,距离更近的排在前面。
3. 初始化一个栈来记录凸包点,把P0和P1入栈。
4. 扫描点集
把P2入栈,将栈顶的两个点相连(P1和P2),得到一条直线,观察下一个点P3在此直线的右侧还是左侧。
- 如果在右侧
说明P2不是凸包点,P2出栈,重新执行第四步(下一个点入栈)。
- 如果在左侧或直线上
说明下一个点P3凸包点,P3入栈,重新执行第四步(下一个点入栈)。
5. 遍历完所有点,栈中剩下的点就是凸包的顶点。按照栈的顺序(从栈底到栈顶,即逆时针顺序)输出所有的凸包点。
Graham-24111张奥博https://docs.qq.com/doc/DTXJ2TWJuU2pPbkFL
3.4 QuickHull法
在二维空间中,QuickHull用于计算凸包,采用分而治之的策略,通过递归将点集划分为更小的子集,并构建这些子集的凸包,如下所示:
3.5 Andrew扫描链法
import cv2
import numpy as npif __name__ == '__main__':# 1. 图片输入path = 'test.png'image_np = cv2.imread(path)# 2. 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3. 二值化ret, image_np_thresh = cv2.threshold(image_np_gray, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# cv2.imshow('image_np_thresh', image_np_thresh)# 4. 寻找轮廓# 返回值1:所有轮廓的点坐标,是一个list列表# 返回值2:轮廓的层级关系contours, hierarchy = cv2.findContours(image_np_thresh, # 二值化之后的图像cv2.RETR_EXTERNAL, # 默认的轮廓查找方式cv2.CHAIN_APPROX_SIMPLE # 默认的轮廓近似办法)print(len(contours))# print(contours)# print(hierarchy)# 拿到第一个轮廓的数据cnt = contours[0]print(cnt.shape) # (296, 1, 2)表示由296个点组成,1占位,2表示xy坐标2维# 5. 查找凸包# 参数:当前轮廓的点数据(此处送入的是第一个轮廓)# 返回值:轮廓的凸包点hull = cv2.convexHull(cnt)print(hull.shape) # (12, 1, 2)print(hull)# 6. 绘制轮廓image_np = cv2.polylines(image_np, # 在哪个图像上画轮廓[hull], # 凸包轮廓点的列表isClosed=True, # TODO 是否闭合color=(0, 0, 255), # 线段颜色thickness=2 # 线段粗度)# 7. 图片输出cv2.imshow('image_np',image_np)cv2.waitKey(0)
总结
本文系统介绍了图像处理中的梯度计算、边缘检测和凸包特征检测三大核心技术。首先,通过微分和差分理论解释了图像梯度的概念,并对比了Sobel算子和Laplacian算子在边缘检测中的优缺点。其次,详细解析了Canny算法的四步流程(高斯滤波、梯度计算、非极大值抑制、双阈值筛选),强调了其在边缘检测中的高效性。最后,深入探讨了凸包检测的三种经典算法(基础凸包检测、Graham扫描法、QuickHull法和Andrew扫描链法),结合OpenCV代码演示了实际应用。全文通过理论推导与代码实践相结合,为图像处理中的特征提取提供了全面的技术指导。
相关文章:
图像处理中的梯度计算、边缘检测与凸包特征分析技术详解
前言 书接上文 OpenCV图像处理实战全解析:镜像、缩放、矫正、水印与降噪技术详解-CSDN博客文章浏览阅读1.1k次,点赞38次,收藏29次。本文系统解析OpenCV图像处理五大实战场景:镜像反转的三种坐标变换模式,图像缩放的尺…...
TDengine 与 taosAdapter 的结合(一)
一、引言 在当今数字化时代,数据量呈爆发式增长,尤其是物联网、工业互联网等领域产生的海量时序数据,对数据存储和处理提出了极高要求。TDengine 作为一款高性能、开源的时序数据库,专为这些场景设计并优化,在时序数据…...
23种设计模式-行为型模式-模板方法
文章目录 简介场景解决代码关键优化点 总结 简介 模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。 场景 假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式&…...
Django异步执行任务django-background-tasks
1、安装 pip install django-background-tasks 2、注册服务 INSTALLED_APPS [...background_task, ]3、生成表 // 生成迁移 python manage.py makemigrations //运行迁移 python manage.py migrate 4、创建文件,模拟任务 from background_task import backgrou…...
从零设计React-Markdown组件的实现方案
从零设计React-Markdown组件的实现方案 现在,把这些步骤整理成代码结构。首先是解析器类,用正则表达式分割文本为Token,然后生成AST。接着,编写一个React组件,接收Markdown字符串,解析成AST,遍历AST生成对应的React元素。处理代码高亮需要引入第三方库,但用户不允许用现…...
如何在React中集成 PDF.js?构建支持打印下载的PDF阅读器详解
本文深入解析基于 React 和 PDF.js 构建 PDF 查看器的实现方案,该组件支持 PDF 渲染、图片打印和下载功能,并包含完整的加载状态与错误处理机制。 完整代码在最后 一个PDF 文件: https://mozilla.github.io/pdf.js/web/compressed.tracemo…...
React-Markdown 组件底层实现原理详解
如何在 React 中渲染 Markdown 文档 React-Markdown 组件底层实现原理详解 一、核心架构:基于 Unified.js 的编译流水线 React-Markdown 的底层实现依赖于 Unified.js 这一开源内容处理系统,其核心是一个可插拔的编译流水线。整个过程分为四个阶段&…...
基于单片机的防火防盗报警系统设计(论文+源码)
2.1系统的功能及方案设计 本次课题为基于单片机的防火防盗报警系统,其系统采用STC89C52单片机为控制器,并结合SIM800短信模块,DS18B20温度检测模块,MQ-2烟雾检测模块,红外人体检测模块,按键模块,…...
NO.72十六届蓝桥杯备战|搜索算法-DFS|选数|飞机降落|八皇后|数独(C++)
P1036 [NOIP 2002 普及组] 选数 - 洛谷 组合型枚举,路径⾥⾯记录选择数的「总和」。在选出k 个数之后,判断「是否是质数」 #include <bits/stdc.h> using namespace std;const int N 25; int n, k; int a[N];int ret; int path; //记录路径中所…...
网络Socket编程基于UDP协议模拟简易网络通信
一、预备知识 网络编程(Network Programming)是指编写程序来实现计算机网络之间的通信。这通常涉及到使用套接字(sockets)来建立连接、发送和接收数据。 (一)套接字 套接字(Socket࿰…...
rust 使用select退出线程
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Capture {clear: bool, // ????????interface: String, // ??times: u64, // ?? }pub async fn cmd_capture(State(web_env): State<ArcWebEnv>,Json(args): Json<C…...
C++学习day7
思维导图: 使用vector实现一个简单的本地注册登录系统 注册:将账号密码存入vector里面,注意防重复判断 登录:判断登录的账号密码是否正确 #include <iostream> #include <cstring> #include <cstdlib> #includ…...
【学习笔记】CoACD: 基于碰撞感知凹性与树搜索的近似凸分解
CoACD 基于碰撞感知凹性与树搜索的近似凸分解 CoACD 官方文档 CoACD(Convex Approximation of Complex Decompositions)是一种用于将复杂网格分解为多个凸包的算法, 专为 3D 网格设计了近似凸分解算法,强调在保持物体间潜在碰撞条件的同时减…...
Three.js 系列专题 6:后处理与特效
内容概述 后处理(Post-Processing)是在渲染完成后对画面进行额外的处理,以实现模糊、辉光、颜色校正等效果。Three.js 通过 EffectComposer 提供后处理支持。本专题还将简要介绍着色器和粒子系统,为更复杂的特效打基础。 学习目标 掌握 EffectComposer 的基本使用。实现辉…...
2025 年江苏保安员职业资格考试经验分享
江苏保安行业发展成熟,2025 年考试注重对考生综合素养的考查。报考条件常规,但对诚信记录有额外关注,如有不良信用记录可能影响报考资格。 报名在江苏省各地级市公安局指定点进行,提交资料包括身份证、学历证、个人诚信报告&am…...
亚马逊算法重构消费市场:解码2024年Q1北美站热搜商品的底层逻辑
在跨境电商迈入精细化运营时代的背景下,亚马逊平台最新发布的《2024年Q1零售搜索趋势报告》揭示了算法驱动下的消费新图景。数据显示,北美站点月均超300万人次重复搜索特定品类商品,健康生活、智能家居等五大领域形成持续增长极。这份由亚马逊…...
powershell绑定按钮事件的两种方式
写一个powershell的简单GUI做本地任务,试验出2个方法: 方法1: function btn1_click {write-host $text1.Text -ForegroundColor Green -BackgroundColor Black }$btn1.Add_Click({btn1_click})方法2: $btn2_click {write-host $…...
LearnOpenGL——OIT
教程地址:简介 - LearnOpenGL CN 简介 原文链接:LearnOpenGL - Introduction 前言 在混合(Blending)章节中,我们介绍了颜色混合的主题。混合是在3D场景中实现透明表面的方法。简而言之,透明度涉及到在计算…...
【蓝桥杯】Python大学A组第十五届省赛
1.填空题 1.1.拼正方形 问题描述 小蓝正在玩拼图游戏,他有个的方块和个的方块,他需要从中挑出一些来拼出一个正方形。 比如用个和个的方块可以拼出一个的正方形;用个的方块可以拼出一个的正方形。 请问小蓝能拼成的最大的正方形的边长为多少。 import math # 2*2的个数 a =…...
使用JS+HTML+CSS编写提词器实例
手搓提词器网页版,有些BUG但是基本功能使用没有问题,有需要的可复制粘贴,BUG自行修复。下面直接进入代码: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><me…...
人工智能基础知识详解:从概念到前沿技术与应用
在数字化浪潮席卷全球的今天,人工智能(Artificial Intelligence,简称AI)已不再是科技前沿的神秘概念,而是融入我们日常工作的实用工具。从智能语音助手到自动驾驶汽车,从医疗影像诊断到生成式艺术创作&…...
重温经典,畅享怀旧游戏盛宴
FC街机是一款专为安卓设备设计的经典游戏合集应用,它将玩家熟悉的红白机(FC)游戏体验带到了移动设备上。这款应用不仅提供了丰富的游戏选择,还通过优化的界面和操作,让玩家能够随时随地享受经典游戏的乐趣。 游戏非常…...
CPU 压力测试命令大全
CPU 压力测试命令大全 以下是 Linux/Unix 系统下常用的 CPU 压力测试命令和工具,可用于测试 CPU 性能、稳定性和散热能力。 1. 基本压力测试命令 1.1 使用 yes 命令 yes > /dev/null & # 启动一个无限循环进程 yes > /dev/null & # 启动第二个进…...
Windows 系统下用 VMware 安装 CentOS 7 虚拟机超详细教程(包含VMware和镜像安装包)
前言 资源 一、准备工作 (一)下载 VMware Workstation (二)下载 CentOS 7 镜像 二、安装 VMware Workstation(比较简单,按下面走即可) 三、创建 CentOS 7 虚拟机 四、安装 CentOS 7 系统…...
QLineEdit的提交前验证
QLineEdit是pyqt中常用的输入控件,默认情况下,它可以接受键盘输入的任何可打印字符。有时候,我们需要在用户提交前对其输入的内容先行验证,当用户输入不符合预期时予以清空,这就需要对QLineEdit控件进行以下操作&#…...
【Linux高级IO(二)】初识epoll
目录 1、epoll的接口 2、epoll原理 3、epoll工作方式 1、epoll的接口 #include <sys/epoll.h> 1、int epoll_create(int size) :创建epoll模型 返回值是一个文件描述符,创建一个struct file结构体,指向epoll模型,返回的…...
2018年真题
数学基础 一、 (共4分)用逻辑符号表达下列语句(论域为包含一切事物的集合) 1、(2分)集合A的任一元素的元素都是A的元素 经过对图片文字的识别与逻辑分析,结果如下: 符号定义&…...
Linux xxd命令
目录 一. xxd命令简介二. 简单使用三. -p选项纯16进制输出四. -r选项将十六进制还原成原始内容五. 小应用 一. xxd命令简介 xxd 是一个将文件或输入内容转换为十六进制(Hex Dump)格式的工具,也可以将十六进制恢复成原始数据。 它在调试二进制…...
高校实验室安全数智化分级分类管理-危化品管理LIMS
一、背景与依据 传统实验室安全管理如同老式挂钟,齿轮咬合处总会随时间产生间隙。为进一步规范学校实验室建设与适用,从源头管控实验室和实验项目安全风险,确保教学科研活动安全有序开展,分级分类体系构建如同绘制实验室的"…...
春芽儿智能跳绳:以创新技术引领运动健康新潮流
在全球运动健康产业蓬勃发展的浪潮中,智能健身器材正成为连接科技与生活的重要纽带。据《中国体育用品产业发展报告》显示,2023年中国智能运动装备市场规模突破千亿元,其中跳绳类目因兼具大众普及性与技术升级空间,年均增速超30%。…...
Fast网络速度测试工具
目录 网站简介 功能特点 测试过程 为什么使用Fast 如果网络速度不达标 网站简介 Fast是一个由Netflix提供的网络速度测试工具,主要用来测试用户的互联网下载速度。它以其简洁的界面和快速的测试过程而受到用户的欢迎。 功能特点 下载速度测试:这是…...
java的文件输入输出流(FileInputStream、FileOutputStream、FileReader、FileWriter)
文章目录 文件输入输出流1 java I/O 流的原理流的分类 2 FileInputStream 文件字节输入流3 FileOutputStream 文件字节输出流4 使用文件字节输入输出流完成对文件的拷贝5 FileReader 文件字符输入流6 FileWriter 文件字符输出流 文件输入输出流 1 java I/O 流的原理 I/O 是 In…...
stm32week10
stm32学习 七.CAN 7.STM32 CAN外设 标识符过滤器: 每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0] FSCx:位宽设置,置0为16位,置1为32位 FBMx:模式设置,置0为屏蔽模式,…...
【UnityEditor扩展】如何在 Unity 中创建棱柱体(用作VR安全区检测),同时在编辑器插件中实现与撤销/恢复功能
Unity 编辑器扩展:3D 空间中绘制安全区棱柱体(含撤销/恢复/保存/读取) 在虚拟现实(VR)和增强现实(AR)开发中,安全区是保障用户安全的重要组成部分。通过精确控制用户活动范围&#…...
C++小游戏 合集
生化危机 #include<conio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<direct.h> int n,round,gold0; bool f1,f2,f3,deadfalse,PC_64Bit; char str[4]; struct n…...
常州 d??
回来了! 今天(?发出来的时候可能已经是第二天了吧 真的爆零了qaq 挺难的 最高分只有100 而且t2t3t4一个人都没拿分qaq 这段时间在写网络流 唉博客还是不要写太水了 抄一点网络流代码上来 EK不写了 dinic会就行了 板子题洛谷p3376 dini…...
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略 1. juc包下的常用类:线程池:并发集合类:同步工具类:原子类: 2. 怎么保证多线程安全:3. Java中常用锁及使用场景:4. 线程同步的方法…...
学习日记-0407(Inductive Matrix Completion Using Graph Autoencoder)
论文阅读:Inductive Matrix Completion Using Graph Autoencoder 代码:swtheing/IMC-GAE 总而言之就是设计了一个不同评分下的邻接图,然后对每一个评分图T进行独立GNN编码。这个 GNN 编码器主要由三个组件构成:嵌入层、消息传递层…...
FPGA入门:状态机思想编程
一、状态机思想编写流水灯 1、状态机思想的概念 状态机思想是一种用于描述和处理具有多个状态以及状态之间转换关系的系统的思维方式。以下是对其主要概念、应用场景和优势的介绍: 主要概念 状态:指系统在某一时刻的状况或条件。例如,在一…...
【电路笔记】-切换触发器
切换触发器 文章目录 切换触发器1、概述2、切换触发器3、JK触发器转换为D型触发器4、D型触发器转换为切换触发器切换触发器是常用的时序逻辑电路,作为单个比特双稳态存储元件,在计数器、存储器设备中经常使用,或作为响应时钟脉冲的分频器。 1、概述 切换触发器是另一种基于…...
示例项目文档模板集:TaskBoard 任务管理系统
一套完整、高可读性、结构清晰的项目文档模板,适用于中小型软件项目的设计、开发、交接与展示全流程。 📌 项目概述文档(overview.md) 📂 项目名称:TaskBoard 🧭 项目简介 TaskBoard 是一款专为敏捷团队打造的任务管理系统,支持任务分配、状态追踪与协作沟通,帮…...
TF-IDF忽略词序问题思考
自从开始做自然语言处理的业务,TF-IDF就是使用很频繁的文本特征技术,他的优点很多,比如:容易理解,不需要训练,提取效果好,可以给予大规模数据使用,总之用的很顺手,但是人…...
代理模式的优缺点是什么?
什么是代理模式? 代理模式(Proxy Pattern)是一种结构型设计模式,它通过创建代理对象来控制对原始对象的访问。 这种模式在前端开发中广泛应用,特别是在需要控制对象访问、添加额外逻辑或优化性能的场景中。 核心…...
十分钟上手:Distilling the Knowledge in a Neural Network
概述:知识蒸馏是一种模型压缩技术,通过让轻量化的学生模型模仿复杂教师模型的输出概率分布,结合软目标和硬目标进行训练,从而将教师模型的泛化能力迁移至学生模型,实现小模型的高效部署而不显著降低性能。 硬目标&…...
百度的deepseek与硅基模型的差距。
问题: 已经下载速度8兆每秒,请问下载30G的文件需要多长时间? 关于这个问题。百度的回答如下: 30GB文件下载时间计算 理论计算(基于十进制单位): 单位换算 文件大小:3…...
OpenCV 图形API(18)用于执行两个矩阵(或数组)的逐元素减法操作函数sub()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 计算两个矩阵之间的逐元素差值。 sub 函数计算两个矩阵之间的差值,要求这两个矩阵具有相同的尺寸和通道数: dst ( I ) src…...
布谷一对一直播源码android版环境配置流程及功能明细
一:举例布谷交友(一对一直播源码)搭建部署的基本环境说明 1. 首先安装Center OS 7.9系统,硬盘最低 40G 2. 安装宝塔环境 https://bt.cn(强烈推荐使用) 3. 安装环境 ● PHP 7.3(安装redis扩展…...
#MongoDB 快速上手
docker pull mongo docker run -d --name my-mongo -p 27017:27017 mongo docker exec -it my-mongo mongo 🚪进入 Mongo Shell 后的第一步 你进入后会看到类似提示符: >说明已经进入 Mongo Shell,现在就可以操作数据库了。 …...
docker相关命令
常用命令 #创建并启动 docker-compose up -d # 启动之后就可以通过浏览器访问了 #停止并删除 docker-compose down #重启 docker-compose restart #停止 docker-compose stop #启动 docker-compose startdocker search #搜索镜像(只搜索官方仓库的,官方仓库地址&am…...
浅谈进程与程序的区别
如大家所了解的,进程与程序是有区别的。 下面做了一个总结,供大家参考、学习: 1. 程序是指令的有序集合,是一个静态的概念,其本身没有任何运行的含义。进程是程序在 CPU 上的一次执行过程,是一个动态的概…...