当前位置: 首页 > news >正文

机器视觉学习(九)—— 边缘检测

目录

一、边缘检测

1.1 Canny边缘检测

1.1.1 cv2.Canny函数

1.1.2 Canny边缘检测示例

1.2 角点检测

1.2.1 cv2.goodFeaturesToTrack()函数

1.2.2 OpenCV角点检测示例代码

1.3 直线检测

1.3.1 cv2.HoughLinesP()函数

1.3.2 OpenCV直线检测示例代码

1.4 圆形检测

1.4.1 cv2.HoughCircles()函数

1.4.2 OpenCV圆形检测示例代码


一、边缘检测

OpenCV中进行边缘检测的一般步骤如下:

1. 导入OpenCV库并读取图像:

import cv2
image = cv2.imread('image.jpg', 0)  # 以灰度模式读取图像

在这个步骤中,你需要将图像加载到内存中。你可以选择以灰度模式或彩色模式读取图像。

2. 对图像进行预处理(可选): 根据具体情况,你可以对图像进行平滑处理(如高斯模糊)或增强处理(如直方图均衡化)。这一步骤可以帮助改善边缘检测的结果。

3. 使用边缘检测算法: 在OpenCV中,有多种边缘检测算法可供选择。以下是一些常用的算法:

  • Canny边缘检测算法:
edges = cv2.Canny(image, threshold1, threshold2)

threshold1threshold2是两个阈值,用于控制边缘检测的敏感度。

  • Sobel算子:
gradient_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
gradient_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
edges = cv2.sqrt(gradient_x**2 + gradient_y**2)

使用了Sobel算子计算图像的水平和垂直梯度,并将两个梯度的平方和开方得到边缘强度。

4. 显示或保存结果:

cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.1 Canny边缘检测

Canny边缘检测是一种经典的图像处理算法,也是OpenCV库中常用的边缘检测方法之一。它通过多个步骤来识别图像中的边缘,包括高斯滤波、梯度计算、非最大抑制和双阈值处理。

以下是对Canny边缘检测算法的详细解释:

  1. 高斯滤波:首先,输入图像会经过一个高斯滤波器,以平滑图像并去除噪声。高斯滤波器是一个线性平滑滤波器,它使用一个二维高斯函数来计算图像中每个像素的新值。

  2. 梯度计算:在经过高斯滤波之后,算法会计算每个像素的梯度幅值和方向。梯度幅值表示像素的变化强度,而梯度方向表示变化的方向。

  3. 非最大抑制:接下来,算法会对梯度幅值进行非最大抑制。这个步骤的目的是找出图像中真正的边缘像素,而抑制非边缘的像素。对于每个像素,算法会检查其梯度方向,并与相邻像素进行比较。只有当像素的梯度幅值是该方向上的最大值时,才会被保留为边缘像素,否则会被抑制。

  4. 双阈值处理:最后,算法会将梯度幅值分成两个阈值:低阈值和高阈值。低阈值用于确定弱边缘像素,而高阈值用于确定强边缘像素。具体而言,如果像素的梯度幅值大于高阈值,则被标记为强边缘像素。如果像素的梯度幅值小于低阈值,则被排除。介于两个阈值之间的像素将被视为弱边缘像素,只有在其周围有强边缘像素时才会被保留。

1.1.1 cv2.Canny函数

cv2.Canny()是OpenCV中用于执行Canny边缘检测的函数。它具有以下语法:

edges = cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]])

参数说明:

  • image:输入图像。可以是灰度图像或彩色图像。
  • threshold1:低阈值。边缘强度梯度低于该值的像素被认为不是边缘。
  • threshold2:高阈值。边缘强度梯度高于该值的像素被认为是边缘。
  • apertureSize(可选):Sobel算子的孔径大小。默认值为3。
  • L2gradient(可选):一个布尔值,确定计算梯度的方式。如果为True,则使用L2范数计算梯度(更准确但计算量大);如果为False,则使用L1范数计算梯度(快速但不太准确)。默认值为False。

