(三)DepthAI-python相关接口:OAK Nodes

news2024/11/30 4:57:44

消息快播:OpenCV众筹了一款ROS2机器人rae,开源、功能强、上手简单。来瞅瞅~

编辑:OAK中国
首发:oakchina.cn
喜欢的话,请多多👍⭐️✍
内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。

▌前言

Hello,大家好,这里是OAK中国,我是助手君。

最近在知乎看到有朋友写了depthai python接口相关的内容,内容非常不错。我整理了一下,分享给大家。

本系列一共四篇博客,原文出处:石满@知乎。

▌Nodes API

在这里插入图片描述

在DepthAI中,每个节点提供一个特定的功能,一组可配置的属性和输入输出。

每个节点有零个、一个或多个输入输出。

Node input

节点输入队列是一个消息队列, 它可以连接其他节点的输出。如果输入节点是堵塞模式,当节点输入队列已满时,摄像机上的新消息将无法输入到输入队列中,这就意味着相机将会堵塞并等待发送其消息,直到它可以推送信息到输入队列中。如果相机的previce连接多个输入时,这意味着相同的行为,消息将会依此被推送到每个输入队列中。节点不是堵塞状态,新消息将代替旧消息,这将会消除管道冻结的危险性,但是会丢失部分信息。

Node output

节点输出消息,一些节点有一个可配置的输出信息池。当节点创建一个输出消息时,将会发送消息给特定的节点。池的大小指定了创建和发送消息的对少当其他消息已经在管道当中时。

ColorCamera node

ColorCamera节点是影像帧的来源,通过InputControl和InputConfig在运行的时候控制

pipeline = dai.Pipeline()
cam = pipeline.create(dai.node.ColorCamera)

cam.setPreviewSize(300, 300)
cam.setBoardSocket(dai.CameraBoardSocket.RGB)
cam.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
cam.setInterleaved(False)
cam.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB)

EdgeDetector node

边缘检测通过Sobel滤波器来创建强调边缘的影像

pipeline = dai.Pipeline()
edgeDetector = pipeline.create(dai.node.EdgeDetector)

sobelHorizontalKernel = [[1, 0, -1], [2, 0, -2], [1, 0, -1]]
sobelVerticalKernel = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]]
edgeDetector.initialConfig.setSobelFilterKernels(sobelHorizontalKernel, sobelVerticalKernel)

FeatureTracker node

特征跟踪 检测在一帧影像上的关键点并在下一帧追踪它们。主要通过Harris score or Shi-Tomasi获取有效特征。默认特征个数为320,默认最大特征个数为480,支持720p和480p两个分辨率。

pipeline = dai.Pipeline()
featureTracker = pipeline.create(dai.node.FeatureTracker)

# Set number of shaves and number of memory slices to maximum
featureTracker.setHardwareResources(2, 2)
# Specify to wait until configuration message arrives to inputConfig Input.
featureTracker.setWaitForConfigInput(True)

# You have to use Feature tracker in combination with
# an image frame source - mono/color camera or xlinkIn node

ImageManip node

ImageManip节点用于裁切,旋转矩形区域或者执行不同的影像转换:旋转、镜面、翻转、透视变换等。

pipeline = dai.Pipeline()
manip = pipeline.create(dai.node.ImageManip)

manip.initialConfig.setResize(300, 300)
manip.initialConfig.setFrameType(dai.ImgFrame.Type.BGR888p)

IMU node

内部测试单元节点可以从设备的IMU芯片上获取数据。深度学习设备使用BNO086 9 轴传感器,支持在IMU芯片上的传感器融合。IMU芯片通过SPI和Myraid X(VPU)连结。

pipeline = dai.Pipeline()
imu = pipeline.create(dai.node.IMU)

# enable RAW_ACCELEROMETER and RAW_GYROSCOPE at 100 hz rate
imu.enableIMUSensor([dai.IMUSensor.RAW_ACCELEROMETER, dai.IMUSensor.RAW_GYROSCOPE], 100)
# above this threshold packets will be sent in batch of X, if the host is not blocked and USB bandwidth is available
imu.setBatchReportThreshold(1)
# maximum number of IMU packets in a batch, if it's reached device will block sending until host can receive it
# if lower or equal to batchReportThreshold then the sending is always blocking on device
# useful to reduce device's CPU load  and number of lost packets, if CPU load is high on device side due to multiple nodes
imu.setMaxBatchReports(10)

