opencv 轮廓放大_使用OpenCV和Python构建自己的车辆检测模型

2023-11-01

概述

  • 你对智慧城市领域有兴趣吗?如果是的话,你会喜欢这个关于实现你自己的车辆检测系统的教程
  • 在深入实现部分之前,我们将首先了解如何检测视频中的移动目标
  • 我们将使用OpenCV和Python构建自动车辆检测器

介绍

关于智慧城市的理念,以及自动智能能源系统、电网、一键接入端口的想法等等,是一个令人着迷的概念!老实说,这是一个数据科学家的梦想,值得高兴的是世界上很多城市都在朝着更智能的方向发展。 智能城市的核心组成部分之一是自动交通管理。这不禁让我们思考——是否能用我的数据科学知识来建立一个车辆检测模型,然后在智能交通管理中发挥作用? 想想看,如果你能在红绿灯摄像头中集成车辆检测系统,你可以轻松地同时跟踪许多有用的东西:
  • 白天交通路口有多少辆车?
  • 什么时候交通堵塞?
  • 什么样的车辆(重型车辆、汽车等)正在通过交叉路口?
  • 有没有办法优化交通,并通过不同的街道进行分配?
还有很多例子就不一一列举。应用程序是无止境的! 我们可以很容易在一瞬间从复杂的场景中检测和识别出物体。然而,将这种思维过程转化为机器的思维,然而这就需要我们学习使用计算机视觉算法进行目标检测。 因此在本文中,将建立一个自动车辆检测器和计数器模型。以下视频是你可以提前体验效果: https://youtu.be/C_iZ2yivskE 注意:还不懂深度学习和计算机视觉的新概念?以下是两门热门课程,可开启你的深度学习之旅:
  • 深度学习基础(https://courses.analyticsvidhya.com/courses/fundamentals-of-deep-learning?utm_source=blog&utm_medium=vehicle-detection-opencv-python)
  • 利用深度学习的计算机视觉(https://courses.analyticsvidhya.com/courses/computer-vision-using-deep-learning-version2?utm_source=blog&utm_medium=vehicle-detection-opencv-python)

目录

  1. 视频中运动目标检测的思想
  2. 视频中目标检测的真实世界用例
  3. 视频目标检测的基本概念
  • 帧差分
  • 图像阈值
  • 检测轮廓
  • 图像膨胀
  1. 利用OpenCV构建车辆检测系统

视频中运动目标检测的思想

目标检测是计算机视觉中一个引人入胜的领域。当我们处理视频数据时,它达到了一个全新的水平,然后复杂性上升了一个等级,但是准确性大大提高了! 我们可以使用目标检测算法来执行超级有用的高价值任务,如监视、交通管理、打击犯罪等。下面的GIF图演示了这个想法:
在目标检测中,我们可以执行许多子任务,例如计算目标数量、查找目标的相对大小或查找目标之间的相对距离。这些子任务都很重要,因为它们有助于解决一些最棘手的现实问题。 如果你希望从头开始学习目标检测,建议你使用以下教程:
  • 逐步介绍基本的目标检测算法(https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introduction-to-the-basic-object-detection-algorithms-part-1/?utm_source=blog&utm_medium=vehicle-detection-opencv-python)
  • 利用SlimYOLOv3进行实时目标检测(https://www.analyticsvidhya.com/blog/2019/08/introduction-slimyolov3-real-time-object-detection/?utm_source=blog&utm_medium=vehicle-detection-opencv-python)
  • 其他目标检测的资料(https://www.analyticsvidhya.com/blog/tag/object-detection/?utm_source=blog&utm_medium=vehicle-detection-opencv-python)
让我们看看一些令人兴奋的现实世界中的目标检测用例。

视频中目标检测的真实世界用例

如今,视频目标检测正被广泛应用于各个行业。使用案例从视频监控到体育广播,再到机器人导航。 好消息是,在未来的视频目标检测和跟踪用例中,可能性是无穷的。这里列出了一些有趣的应用程序:
  • 人群计数(https://www.analyticsvidhya.com/blog/2019/02/building-crowd-counting-model-python/)
  • 车牌检测与识别
  • 运动中的球跟踪(https://www.analyticsvidhya.com/blog/2020/03/ball-tracking-cricket-computer-vision/)
  • 机器人学
  • 交通管理(我们将在本文中看到这个想法)

视频目标检测的基本概念

在开始构建视频检测系统之前,你应该知道一些关键概念。一旦你熟悉了这些基本概念,就可以为你选择的任何用例构建自己的检测系统。 那么,你希望如何检测视频中的移动目标? 我们的目标是捕捉运动物体的坐标并在视频中突出显示该物体。请考虑下面视频中的这一帧:
我们希望我们的模型能够检测视频中的运动目标,如上图所示。检测到移动的汽车,并在汽车周围创建一个边界框。 解决这个问题有多种方法。你可以为目标检测训练一个深度学习模型,也可以选择一个预先训练好的模型并根据你的数据对其进行微调。然而,这些方法都是有监督的学习方法,需要标记数据来训练目标检测模型。 在本文中,我们将重点讨论视频中无监督目标检测方法,即不使用任何标记数据的目标检测。我们将使用帧差分技术。让我们了解它是如何工作的!
帧差分
视频是一组按正确顺序堆叠在一起的帧。所以,当我们看到一个物体在视频中移动时,这意味着这个物体在每一个连续的帧上都处于不同的位置。
如果我们假设在一对连续的帧中除了该目标之外,没有其他物体移动,那么第一帧与第二帧的像素差将突出显示移动目标的像素,从而我们可以得到移动物体的像素和坐标。这就是帧差分法的工作原理。 举个例子。考虑视频中的以下两个帧:
你能看出这两帧的区别吗? 握笔手的位置从第1帧变为第2帧。其余的物体根本没有移动。所以,正如前面提到的,为了定位移动目标,我们将执行帧差分。结果如下:
你可以看到高亮或白色区域,这是手最初出现的地方。除此之外,记事本的边缘也会突出显示一点。这可能是由于手的移动改变了光照。建议不要对静止物体进行不必要的检测。因此,我们需要对帧执行某些图像预处理步骤。
图像阈值
在这种方法中,灰度图像的像素值根据阈值被指定为表示黑白颜色的两值之一。因此,如果一个像素的值大于一个阈值,它被赋予一个值,否则它被赋予另一个值。 在本例中,我们将对上一步骤中帧差分的输出图像应用图像阈值:
你可以看到,不需要的高亮区域大部分已经消失了。高亮显示的“记事本”边缘不再可见。合成的图像也可以称为二值图像,因为其中只有两种颜色。在下一个步骤中,我们将看到如何捕获这些高亮区域。
检测轮廓
轮廓用于识别图像中具有相同颜色或强度的区域形状。轮廓就是目标区域周围的边界。因此,如果我们在阈值步骤后对图像应用轮廓检测,我们将得到以下结果:
白色区域被浅灰色的边界所包围,这些边界就是轮廓。我们很容易得到这些轮廓的坐标。这意味着我们可以得到高亮区域的位置。 请注意,有多个高亮显示区域,每个区域由轮廓包围。在我们的例子中,具有最大面积的轮廓是我们期望的区域。因此,轮廓最好尽可能少。 在上图中,仍然有一些不必要的白色区域碎片,这还有改进的余地。我们的想法是合并附近的白色区域以获得更少的轮廓,为此,我们可以使用另一种称为图像膨胀的技术。
图像膨胀
这是对图像的卷积操作,其中核心(矩阵)传递到整个图像上。为了给你更直观的说明,右边的图像是左边图像的放大版本:
所以,让我们对我们的图像进行图像膨胀,然后我们将再次找到轮廓:
事实证明,许多支离破碎的区域已经相互融合。现在我们可以再次在这张图片中找到轮廓:
在这里,我们只有四个候选轮廓,从中我们可以选择一个有最大面积的轮廓。也可以在原始帧上绘制这些轮廓,以查看轮廓围绕移动目标的情况:

用OpenCV和Python构建车辆检测系统

我们准备建立我们的车辆检测系统!在这个实现中,我们将大量使用计算机视觉库OpenCV(4.0.0版)( https://www.analyticsvidhya.com/blog/2019/03/opencv-functions-computer-vision-python/?utm_source=blog&utm_medium=vehicle-detection-opencv-python ) 。我们先导入所需的库和模块。
导入库
import osimport reimport cv2 # opencv libraryimport numpy as npfrom os.path import isfile, joinimport matplotlib.pyplot as plt
导入视频帧
请从此链接下载原始视频的帧。 https://drive.google.com/file/d/1P0yiO5KlnU8dGgB_L68KB_hjIvUec55f/view 将框架保存在工作目录中名为“frames”的文件夹中。从该文件夹中,我们将导入帧并将其保存在列表中:
# get file names of the framescol_frames = os.listdir('frames/')# sort file namescol_frames.sort(key=lambda f: int(re.sub('\D', '', f)))# empty list to store the framescol_images=[]for i in col_frames:    # read the frames    img = cv2.imread('frames/'+i)    # append the frames to the list    col_images.append(img)
数据探索
让我们显示两个连续的帧:
# plot 13th framei = 13for frame in [i, i+1]:    plt.imshow(cv2.cvtColor(col_images[frame], cv2.COLOR_BGR2RGB))    plt.title("frame: "+str(frame))    plt.show()
很难在这两个框架中找到区别,不是吗?如前所述,获取两个连续帧的像素值的差值将有助于我们观察移动目标。那么,让我们在上面两个帧上使用该技术:
# convert the frames to grayscalegrayA = cv2.cvtColor(col_images[i], cv2.COLOR_BGR2GRAY)grayB = cv2.cvtColor(col_images[i+1], cv2.COLOR_BGR2GRAY)# plot the image after frame differencingplt.imshow(cv2.absdiff(grayB, grayA), cmap = 'gray')plt.show()
现在我们可以清楚地看到第13帧和第14帧中的移动目标。其他没有移动的东西都被减去了。
图像预处理
让我们看看对上面的图像应用阈值后会发生什么:
diff_image = cv2.absdiff(grayB, grayA)# perform image thresholdingret, thresh = cv2.threshold(diff_image, 30, 255, cv2.THRESH_BINARY)# plot image after thresholdingplt.imshow(thresh, cmap = 'gray')plt.show()
现在,移动物体(车辆)看起来更像我们期望看到的那样了,大部分噪音(不希望出现的白色区域)都消失了。但是,突出显示的区域有点零碎。因此,我们可以对该图像应用图像膨胀:
# apply image dilationkernel = np.ones((3,3),np.uint8)dilated = cv2.dilate(thresh,kernel,iterations = 1)# plot dilated imageplt.imshow(dilated, cmap = 'gray')plt.show()
移动的物体有更多的实心高亮区域。希望帧中每个目标的轮廓数不超过3。 但是,我们不会使用整个框架来检测移动的车辆。我们将首先选择一个区域,如果车辆进入该区域,则仅检测到该区域。 那么,我们将会使用的区域:
# plot vehicle detection zoneplt.imshow(dilated)cv2.line(dilated, (0, 80),(256,80),(100, 0, 0))plt.show()
水平线y = 80以下的区域是我们的车辆检测区域。我们将只检测在这个区域发生的任何移动。你还可以创建自己的检测区。 现在让我们在上述帧的检测区域中找到轮廓:
# find contourscontours, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
上面的代码查找整个图像中的所有轮廓,并将它们保存在变量"contours"中。由于我们只需要找到检测区域中存在的轮廓,我们将对发现的轮廓进行两次检查。 第一个检查是轮廓左上角的y坐标是否应大于等于80(我这里包括另一个检查,x坐标小于等于200)。另一个检查是轮廓的面积是否大于等于25。在cv2.courtoArea()函数的帮助下,你可以找到轮廓区域。
valid_cntrs = []for i,cntr in enumerate(contours):    x,y,w,h = cv2.boundingRect(cntr)    if (x <= 200) & (y >= 80) & (cv2.contourArea(cntr) >= 25):        valid_cntrs.append(cntr)# count of discovered contours        len(valid_cntrs)
接下来,让我们绘制轮廓和原始帧:
dmy = col_images[13].copy()cv2.drawContours(dmy, valid_cntrs, -1, (127,200,0), 2)cv2.line(dmy, (0, 80),(256,80),(100, 255, 255))plt.imshow(dmy)plt.show()
太酷了!只有位于检测区域内的车辆轮廓可见。这就是我们在整个画面中检测车辆的方法
视频中的车辆检测
现在是时候对所有帧应用相同的图像变换和预处理操作,并找到所需的轮廓。重申一下,我们将遵循以下步骤:
  1. 对每对连续帧应用帧差分
  2. 对上一步的输出图像应用图像阈值
  3. 对上一步的输出图像进行图像放大
  4. 在上一步的输出图像中查找轮廓
  5. 检测区域出现的候选轮廓
  6. 保存帧与最终轮廓
# kernel for image dilationkernel = np.ones((4,4),np.uint8)# font stylefont = cv2.FONT_HERSHEY_SIMPLEX# directory to save the ouput framespathIn = "contour_frames_3/"for i in range(len(col_images)-1):    # frame differencing    grayA = cv2.cvtColor(col_images[i], cv2.COLOR_BGR2GRAY)    grayB = cv2.cvtColor(col_images[i+1], cv2.COLOR_BGR2GRAY)    diff_image = cv2.absdiff(grayB, grayA)    # image thresholding    ret, thresh = cv2.threshold(diff_image, 30, 255, cv2.THRESH_BINARY)    # image dilation    dilated = cv2.dilate(thresh,kernel,iterations = 1)    # find contours    contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)    # shortlist contours appearing in the detection zone    valid_cntrs = []    for cntr in contours:        x,y,w,h = cv2.boundingRect(cntr)        if (x <= 200) & (y >= 80) & (cv2.contourArea(cntr) >= 25):            if (y >= 90) & (cv2.contourArea(cntr) < 40):                break            valid_cntrs.append(cntr)    # add contours to original frames    dmy = col_images[i].copy()    cv2.drawContours(dmy, valid_cntrs, -1, (127,200,0), 2)    cv2.putText(dmy, "vehicles detected: " + str(len(valid_cntrs)), (55, 15), font, 0.6, (0, 180, 0), 2)    cv2.line(dmy, (0, 80),(256,80),(100, 255, 255))    cv2.imwrite(pathIn+str(i)+'.png',dmy)
准备视频
在这里,我们为所有帧中的所有移动车辆添加了轮廓。现在是时候堆叠帧并创建视频了:
# specify video namepathOut = 'vehicle_detection_v3.mp4'# specify frames per secondfps = 14.0
接下来,我们将阅读列表中的最后一帧:
frame_array = []files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))]files.sort(key=lambda f: int(re.sub('\D', '', f)))
for i in range(len(files)):    filename=pathIn + files[i]    #read frames    img = cv2.imread(filename)    height, width, layers = img.shape    size = (width,height)    #inserting the frames into an image array    frame_array.append(img)
最后,我们将使用以下代码制作目标检测视频:
out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)for i in range(len(frame_array)):    # writing to a image array    out.write(frame_array[i])out.release()
恭喜你学会了车辆目标检测!

结尾

在本教程中,我们学习了如何使用帧差分技术在视频中执行移动目标检测,讨论了目标检测和图像处理的一些概念,然后用OpenCV建立了自己的运动目标检测系统。 根据本文中学习的技术和方法,试试构建自己版本的目标检测系统吧! 原文链接:https://www.analyticsvidhya.com/blog/2020/04/vehicle-detection-opencv-python/ ☆ END ☆ 如果看到这里,说明你喜欢这篇文章,请 转发、点赞 。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇 高质量博文 (无广告)。 扫描二维码添加小编↓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 轮廓放大_使用OpenCV和Python构建自己的车辆检测模型 的相关文章

  • SW-3配置文件

    CS6200 28X EI config hos SW 3 SW 3 config vlan 10 SW 3 config vlan10 name FB YX SW 3 config vlan10 vlan 20 SW 3 config v
  • 树莓派Raspbian Buster/Debian 10 安装ROS

    目录 一些补充 安装ROS 初始化rosdep 测试 平台 树莓派4B 系统版本 2020 05 27 raspios buster arm64 img 一些补充 系统安装参考 树莓派学习笔记 一 烧录系统 无屏幕 配置Wifi和SSH服务
  • QT 元对象解析 及和其他语言区别

    说Qt信号与槽是一个很好机制 不如说Qt的元对象系统很强大 这也是大家讲Qt就必须将信号与槽 讲信号与槽就要讲Qt的元对象系统 当然初学者知道怎么用就OK啦 当然随着你写的代码越多 接触的平台越多的时候 你就会好奇Qt是如何把两个 多个 任
  • Java程序——检索文件(含内容)

    项目说明 给定一个指定目录和关键字 扫描其中的文件名和文件内容 找到包含关键字的文件 完整代码 import java io File import java io FileInputStream import java io IOExce
  • 利用find命令进行批量操作

    前些天 我要把Linux上的几千个txt文档进行转码 需要用到iconv命令 可是我总不能 一个一个的去敲 文档转码命令 iconv f GBK t UTF 8 file1 o file2 将file1从GBK转为UTF 8 并输出为fil
  • Wireshark抓包体验

    1 嗅探器原理 嗅探技术是网络安全攻防技术中很重要的一种 通过它可以获取网络中的大量信息 与主动扫描相比 嗅探更难以被察觉 能够对网络中的活动进行实时监控 网络嗅探器实际上就是网络中的窃听器 其用途就是捕获分析网络中的数据包 帮助网络管理员
  • CMake方式配置PCL+VS开发环境

    PCL VS安装配置其他方式看下面博客 本文链接 win10 vs2019 pcl1 11 0安装教程 a zhua66的博客 CSDN博客 win10 安装pcl 考虑到配置属性表 xxx props 非常麻烦繁琐 换设备又得重新选择PC
  • 电源设计问题

    目录 一 电源器件 1 法拉电容 二 充电规则 1 充电限制 2 充电时间计算 三 有线充电 四 无线充电 一 电源器件 1 法拉电容 超级电容具有功率密度高 充放电时间短 循环寿命长 工作温度范围宽等显著的优点 适合应用在大功率能量流动的
  • 南京大学《软件分析》笔记01 - 静态分析的基本概念

    Rice s Theorem Any non trivial property of the behavior of programs in a r e language is undecidable r e recursively enu
  • 顺序表初始化

    文章目录 1 顺序表 2 顺序表的初始化 1 顺序表 顺序表 顺序存储结构 存储数据时 会提前申请一整块足够大小的物理空间 然后将数据依次存储到一整块连续的存储空间内 存储时做到数据元素之间不留一丝缝隙 使用顺序表存储集合 1 2 3 4
  • Cheat Engine 教程( 1 - 9 通关 )

    工具包 https down 52pojie cn Tools Debuggers Cheat Engine 官网 https www cheatengine org Cheat Engine v7 5 汉化 https pan aoe t
  • FPGA project : inf_rcv

    module top input wire sys clk input wire sys rst n input wire inf in output wire led output wire ds output wire oe outpu
  • 获取数组的所有子序列

    一个包含n个元素的集合 获取其所有子集 可以采用按位对应法 例如 int array 1 3 2 5 这个集合可以看做1325四位 每一位在子集中要么存在要么不存在 是否的操作我们就考虑二进制的01 一位子序列的情况有 1000 0100
  • 大数据的分布式SQL查询引擎 -- Presto的详细使用

    Presto Distributed SQL Query Engine for Big Data 官网 项目源码 官方文档 目录 1 Presto 概述 2 概念 2 1 服务进程 2 2 数据源 2 3 查询执行模型 3 整体架构 4 P
  • 2.4 【LaTex】数论符号

    文章目录 同余 向下取整 向上取整 整除 进制 对数 数论的文章 写的人是蛮少的 因为数论好像已经成为民科专用数学 因为数论门槛低 上限高 研究成本低 很多问题至今未解决 所以成为了民科首选 在这篇文章 我不可能介绍所有数论使用的符号 所以
  • 查看gcc/g++默认include路径

    转自 http gcc gnu org ml gcc help 2007 09 msg00205 html gcc print prog name cc1plus v g print prog name cc1plus v 例如 CentO
  • 新安装Android Studio创建项目失败解决方法

    一 梗概 第一次安装Android Studio的时候 因为被墙等原因 Gradle总是出错导一直构建不了项目 Failed to open zip file Gradle s dependency cache may be corrupt
  • Delphi / C ++ Builder / Lazarus报表开发:如何直接从代码中保存BPM / JPEG / TIFF / GIF?

    报表生成器FastReport VCL是用于在软件中集成商务智能的现代解决方案 它提供了可视化模板设计器 可以访问最受欢迎的数据源 报告引擎 预览 将过滤器导出为30多种格式 并可以部署到云 Web 电子邮件和打印中 近日 FastRepo
  • Hexo + GitHub 搭建个人博客(三) Hexo配置

    Hexo 博客配置 你可以 在根目录下 config yml 中 修改大部分的配置 网站 参数 描述 title 网站标题 subtitle 网站副标题 description 网站描述 keywords 网站的关键词 支持多个关键词 au

随机推荐

  • TCP/UDP/Socket 通俗讲解

    1 封包和拆包 封包 就是发送数据前把自己本地需要发送的数据包装一下 即把要发送的原始数据附加上接受者可以辨识到自己身份等一些额外信息 有点像寄一封信 信封上填写的寄件人和收件人以及地址 拆包 是接收到对方封包后发送来的数据后 拆出原始信息
  • c++基础2:使用VS2010 创建最简单的MFC应用程序窗体

    1 添加 新建项目 选择 VISUAL C MFC应用程序 确定 下一步 2 在 应用程序类型 中选择 基于对话框 下一步 3 在 用户界面功能 只选择 粗框架 下一步 4 在 高级功能 取消所有选择 下一步 5 生成的类 点击 完成
  • 用Cmake生成opencv_contrib的python接口

    最近在看opencv的Fisherface Eigenface的部分 但具体实现时发现该库包含在opencv的contrib模块里 这个模块是opencv的扩展库 里面包括很多特征的算法 SIFT SURF Adaboost算法 ml还有神
  • Ubuntu 下命令行创建(删除)文件(夹)

    很多时候我们都会在终端进行文件 文件夹的创建与删除 使用快捷键ctrl alt t 打开终端 创建文件 touch a txt 创建文件夹 mkdir NewFolder 删除文件 rm a txt 删除文件夹 rmdir NewFolde
  • php 格式化 字符串

    private function setStringSubstr str len sublen len string strip tags str string preg replace n is string string preg re
  • CentOS使用 wget 命令报错Temporary failure in name resolution 解决方法

    在CentOS中安装Redis时使用wget下载一个文件出现了如下问题 wget http download redis io releases redis 3 0 7 tar gz failed Temporary failure in
  • 煤矿智能化相关50项团体标准征求意见

    智能化煤矿总体架构 原文地址 https chinacs scimall org cn a3651 html 由煤矿智能化创新联盟等单位提出 中国煤炭学会归口 中煤科工集团常州研究院有限公司等单位起草的 煤矿通信接口与协议通用技术要求 50
  • java中序列化与反序列化_Java中的序列化示例

    java中序列化与反序列化 Serialization in Java is the process of converting an object into bytes stream to save it in file Or we ca
  • 图:最小生成树

    一 最小生成树 1 1 生成树的定义 一个连通图的生成树是 个极小的连通子图 它包含图中全部的n个顶点 但只有构成 棵树的n 1条边 连通图和它相对应的 成树 可以 于解决实际生活中的问题 假设A B C 和 D 为 4 座城市 为了 便
  • window服务器上发布net项目,在windows服务器上使用winsw部署spring boot项目

    简介 springboot项目需要在windows上部署 spring官方推荐使用winsw来将springboot项目作为服务运行 参考 安装使用 winsw的使用比较简单 从github上下载 winsw下载 要下载的文件有两个 1 w
  • 《Kotlin从小白到大牛》第22章:Kotlin I/O与文件管理

    第22章 Kotlin I O与文件管理 Kotlin I O 输入与输出 是基于Java I O流技术 但是Java I O流技术使用起来比较繁琐 Kotlin提供了很多扩展 使代码变得简洁 本章介绍Kotlin I O流和文件管理相关知
  • 使用jstack排查线上故障:高CPU占用

    1 前言 一个应用占用CPU很高 除了确实是计算密集型应用之外 通常原因都是出现了死循环 我们以当时出现的实际故障为例 来介绍怎么定位和解决这类问题 2 排查步骤 思路 找出tomcat 进程中使用CPU最高 时间最长的线程 分析堆栈信息
  • Java中栈的实现(1)-使用顺序存储结构(数组)以及实现

    栈和队列其实是与普通的线性发展而来的 为普通的线性表增加一些特殊的限制就可以得到栈和队列了 从功能上看 栈和队列比普通的线性表功能相对弱一点 但是在特殊的场合下 使用栈和队列更有利 例如 编译器在实现函数的调用的时候需要使用栈来存储断点 实
  • js中apply方法的使用详细解析_宿雪家的小镇_新浪博客

    1 对象的继承 一般的做法是复制 Object extendprototype js的实现方式是 复制代码代码如下 Object extend function destination source for property in sour
  • Android平台实现ping功能方案----避过ping数据构建需要root权限的限制

    PingForAndroid C库采用SOCK DGRAM方式构建icmp包 避开raw socket必须root权限的限制 实现ping功能 Github https github com bgylde PingForAndroid pi
  • linux shell 等待输入_shell中获得用户的输入

    有时我们需要shell脚本有更多的交互性 比如我们安装某个linux命令的时候 会提示 N Y 选择安装或者放弃 这时就需要用到shell的read命令 read命令的基本使用 演示代码如下 其中 n表示字符串输出尾端不换行 还可以直接在r
  • R语言 回归诊断几种方法

    回归诊断技术提供了评价回归模型使用性的必要工具 能帮助发现并且纠正问题 有几种方法进行回归诊断 分别是标准方法 car包中的函数 gvlma函数 建议先通过gvlma函数进行验证 如果违反假设条件 再使用其他方法来判断哪些假设没有满足并进行
  • Cloud Run min实例:最小化无服务器的冷启动

    作者 Kelsey Hightower Vinod Ramachandran 无服务器最为优异的一点在于其按需付费的操作模型 可以让用户将服务规模缩减为零 但是对于某些应用程序来说 无服务器对于他们来说没那么重要的原因也在于其模型可以按需缩
  • 春秋云镜 CVE-2022-24112

    春秋云镜 CVE 2022 24112 Apache APISIX batch requests SSRF RCE 漏洞 靶标介绍 Apache Apisix是美国阿帕奇 Apache 基金会的一个云原生的微服务API网关服务 该软件基于O
  • opencv 轮廓放大_使用OpenCV和Python构建自己的车辆检测模型

    概述 你对智慧城市领域有兴趣吗 如果是的话 你会喜欢这个关于实现你自己的车辆检测系统的教程 在深入实现部分之前 我们将首先了解如何检测视频中的移动目标 我们将使用OpenCV和Python构建自动车辆检测器 介绍 关于智慧城市的理念 以及自