返回值:

  • edges:边缘检测结果图像。是一个二值图像,其中白色像素表示边缘,黑色像素表示背景。

注意:

  • 通常情况下,推荐将threshold1设置为threshold2的1/3到1/2的值。
  • 较小的阈值会产生更多的边缘,但可能有更多的噪声。
  • 较大的阈值会过滤掉较弱的边缘,但可能会丢失一些边缘。

1.1.2 Canny边缘检测示例

下面是OpenCV进行Canny边缘检测的示例代码:

import cv2# 读取图像
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)# 执行Canny边缘检测
edges = cv2.Canny(image, 100, 200)# 显示结果
cv2.imshow("Original Image", image)
cv2.imshow("Canny Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

调用cv2.Canny函数进行Canny边缘检测。设置低阈值为100,高阈值为200。

1.2 角点检测

角点检测是计算机视觉中的一种关键技术,用于检测图像中的角点或特征点。角点是图像中两条边交汇形成的点,通常具有较高的局部变化和不变性。

OpenCV提供了几种角点检测算法,其中两种常用的方法是Harris角点检测和Shi-Tomasi角点检测。

  1. Harris角点检测: Harris角点检测算法通过计算图像局部区域的灰度变化,判断是否存在角点。Harris角点检测算法的思想是计算每个像素的响应值,响应值较大的像素被认为是角点。它基于图像的一阶和二阶矩来计算特征值,从而判断每个像素是否为角点。

  2. Shi-Tomasi角点检测: Shi-Tomasi角点检测算法是在Harris角点检测算法的基础上进行了改进。Shi-Tomasi角点检测算法使用了每个像素点的最小特征值,即响应最弱的特征值,作为选择角点的准则。这样可以得到比Harris角点检测更好的角点检测结果。

对于这两种角点检测算法,OpenCV提供了相应的函数,可以方便地进行角点检测。通过调整不同的参数,如窗口大小、响应值阈值等,可以得到不同的角点检测结果。

1.2.1 cv2.goodFeaturesToTrack()函数

cv2.goodFeaturesToTrack()是OpenCV中用于角点检测的函数。下面是该函数的详细解释:

corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance, mask=None, blockSize=None, useHarrisDetector=None, k=None)
  • image:输入的灰度图像。

  • maxCorners:要检测的最大角点数量。如果检测到的角点数量超过该值,则会返回最强的角点。

  • qualityLevel:角点质量因子,用于筛选角点。值范围为0到1,表示最好的角点质量。

  • minDistance:两个角点之间的最小欧氏距离。如果两个角点之间的距离小于此值,则其中一个角点将被删除。

  • mask(可选):一个与输入图像大小相同的掩码图像,在掩码区域中不会检测到角点。

  • blockSize(可选):角点检测中使用的像素邻域大小。默认值为3。

  • useHarrisDetector(可选):一个布尔值,表示是否使用Harris角点检测器。默认为False,即使用Shi-Tomasi角点检测器。

  • k(可选):如果使用Harris角点检测器,此参数为Harris检测器的自由参数。默认值为0.04。

函数返回检测到的角点的坐标,以N x 1 x 2的Numpy数组形式返回。在返回的角点数组中,每个角点的坐标可以通过corner[0][0]corner[0][1]来访问。

注意:

cv2.goodFeaturesToTrack()函数只能用于灰度图像

1.2.2 OpenCV角点检测示例代码