MobileNetDetectionNetwork node

MobileNet Detection 节点是一个类似于神经网络NeuralNetwork节点。不同的是这个节点是具体的MobileNet神经网络,它解码了神经网络的输出,这以为着这个节点的out不是一个字节数组而是图像检测的结果,方便被代码使用。

pipeline = dai.Pipeline()
mobilenetDet = pipeline.create(dai.node.MobileNetDetectionNetwork)

mobilenetDet.setConfidenceThreshold(0.5)
mobilenetDet.setBlobPath(nnBlobPath)
mobilenetDet.setNumInferenceThreads(2)
mobilenetDet.input.setBlocking(False)

MobileNetSpatialDetectionNetwork node

是MobileNet网络的空间检测,类似于神经网络检测(MobileNetDetectionNetwork)和空间定位(SpatialLocationCalculator)的一个结合。

pipeline = dai.Pipeline()
mobilenetSpatial = pipeline.create(dai.node.MobileNetSpatialDetectionNetwork)

mobilenetSpatial.setBlobPath(nnBlobPath)
# Will ingore all detections whose confidence is below 50%
mobilenetSpatial.setConfidenceThreshold(0.5)
mobilenetSpatial.input.setBlocking(False)
# How big the ROI will be (smaller value can provide a more stable reading)
mobilenetSpatial.setBoundingBoxScaleFactor(0.5)
# Min/Max threshold. Values out of range will be set to 0 (invalid)
mobilenetSpatial.setDepthLowerThreshold(100)
mobilenetSpatial.setDepthUpperThreshold(5000)

# Link depth from the StereoDepth node
stereo.depth.link(mobilenetSpatial.inputDepth)

MonoCamera node

MonoCamera节点是图像帧的来源,可以通过inputControl来控制,一些深度学习的模型没有单目相机。两个单目相机可被用于计算立体深度(通过StereoDepth节点)。

pipeline = dai.Pipeline()
mono = pipeline.create(dai.node.MonoCamera)
mono.setBoardSocket(dai.CameraBoardSocket.RIGHT)
mono.setResolution(dai.MonoCameraProperties.SensorResolution.THE_720_P)

NeuralNetwork node

节点通过输入数据进行神经推理。所有的OpenVINO神经网络都可以通过这个节点运行,只用VPU支持的层。支持从200+Open Model Zoo和DepthAI Model Zoo预训练模型中直接跑它。

神经网络.blob格式可以和VPU兼容。可将自定义的网络模型转换成.blob格式。

pipeline = dai.Pipeline()
nn = pipeline.create(dai.node.NeuralNetwork)
nn.setBlobPath(bbBlobPath)
cam.out.link(nn.input)

# Send NN out to the host via XLink
nnXout = pipeline.create(dai.node.XLinkOut)
nnXout.setStreamName("nn")
nn.out.link(nnXout.input)

with dai.Device(pipeline) as device:
  qNn = device.getOutputQueue("nn")

  nnData = qNn.get() # Blocking

  # NN can output from multiple layers. Print all layer names:
  print(nnData.getAllLayerNames())

  # Get layer named "Layer1_FP16" as FP16
  layer1Data = nnData.getLayerFp16("Layer1_FP16")

  # You can now decode the output of your NN

直通机制

当节点将它的输入指定为非阻塞时,消息会被覆盖,这时直通机制非常有效果。这里我们节点在那条信息上进行的处理(例如nn,推理的第25帧或者跳过了25帧在26帧进行了推理)。这就意味着如果xlink和主机队列正在堵塞,我们获取了直通和输出,我们可以进行一个堵塞处理来获取这两个队列,而且确保这两个队列获得匹配的帧。他们可能不是同时到达,但是它们都会到达,且在正确的位置排队等待被一起取出。

ObjectTracker node

对象跟踪节点从影像中通过kalman滤波器和hungarian算法跟踪目标对象。

pipeline = dai.Pipeline()
objectTracker = pipeline.create(dai.node.ObjectTracker)