OpenCV进行角点检测的示例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread("image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用Shi-Tomasi角点检测
corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
corners = np.int0(corners)# 绘制角点
for corner in corners:x, y = corner.ravel()cv2.circle(img, (x, y), 3, (0, 0, 255), -1)# 显示图像
cv2.imshow("Corners", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

首先读取图像并将其转换为灰度图像。使用cv2.goodFeaturesToTrack()函数进行角点检测,其中参数gray是输入灰度图像,100是要检测的角点数量,0.01是角点质量因子(0.01 * 最大特征值),10是两个角点之间的最小距离,函数返回的是检测到的角点坐标。

我们使用np.int0()将角点坐标转换为整数类型,并使用cv2.circle()函数绘制出检测到的角点。最后,使用cv2.imshow()显示带有角点的图像,并使用cv2.waitKey()等待键盘输入。

1.3 直线检测

1.3.1 cv2.HoughLinesP()函数

cv2.HoughLinesP()函数是OpenCV中用于通过Hough变换检测图像中的直线的函数。HoughLinesP()函数是Hough变换的参数空间的一种优化,它可以直接检测出图像中的直线的端点。

 lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)

参数解释:

  • image: 输入的二值图像。
  • rho: Hough变换中表示距离精度的参数。
  • theta: Hough变换中表示角度精度的参数。
  • threshold: Hough变换中表示直线的最小投票数。
  • minLineLength: 最小直线长度。
  • maxLineGap: 最大直线间隙。

返回值:

  • lines: 返回检测到的直线的起点和终点坐标。每个元素代表一条直线,每条直线由端点坐标组成。

1.3.2 OpenCV直线检测示例代码

在OpenCV中,可以使用Hough变换来进行直线检测。以下是使用OpenCV进行直线检测的示例代码:

import cv2
import numpy as np# 加载图像
image = cv2.imread('image.jpg')# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行边缘检测
edges = cv2.Canny(gray, 50, 150)# 进行直线检测
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)# 绘制检测到的直线
if lines is not None:for line in lines:x1, y1, x2, y2 = line[0]cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), thickness=2)# 显示结果
cv2.imshow("Result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.4 圆形检测

在OpenCV中进行圆形检测,可以使用Hough圆变换。Hough圆变换可以检测图像中的圆形轮廓。

1.4.1 cv2.HoughCircles()函数

使用cv2.HoughCircles()函数可以实现圆形检测。

circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)

参数解释:

  • image: 输入图像,通常为灰度图像。
  • method: Hough圆变换的检测方法,一般使用cv2.HOUGH_GRADIENT。
  • dp: 累加器图像分辨率与输入图像分辨率的倒数之比。通常设置为1。
  • minDist: 检测到的圆心之间的最小距离。
  • param1: 第一个方法特定的参数,对于HOUGH_GRADIENT方法,表示Canny边缘检测的高阈值。
  • param2: 第二个方法特定的参数,对于HOUGH_GRADIENT方法,表示检测阶段圆心累加器阈值。
  • minRadius: 最小圆形半径。
  • maxRadius: 最大圆形半径。

返回值:

  • circles: 返回检测到的圆形的圆心坐标和半径。

1.4.2 OpenCV圆形检测示例代码

在OpenCV中,可以使用Hough圆变换来进行直线检测。以下是使用OpenCV进行圆形检测的示例代码:

import cv2
import numpy as npimage = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=50, param2=30, minRadius=0, maxRadius=0)if circles is not None:circles = np.round(circles[0, :]).astype("int")for (x, y, r) in circles:cv2.circle(image, (x, y), r, (0, 255, 0), 4)cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上示例代码中,首先读取图像并将其转换为灰度图像。然后对灰度图像进行中值滤波来去除噪声。接下来使用cv2.HoughCircles()函数检测图像中的圆形,并将检测到的圆形绘制在原图像上。最后显示原图像。

相关文章:

机器视觉学习(九)—— 边缘检测

目录 一、边缘检测 1.1 Canny边缘检测 1.1.1 cv2.Canny函数 1.1.2 Canny边缘检测示例 1.2 角点检测 1.2.1 cv2.goodFeaturesToTrack()函数 1.2.2 OpenCV角点检测示例代码 1.3 直线检测 1.3.1 cv2.HoughLinesP()函数 1.3.2 OpenCV直线检测示例代码 1.4 圆形检测 1.4…...

基于单片机声音分贝采集和显示控制系统设计