objectTracker.setDetectionLabelsToTrack([15])  # Track only person
# Possible tracking types: ZERO_TERM_COLOR_HISTOGRAM, ZERO_TERM_IMAGELESS, SHORT_TERM_IMAGELESS, SHORT_TERM_KCF
objectTracker.setTrackerType(dai.TrackerType.ZERO_TERM_COLOR_HISTOGRAM)
# Take the smallest ID when new object is tracked, possible options: SMALLEST_ID, UNIQUE_ID
objectTracker.setTrackerIdAssignmentPolicy(dai.TrackerIdAssignmentPolicy.SMALLEST_ID)

# You have to use Object tracker in combination with detection network
# and an image frame source - mono/color camera or xlinkIn node

Zero term tracking

Zero term tracking 展示了对象的联系,这意味着它不基于先前跟踪历史来进行预测和跟踪。目标联系意味着从映射了跟踪目标的外部检测器(已经从之前的帧中检测并跟踪)来检测物体。

Short term tracking

Short term tracking允许跟踪帧间的目标,因此减少了在每帧上允许目标检测。这适用于无法达到30fps的神经网络模型,例如yolov5。tracker可以在没有推理的前提下提供tracklets,所以整个系统可以达到30fps的速度。

Supported object tracker types

  • SHORT_TEAM_KCF:内核相关性滤波跟踪。KCF用循环矩阵属性来提升程序的速度
  • SHORT_TEAM_INAGELESS:当对象检测被跳过,允许在帧间跟踪对象通过在先前的检测中外推对象弹道
  • ZERO_TERM_COLOR_HISTOGRAM:利用位置,形状、输入影像信息例如RGB直方图来执行目标跟踪
  • ZERO_TERM_IMAGELESS:只利用检测对象的矩形形状和位置信息来进行目标跟踪。它不用颜色信息来进行目标跟踪。比ZERO_TERM_COLOR_HISTOGRAM获得更高的吞吐量。使用者需要权衡吞吐量和准确率当选择目标跟踪类型时。

Maximum number of tracked objects

short_team_kcf一次性可跟踪60个以内的对象,其他的跟踪类型理论上一次性可跟踪1000个对象。

Script node

允许在设备上使用传统的PYTHON脚本。由于计算资源的约束,脚本节点不能用于大型的计算(例如影像的处理/CV),而是用于管理通道的流程。例如使用控制节点ImageManip,ColorCamera,SpatialLocationCalculator,解码神经网络的结果,或者与GPIOs的接口。对于调试脚本,建议使用Script node logging。

script = pipeline.create(dai.node.Script)
script.setScript("""
    import time
    import marshal
    num = 123
    node.warn(f"Number {num}") # Print to host
    x = [1, "Hello", {"Foo": "Bar"}]
    x_serial = marshal.dumps(x)
    b = Buffer(len(x_serial))
    while True:
        time.sleep(1)
        b.setData(x_serial)
        node.io['out'].send(b)
""")
script.outputs['out'].link(xout.input)

# ...
# After initializing the device, enable log levels
device.setLogLevel(dai.LogLevel.WARN)
device.setLogOutputLevel(dai.LogLevel.WARN)

SpatialLocationCaculator node

空间位置计算节点计算感兴趣区域的空间坐标,基于深度影像。它会平均ROI的深度值,删除超出范围的值。也可以计算在主机端的空间坐标。

pipeline = dai.Pipeline()
spatialCalc = pipeline.create(dai.node.SpatialLocationCalculator)
spatialCalc.setWaitForConfigInput(False)

# Set initial config
config = dai.SpatialLocationCalculatorConfigData()
config.depthThresholds.lowerThreshold = 100
config.depthThresholds.upperThreshold = 10000

topLeft = dai.Point2f(0.4, 0.4)
bottomRight = dai.Point2f(0.6, 0.6)
config.roi = dai.Rect(topLeft, bottomRight)

spatial_calc.initialConfig.addROI(config)

# You can later send configs from the host (XLinkIn) / Script node to the InputConfig

SPIIn node

获取来自MCU的数据(通过SPI)。可以通过MCU控制ColorCamer或ImageManip或通过MCU向脚本节点发送一个Buffer。

SPIOut被用来从YPU向MCU发送数据(通过SPI)。

pipeline = dai.Pipeline()
spi = pipeline.create(dai.node.SPIIn)

spi.setStreamName("control")
spi.setBusId(0)