**单片机设计介绍,基于单片机声音分贝采集和显示控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机声音分贝采集和显示控制系统设计,主要目标是实现声音分贝的实时采集、处理以及显示…...

CentOS使用Docker部署Halo并结合内网穿透实现公网访问本地博客

文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤:1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 本文主要介绍如何在CentOS 7系统使…...

打造高效自动化渗透测试系统:关键步骤与实践

随着当前网络安全威胁的不断扩展与升级,开展渗透测试工作已经成为广大企业组织主动识别安全漏洞与潜在风险的关键过程。然而,传统的人工渗透测试模式对测试人员的专业能力和经验水平有很高的要求,企业需要投入较大的时间和资源才能完成。在此…...

绿联 部署vocechat,搭建私人聊天服务器,用于小型团队和家庭环境

1、镜像 privoce/vocechat-server:latest 2、安装 2.1、基础设置 重启策略:容器退出时总是重启容器。 2.2、网络 桥接即可。 2.3、存储空间 装载路径:/home/vocechat-server/data不可变更,权限读写。 2.4、端口设置 容器端口3000不可变…...

考研数学|高效刷透汤家凤《1800》经验分享

当然不需要换老师,如果你在基础阶段连汤老师的课都听不进去,那么换其他老师的话,很大可能也是白搭。 如果你现在对于1800还是一筹莫展的话,那么很明显,这反映出前期基础不扎实,没有真正理解和掌握这部分内…...

LLM推理入门指南②:深入解析KV缓存

在本系列文章《LLM推理入门指南①:文本生成的初始化与解码阶段》中,作者对Transformer解码器的文本生成算法进行了高层次概述,着重介绍了两个阶段:单步初始化阶段,即提示的处理阶段,和逐个生成补全词元的多…...

上采样技术在语义分割中的应用

目录 概要 一、概述 二、实现方法 1.转置卷积 2.反池化 3.双线性插值法 三、在经典网络中的的应用 1.U-Net 2.FCN 总结 概要 上采样是用于深度学习中提高语义分割精度的技术,可以实现图像放大和像素级别标注 一、概述 神经网络的基本结构为:…...

linux 组建raid5详细操作

raid5最多运行损坏一个盘,最少3个盘,容量为少一块硬盘的容量之和。 如果硬盘数量较多,比如8块以上,建议用raid6,raid6最多允许两块硬盘损坏。 如果需要 一、安装raid软件 deb包 apt-get install mdadm或dnf包 dnf …...

机器学习概念、步骤、分类和实践

在当今数字化时代,机器学习已经渗透到我们生活的方方面面,从智能手机应用、搜索引擎优化,到自动驾驶汽车、医疗诊断等,其应用无处不在。本文将带您走进机器学习的世界,了解它的基本概念、步骤、分类以及实践应用。 一…...

钉钉服务端API报错 错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确

problem 调用钉钉服务端API,机器人发送群聊消息,后台返回报错信息: 钉钉服务端API报错 错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确; reason 定位: 登录后台,查看机器人是存在查看机器人调用权限接…...

Linux 开发环境以及编译链接

再谈编译链接 C函数重载与编译链接-CSDN博客 之前我已经写过文章简单介绍了编译链接要做的一些操作。现在为了能更好的理解我们平时的开发环境,我会在Linux系统上完整地走一遍流程。 环境描述 我们使用普通用户在Linux上进行操作,先写一段测试代码。 …...

SmartChart的部署以及可能遇见的报错解决方案

简介 数据可视化是一种将数据转化为图形的技术,可以帮助人们更好地理解和分析数据。但是,传统的数据可视化开发往往需要编写大量的代码,或者使用复杂的拖拽工具,不仅耗时耗力,而且难以实现个性化的需求。有没有一种更…...

【Node.js从基础到高级运用】十九、Node.js 捕获错误之“未捕获的异常”