SPIOut node

用于传输消息到单片机。

pipeline = dai.Pipeline()
spi = pipeline.create(dai.node.SPIOut)

spi.setStreamName("spimetaout")
spi.setBusId(0)

StereoDepth node

通过两个单目相机计算差距或深度。

pipeline = dai.Pipeline()
stereo = pipeline.create(dai.node.StereoDepth)

# Better handling for occlusions:
stereo.setLeftRightCheck(False)
# Closer-in minimum depth, disparity range is doubled:
stereo.setExtendedDisparity(False)
# Better accuracy for longer distance, fractional disparity 32-levels:
stereo.setSubpixel(False)

# Define and configure MonoCamera nodes beforehand
left.out.link(stereo.left)
right.out.link(stereo.right)

SystemLogger node

获取设备系统信息。

pipeline = dai.Pipeline()
logger = pipeline.create(dai.node.SystemLogger)

logger.setRate(1)  # 1 Hz

# Send system info to the host via XLink
xout = pipeline.create(dai.node.XLinkOut)
xout.setStreamName("sysinfo")
logger.out.link(xout.input)

VideoEncoder node

将image frames 编码成H264/H265/JPEG格式。从设备上编码比特流,直接保存.mp4容器不需要在主机上做额外的计算。

pipeline = dai.Pipeline()

# Create ColorCamera beforehand
# Set H265 encoding for the ColorCamera video output
videoEncoder = pipeline.create(dai.node.VideoEncoder)
videoEncoder.setDefaultProfilePreset(cam.getVideoSize(), cam.getFps(), dai.VideoEncoderProperties.Profile.H265_MAIN)

# Create MJPEG encoding for still images
stillEncoder = pipeline.create(dai.node.VideoEncoder)
stillEncoder.setDefaultProfilePreset(cam.getStillSize(), 1, dai.VideoEncoderProperties.Profile.MJPEG)

cam.still.link(stillEncoder.input)
cam.video.link(videoEncoder.input)

Limitations限制

对于H.264/H.265编码,有以下限制:对于编码器每秒有248百万个像素或在30fps上有3840*2160个像素。分辨率和帧的速率可以分给多个流,但每秒所有像素的个数不超过248百万个像素。由于HW的限制,视频编码只能在宽度值为32的倍数的帧上进行-帧的宽度的最大值为4096个像素,最多三个编码流并行。

MJPEG编码器以500M像素每秒的速度可处理163848192分辨率的,在我们的测试中,可以在30fps处理4K,55fps下处理2800p。

编码器的处理资源在H.26X和JPEG上共享。

XLinkIn node

通过XLink从主机上传输数据到设备上。

pipeline = dai.Pipeline()
xIn = pipeline.create(dai.node.XLinkIn)
xIn.setStreamName("camControl")

# Create ColorCamera beforehand
xIn.out.link(cam.inputControl)

with dai.Device(pipeline) as device:
  device.startPipeline()
  qCamControl = device.getInputQueue("camControl")

  # Send a message to the ColorCamera to capture a still image
  ctrl = dai.CameraControl()
  ctrl.setCaptureStill(True)
  qCamControl.send(ctrl)

XLinkOut node

通过XLink从设备上传输数据到主机上。

pipeline = dai.Pipeline()
xOut = pipeline.create(dai.node.XLinkOut)
xOut.setStreamName("camOut")

# Here we will send camera preview (ImgFrame) to the host via XLink.
# Host can then display the frame to the user
cam.preview.link(xOut.input)

YoloDetectionNetwork node

类似于NeuralNetwork。不同的是,这个节点是特定的yoloV3/V4的神经网络,它在设备上对神经网络的结果进行了解码,这就意味着这个节点的out不是一个NNData,而是ImgDetection,更容易被代码使用。

pipeline = dai.Pipeline()
yoloDet = pipeline.create(dai.node.YoloDetectionNetwork)
yoloDet.setBlobPath(nnBlobPath)

# Yolo specific parameters
yoloDet.setConfidenceThreshold(0.5)
yoloDet.setNumClasses(80)
yoloDet.setCoordinateSize(4)
yoloDet.setAnchors([10,14, 23,27, 37,58, 81,82, 135,169, 344,319])
yoloDet.setAnchorMasks({"side26": [1, 2, 3], "side13": [3, 4, 5]})
yoloDet.setIouThreshold(0.5)

YoloSpatialDetectionNetwork node

对YOLO NN网络进行空间检测,类似于YoloDetectionNetworkandSpatialLocationCalculator的一个集合。

pipeline = dai.Pipeline()
yoloSpatial = pipeline.create(dai.node.YoloSpatialDetectionNetwork)
yoloSpatial.setBlobPath(nnBlobPath)

# Spatial detection specific parameters
yoloSpatial.setConfidenceThreshold(0.5)
yoloSpatial.input.setBlocking(False)
yoloSpatial.setBoundingBoxScaleFactor(0.5)
yoloSpatial.setDepthLowerThreshold(100) # Min 10 centimeters
yoloSpatial.setDepthUpperThreshold(5000) # Max 5 meters

# Yolo specific parameters
yoloSpatial.setNumClasses(80)
yoloSpatial.setCoordinateSize(4)
yoloSpatial.setAnchors([10,14, 23,27, 37,58, 81,82, 135,169, 344,319])
yoloSpatial.setAnchorMasks({ "side26": [1,2,3], "side13": [3,4,5] })
yoloSpatial.setIouThreshold(0.5)

▌参考资料

https://docs.oakchina.cn/en/latest/
https://www.oakchina.cn/selection-guide/


OAK中国
| OpenCV AI Kit在中国区的官方代理商和技术服务商
| 追踪AI技术和产品新动态

戳「+关注」获取最新资讯↗↗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[MySQL]-压力测试_TPCC-MySQL

[MySQL]-压力测试_TPCC-MySQL 森格 | 2022年10月 对数据库学习来说,压力测试也是十分必要的一环,本文章主要介绍了TPCC-MySQL这个工具的使用。 一、基本概念 1.1 基准测试VS压力测试 基准测试: 直接简单、易于比较,用于评估服务…

CAD必练图形

这次我们用CAD梦想画图软件绘制一个CAD新手必练图形,它用到的有CAD矩形、直线、圆弧、等分等命令结合起来完成绘制的,可以跟着一起操作一下。 目标图形 操作步骤 1.使用CAD矩形命令(快捷键:REC)绘制一个长80宽30的矩…

为什么macbook不能删除u盘里东西?苹果电脑如何删除u盘文件

为什么macbook不能删除u盘里东西?有时候,我们会发现U盘不能够在Mac上正常使用,只能够读取U盘上的文件数据,但是若想要对其进行删除或者是编辑操作,完全不能够实现,本文为大家详细介绍了不同情况的不同解决方…

云原生主题学习月|共同学习全球领先的亚马逊云科技云原生课程,组团共学拿奖励~

CSDN 已上线亚马逊云科技超过 60 门中文数字化培训课程,希望为学习者提供亚马逊云科技基础技能知识和最佳实践。 每门课程时长从十分钟到几小时不等,由亚马逊云科技专家打造,其中包括最受欢迎的《亚马逊云科技云从业者必修知识》&#xff0c…

vue3发送验证码倒计时 (防止连点、封装复用)

一、实现思路 倒计时 流程图二、实现一个简单的验证码倒计时 //倒计时初始变量 const codeNum ref(60); // 定时器id let clearId: number; // 发送验证码 const sendCode async () > { // 防止下次点击 如果倒计时的时间不是60 就不执行下面逻辑if (codeNum.value ! 60)…

AcWing算法学习第三节---高精度问题.

系列文章目录 第一节快速排序 第二节二分法 学习路上的风景,我陪你一起去看,编程路上的算法,我陪你一起去学,朋友们你们好,我是夏目浅石,蟹蟹你点开文章和我一同进步,加油!遇见更好…

2022Q3手机配件增长榜:手机壳、数据线等供求不断增加

本篇我们将继续来分析22年Q3季度中手机通讯行业的高增长概念。在手机通讯行业中,我们发现了3个高增长品类,分别是:手机耳机、手机壳、数据线。 一、手机配件类高增长概念——手机耳机 手机耳机可以分为不同种类,如:开放…

现代物流有哪些特点?

现代物流的特点有系统化、网络化、信息化、专用化和准时性和柔性化。 现代物流特点一:系统化 现代物流强调了物流体系是一个具有综合性和系统性的过程,以优化物流管理体系为目标,降低物流运营管理成本,实现企业效益提升&#xff0…