引言 在 Node.js 应用程序中,错误处理是保证应用稳定性和可靠性的关键部分。特别是“未捕获的异常”(uncaught exceptions),如果不妥善处理,很可能会导致整个进程崩溃。在本文中,我们将探讨如何在 Node.js …...

vue 计算属性

基础示例​ 模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象: const author reactive({name: John Doe,books: [V…...

RedissonLock-tryLock-续期

redisson版本3.16.6 1.什么是看门狗 Redisson提供的分布式锁是支持锁自动续期的,也就是说,如果线程仍旧没有执行完,那么redisson会自动给redis中的目标key延长超时时间,这在Redisson中称之为 Watch Dog 机制。默认情况下&#x…...

MSTP环路避免实验(华为)

思科设备参考:MSTP环路避免实验(思科) 一,技术简介 MSTP(多生成树协议),MSTP解决了STP和RSTP没有考虑vlan的问题,STP和RSTP将所有的vlan共享为一个生成树实例,无法实现…...

IoT网关在智能制造工厂生产线监控与管理中的应用-天拓四方

随着工业4.0时代的到来,智能制造已成为工业发展的重要方向。IoT网关在智能制造工厂中扮演着关键角色,它能够实现设备间的互联互通、数据的实时采集与处理,以及生产线的智能监控与管理。本案例将详细介绍IoT网关在智能制造工厂生产线监控与管理…...

niushop单商户V5多店版源码分享三端uniapp打包方法包括PC端_小程序或h5端打包_收银端打包_APP端打包_商户端

目前多店版有四端uniapp,包括PC端uniapp,商家端uniapp,收银端uniapp,门店手机端uniapp,下面我总结下这些端的打包流程希望能帮助到大家,需要交流的可以看我昵称或者点我头像关注我分享代码和教程 一.niush…...

npm包发布

一、npm npm(Node Package Manager)是 Node.js 的包管理工具,用于安装、分享和管理 JavaScript 包和项目依赖。npm 是 Node.js 的默认包管理器,随同 Node.js 一起安装。 二、npm主要功能特点 包管理:npm 允许开发者…...

C#使用SQLite(含加密)保姆级教程

C#使用SQLite 文章目录 C#使用SQLite涉及框架及库复制runtimes创建加密SQLite文件生成连接字串执行SQL生成表SQLiteConnectionFactory.cs 代码结构最后 涉及框架及库 自己在NuGet管理器里面安装即可 Chloe.SQLite:ORM框架Microsoft.Data.Sqlite.Core:驱…...

C# 异步与 Unity 协程(实例讲解)

C#异步编程实例&#xff1a; 假设我们有一个需要从Web获取数据的简单应用。我们可以使用C#的异步编程模型来避免UI线程被HTTP请求阻塞 1using System.Net.Http; 2using System.Threading.Tasks; 3 4public class AsyncExample 5{ 6 public async Task<string> Fetch…...

iOS - Runloop介绍

文章目录 iOS - Runloop介绍1. 简介1.1 顾名思义1.2. 应用范畴1.3. 如果没有runloop1.4. 如果有了runloop 2. Runloop对象3. Runloop与线程4. 获取Runloop对象4.1 Foundation4.2 Core Foundation4.3 示例 5. Runloop相关的类5.1 Core Foundation中关于RunLoop的5个类5.2 CFRunL…...

探究分布式事务:深入ACID特性在分布式系统中的挑战与解决方案

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…...

PCI总线管脚定义(引脚定义)

文章目录 1&#xff1a; 参考资料的链接2: 图片说明3&#xff1a;PCI文字说明每日好图 1&#xff1a; 参考资料的链接 PCI bus pinout PCI三种标准引脚信号定义 PCI bus pinout 2: 图片说明 A面和B面正反 PCI Universal Card 32/64 bit ----------------------------------…...

万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)

Sphinx查询性能非常厉害&#xff0c;亿级数据下输入关键字&#xff0c;大部分能在0.01~0.1秒&#xff0c;少部分再5秒之内查出数据。 Sphinx 官方文档&#xff1a;http://sphinxsearch.com/docs/sphinx3.html极简概括&#xff1a; 由C编写的高性能全文搜索引擎的开源组件&…...

数据库索引及优化

数据库索引及优化 什么是索引&#xff1f; MySQL官方对索引的定义为&#xff1a;索引&#xff08;INDEX&#xff09;是帮助MySQL高效获取数据的数据结构。 索引的本质&#xff1a; 数据结构 为什么要引入索引&#xff1f; 引入索引的目的在于提高查询效率&#xff0c;就好像是…...

flink: 将接收到的tcp文本流写入HBase

一、依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…...

SpringBoot集成knife4j

SpringBoot集成knife4j 1、什么是Knife4j2、SpringBoor整合Knife4j2.1、Knife4j配置方式12.2 配置方式二2.3、写注解2.4、效果 1、什么是Knife4j 在日常开发中&#xff0c;写接口文档是我们必不可少的&#xff0c;而Knife4j就是一个接口文档工具&#xff0c;可以看作是Swagger…...

Vue3之setup方法

Vue 3 的 setup 方法是 Vue Composition API 的一部分&#xff0c;用于组织和复用 Vue 组件的逻辑代码。Vue Composition API 允许您以更具响应性和函数式的方式来组织和复用 Vue 组件中的代码&#xff0c;特别是在处理复杂逻辑或跨组件共享逻辑时非常有用。 以下是关于 setup…...

怎么做电子商务网站/seo sem关键词优化

2. 数据类型 2.1. KingbaseES数据类型到Oracle数据类型转换 表 2.1.2 KingbaseES数据类型到Oracle数据类型转换序号 KingbaseES 数据类型 Oracle数据类型 备注说明 &#xff08;KingbaseES&#xff09; 数值型 1 tinyint NUMBER 单字节整数 -128 to 127 2 smallint …...

网站建设方案书怎么写样版/seo怎样

1、HDUOJ 4675 题意&#xff1a;给定数n, m, k和数列{an}&#xff08;1 < ai < m&#xff09;&#xff0c;求改变数列{an}中的k个数的值&#xff08;不改变位置&#xff0c;且新值范围为1 < ai < m&#xff0c;ai ! ai&#xff09;&#xff0c;使得数列的最大公约数…...

前潮网络网站建设/网络营销的八种方式

接触React项目快两个月了&#xff0c;还在研究摸索各种知识点的过程中&#xff0c;充实且幸福。 在项目中学习新知识&#xff0c;还是很有效率的&#xff0c;一边写项目&#xff0c;一边实验新的知识点&#xff0c;比如react hooks&#xff01;嘻嘻嘻~~~ 写了好一段时间class组…...

可信赖的深圳网站建设/2021小学生新闻摘抄

/*** 选择排序的思想&#xff1a;* 每次从待排序列中找到最小的元素&#xff0c;* 然后将其放到待排的序列的最左边&#xff0c;直到所有元素有序** 选择排序改进了冒泡排序&#xff0c;将交换次数从O(N^2)减少到O(N)* 不过比较次数还是O(N)*/package al;public class SelectSo…...

wordpress建站毕业论文/信息流广告投放流程

一、 RunLoop初识 日常的开发工作中&#xff0c;我们几乎很少注意RunLoop&#xff0c;因为我们基本上“用不到”RunLoop。包括我在内应该有很多人都不了解这个东西&#xff0c;只是听说过。最近有空查了不少资料终于把RunLoop运行原理搞清楚了。 本文会对RunLoop的原理进行深入…...

国内做网站公司哪家好/抚顺网站seo

● 把电脑的第一启动项设为USB设备启动以往用光盘装系统&#xff0c;必须调整启动项为光驱启动&#xff0c;而现在我们要用U盘装系统&#xff0c;所以要调整为U盘启动。关于这个&#xff0c;不同电脑不同版本的bios有不同的设置方法&#xff0c;不过都大同小异&#xff0c;目的…...