python笔记76-types.FunctionType 动态创建函数

前言 types.FunctionType 创建函数有2种方式: 从已有函数的基础上,创建一个新函数从一个compile 构建的函数对象上,创建一个新函数 FunctionType 使用 FunctionType 可以用于判断一个对象是不是函数 from types import FunctionType, Me…

中国互联网综合实力100强:猿辅导第39

11月2日,中国互联网企业综合实力指数发布会暨百家企业高峰论坛在厦门成功举办。发布会上,中国互联网协会正式发布了《中国互联网企业综合实力指数(2022)》以及2022年中国互联网综合实力前百家企业榜单。 北京猿力教育科技有限公司…

腾讯基础面

传送门1. 有了解过C吗?接受转语言吗?2. 有没有了解过一些框架的底层原理、底层优化、数据库的索引优化3. 了解过哪些Map,可以从底层简单说下嘛?4. 你项目中是如何去实现幂等性的?5. RPC的协议讲一讲,怎么处…

开源共建 | TIS整合数据同步工具ChunJun,携手完善开源生态

TIS整合ChunJun实操 B站视频: https://www.bilibili.com/video/BV1QM411z7w5/?spm_id_from333.999.0.0 一、ChunJun 概述 ChunJun是一款易用、稳定、高效的批流统一的数据集成框架,可基于实时计算引擎Flink实现多种异构数据源之间的数据同步与计算&…

MySQL日志管理、备份与恢复

文章目录一、mysql常用日志1、概述①、错误日志②、二进制日志③、中继日志④、慢查询日志⑤、通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的2、数据库中查询日志状态①、查看二进制日志开启状态②、查看慢查询日志功能是否开启③、查看慢查…

FPGA书籍

1、Xilinx FPGA 权威设计指南 本书系统地介绍了Xilinx新一代集成开发环境Vivado 2018的设计方法、设计流程和具体实现。 全书共11章,内容包括Xilinx新一代UltraScale结构、Vivado集成设计环境导论、Vivado工程模式基本设计实现、Vivado非工程模式基本设计实现、创建…

Java-1129

Java8 新特性 速度更快代码更少(lambda、stream)强大的Stream API便于并行最大化减少空指针异常Optional 速度更快:对底层数据结构哈希map的优化 解释说明hashmap基本原理 hashmap本质是一个长度16的数组元素的键值对以key:valu…

强化学习实战——Motion Imitation环境配置+所遇问题(win10)

GitHub代码 注意:本篇环境配置是基于上一篇强化学习实战——OpenAI Gym环境配置实战演示(win10)环境的延续!!! 一、环境配置 1)下载requirements.txt内安装包 问题1:pybullet不能…

天图资本通过香港上市聆讯:上半年利润下滑24%,王永华为董事长

11月29日,深圳市天图投资管理股份有限公司(下称“天图投资”)通过港交所聆讯并在港交所递交了聆讯后资料集(即招股书)。相较于此前招股书,天图资本补充了截至2022年6月30日的财务数据等信息。 招股书显示&a…

哪个牌子蓝牙耳机打电话清晰?通话最清晰的蓝牙耳机推荐

随着蓝牙耳机的普及,越来越多的数码产品如笔记本、平板等都要配有蓝牙耳机,因此,市场对于大电视、多用途、高性能的无线蓝牙耳机的需求不断扩张。蓝牙耳机再这几年不但才音质上采用了最新的技术,通话方面也有改进,下面…

测试开发之路,我在大厂做测试这四年的感悟

开篇 当开始写这篇文章时候,才感受到人生如白驹过隙,4 年时间飞逝,自己也从一个初入职场小白到能肩负项目核心事务的测试开发。在这里,总结 4 年来的心智成长之路,也是借机互相交流,并无对错之争&#xff…

Java web 项目Tamcat在IDEA控制台输出乱码

遇到乱码问题怎么解决呢? 出现乱码其实就是编码格式有问题,设置一下呗,我们先查看一下编码格式,在改一下 1.查看编码格式 首选进入Tamcat安装的根目录 进入conf目录 找到logging.prooperties文件并打开 查看编码格式 编码格式为…