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

从基础到人脸识别与目标检测

前言

从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。

颜色编码格式,图像格式和视频压缩格式

(1)RGB和BGR:这是两种常见的颜色编码格式,分别代表了红、绿、蓝三原色。不同之处在于,RGB按照红、绿、蓝的顺序存储颜色信息,而BGR按照蓝、绿、红的顺序存储。

rgb8图像格式:常用于显示系统,如电视和计算机屏幕。RGB值以8 bits表示每种颜色,总共可以表示256×256×256=16777216种颜色。例如: (255,0,0) 表示红色,(0,255,0) 表示绿色,(0,0,255) 表示蓝色。
bgr8图像格式:由一些特定的硬件制造商采用,软件方面最著名的就是opencv,其默认使用BGR的颜色格式来处理图像。与RGB不同, (0,0,255) 在BGR中表示红色,(0,255,0) 仍然表示绿色,(255,0,0) 表示蓝色。

在自动驾驶里,使用rgb8图像格式的图像,一般称为原图,是数据量最大的格式,没有任何压缩。(2)(2)YUV:这是另一种颜色编码方法,与RGB模型不同的是,它将图像信息分解为亮度(Y)和色度(U和V)两部分。这种方式更接近于人类对颜色的感知方式。

Y:代表亮度信息,也就是灰阶值。
U:从色度信号中减去Y得到的蓝色信号的差异值。
V:从色度信号中减去Y得到的红色信号的差异值。

YUV颜色编码主要用在电视系统以及视频编解码标准中,在这些系统中,Y通道信息可以单独使用,这样黑白电视机也能接收和显示信号。而彩色信息则通过U和V两个通道传输,只有彩色电视机才能处理。这样设计兼容了黑白电视和彩色电视。YUV色彩空间相比RGB色彩空间,更加符合人眼对亮度和色彩的敏感度,在视频压缩时,可以按照人眼的敏感度对YUV数据进行压缩,以达到更高的压缩比。由于历史和技术的原因,YUV的标准存在多种,例如YUV 4:4:4、YUV 4:2:2和YUV 4:2:0等,这些主要是针对U和V通道的采样方式不同定义的。采样不同,对应的压缩比也不同。

(3)图像压缩格式

jpeg:Joint Photographic Experts Group,是一种常见的用于静态图像的损失性压缩格式,它特别适合于全彩色和灰度图片,被广泛使用。通常情况下,JPEG可以提供10:1到20:1的有损压缩比,根据图像质量自由调整。
png: Portable Network Graphics,PNG是一种无损压缩格式,主要使用了DEFLATE算法。由于这是无损压缩,所以解压缩图像可以完全恢复原始数据。被广泛应用于需要高质量图像的场景,如网页设计、艺术作品等。
bmp:Bitmap,BMP是Windows系统中常用的一种无压缩的位图图像格式,通常会创造出较大的文件。

位图(Bitmap)是一种常见的计算机图形,最小单位是像素,每个像素都包含一定量的信息,如颜色和亮度等。位图图像的一个主要特点就是,在放大查看时,可以看到图像的像素化现象,也就是我们常说的"马赛克"。BMP、JPEG、GIF、PNG等都是常见的位图格式。

(4)H264和H265:这是两个视频压缩格式,也是两种视频编解码标准。以1280*720的摄像头为例,如果是rgb8格式的原图,一帧图像的大小是:

3*1280*720=27648000字节,即2.7648MB

如果是一小时的视频,那将是非常大的数据量,对网络传输,数据存储,都是很大的压力。而H264通过种种帧间操作,可以达到10:1到50:1的压缩比,甚至更高。H265更进一步,压缩比更高,用来解决4K或8K视频的传输。

更具体的原理见:图像编码与 H264 基础知识在自动驾驶领域,图像数据也使用h264格式,主要用于数采和回放,控制数据量。

usb_cam

(1)linux针对摄像头硬件有一套Video for Linux内核驱动框架,对应提供的有命令行工具 v4l2-ctl (Video for Linux 2),可以查看摄像头硬件信息:

ls /dev/video0  //一般video0是笔记本自带摄像头设备文件
v4l2-ctl -d /dev/video0 --all

这里截取了部分关键信息,下面的usb_cam的launch文件将用到:

(2)usb_cam是ros里usb camera的软件包,一般称为ros摄像头驱动,但这是一个应用程序,其调用v4l2并通过ros topic发出图像数据。搞机器视觉,第一步就是要有图。安装并启动usb_cam,查看图像:

sudo apt-get install ros-noetic-usb-cam 
roslaunch usb_cam usb_cam-test.launch
rqt_image_view

usb_cam-test.launch:

<launch><node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >//指定设备文件名,默认是/dev/video0<param name="video_device" value="/dev/video0" />// 宽和高分辨率	<param name="image_width" value="640" /><param name="image_height" value="480" />// 像素编码,可选值:mjpeg,yuyv,uyvy<param name="pixel_format" value="yuyv" /><param name="color_format" value="yuv422p" />// camera坐标系名<param name="camera_frame_id" value="usb_cam" />// IO通道,可选值:mmap,read,userptr,大数据量信息一般用mmap<param name="io_method" value="mmap"/></node><node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">// 指定发出的topic名:/usb_cam/image_raw<remap from="image" to="/usb_cam/image_raw"/><param name="autosize" value="true" /></node>
</launch>

(3)/usb_cam/image_raw的数据结构体:

rostopic info /usb_cam/image_raw
rosmsg show  sensor_msgs/Image

//消息头,每个topic都有
std_msgs/Header header	uint32 seqtime stamp// 坐标系名string frame_id
// 高和宽分辨率
uint32 height
uint32 width
// 无压缩的图像编码格式,包括rgb8,YUV444
string encoding
// 图像数据的大小端存储模式
uint8 is_bigendian
// 一行图像数据的字节数量,作为步长参数
uint32 step
// 存储图像数据的柔性数组,大小是step*height
uint8[] data

/usb_cam/image_raw内容展示:

(4)/usb_cam/image_raw/compressed的数据结构体:

rostopic info /usb_cam/image_raw/compressed
rosmsg show sensor_msgs/CompressedImage

std_msgs/Header headeruint32 seqtime stampstring frame_id
// 压缩的图像编码格式,jpeg,png
string format
uint8[] data

/usb_cam/image_raw/compressed内容展示:

摄像头标定

标定引入

(1)Calibration:翻译过来就是校准和标定。(2)摄像头标定:Camera Calibration是计算机视觉中的一种关键技术,其目的是确定摄像头的内部参数(Intrinsic Parameters)和外部参数(Extrinsic Parameters)。

内部参数:包括焦距、主点坐标以及镜头畸变等因素。这些参数与相机本身的硬件有关,如镜头和图像传感器等,一般由厂家提供。
外部参数:摄像头相对于环境的位置和方向。例如,它可能描述了一个固定摄像头相对于周围环境的姿态或者安装位置。以汽车为例,外参包括各个摄像头之间的关系,摄像头与radar,摄像头与lidar的关系。

(3)汽车各种传感器的之间的相对位置和朝向,用3自由度的旋转矩阵和3自由度的平移向量表示,这些外参由整车厂自己标。一般整车下线之后,进入特定的房间,使用静态标靶、定位器的等高精度设备,完成Camera、radar、Lidar等传感器的标定,称之为产线标定,也叫做下线标定。

笔记本摄像头内参标定

这里我们使用标定常用的标靶图形,完成笔记本摄像头的内参标定。usb_cam可以使用内参标定,避免图像畸变。(1)安装标定功能包(ubuntu20.04+noetic)

sudo apt-get install ros-noetic-camera-calibration

(2)创建 robot_vision 软件包,并标定相关文件

cd ~/catkin_ws/src
catkin_create_pkg robot_vision cv_bridge image_transport sensor_msgs std_msgs geometry_msgs message_generation roscpp rospycd robot_vision 
mkdir doc launch
touch launch/cameta_calibration.launch

标定靶图片:

cameta_calibration.launch:

<launch>// 使用usb_cam包,发出/usb_cam/image_raw图像数据<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" ><param name="video_device" value="/dev/video0" /><param name="image_width" value="640" /><param name="image_height" value="480" /><param name="pixel_format" value="yuyv" /><param name="camera_frame_id" value="usb_cam" /><param name="io_method" value="mmap"/></node>// 使用标定功能包,完成标定。// 参数中,8x6表示横向8个内部角点,竖向有6个// square 是每个棋盘格的边长// /usb_cam/image_raw是监听的图像topic<nodepkg="camera_calibration"type="cameracalibrator.py"name="camera_calibration"output="screen"args="--size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam"/>
</launch>

(3)编译并运行

cd ~/catkin_ws/
catkin_make --source src/robot_vision 
source devel/setup.bash
roslaunch robot_vision cameta_calibration.launch

不断晃动,直到COMMIT按键亮起,然后点击,即可生成标定文件,本人的路径为:/home/mm/.ros/camera_info/head_camera.yaml。

opencv和cv_bridge引入

(1)opencv和cv_bridge

安装opencv(ubuntu20.04+noetic):

sudo apt-get install ros-noetic-vision-opencv libopencv-dev python3-opencv

(2)opencv和cv_bridge的简单架构图如下:

根据这个图,在ros里,处理图像的流程一般是:

    # 第一步:使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式cv_image = cv_bridge.imgmsg_to_cv2(msg, "bgr8")# 第二步:使用opencv进行图像处理。。。# 第三步,再将opencv格式额数据转换成ros image格式的数据ros_image = cv_bridge.cv2_to_imgmsg(cv_image, "bgr8")

(3)在 上节的robot_vision包里,我们新增一个cv_bridge的小样例,主要功能是在捕捉到的图像上打个蓝色的圆标。

本文不深入讲解opencv,推荐一个资料:W3Cschool - OpenCV教程

cv_bridge_test.py:

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
import cv2
from functools import partial
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Imagedef image_cb(msg, cv_bridge, image_pub):# 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式try:cv_image = cv_bridge.imgmsg_to_cv2(msg, "bgr8")except CvBridgeError as e:print(e)# 在opencv的显示窗口中绘制一个圆,作为标记# cv_image.shape返回一个元组,包含图像的行数(高度),列数(宽度)和通道数(通常是3个通道:BGR)(rows, cols, channels) = cv_image.shape# 当图像的宽度和高度都大于60时,才执行画圆标动作if cols > 60 and rows > 60:# 在计算机图像处理中,图像的原点(0,0)通常定义为图像的左上角。(60,60)是圆心的坐标。# 30是圆的半径。# (255,0,0)定义了圆的颜色。在OpenCV中,默认的颜色空间是BGR,所以这其实是绘制了一个蓝色的圆。# -1表示填充圆。如果这个值是正数,则代表绘制的圆的线宽;如果是负数,则代表填充该圆。cv2.circle(cv_image, (60,60), 30, (255,0,0), -1)# 使用Opencv的接口,显示Opencv格式的图像cv2.imshow("ycao: opencv image window", cv_image)cv2.waitKey(3)# 再将opencv格式额数据转换成ros image格式的数据发布try:image_pub.publish(cv_bridge.cv2_to_imgmsg(cv_image, "bgr8"))except CvBridgeError as e:print(e)def main():rospy.init_node("cv_bridge_test")rospy.loginfo("starting cv_bridge_test node")bridge = CvBridge()image_pub = rospy.Publisher("/cv_bridge_image", Image, queue_size=1)bind_image_cb = partial(image_cb, cv_bridge=bridge, image_pub=image_pub)// 订阅/usb_cam/image_raw,然后再回调函数里处理图像,并发布出来rospy.Subscriber("/usb_cam/image_raw", Image, bind_image_cb)rospy.spin()cv2.destroyAllWindows()
if __name__ == "__main__":main()

cv_bridge_test.launch

<launch><node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" ><param name="video_device" value="/dev/video0" /><param name="image_width" value="640" /><param name="image_height" value="480" /><param name="pixel_format" value="yuyv" /><param name="camera_frame_id" value="usb_cam" /><param name="io_method" value="mmap"/></node><nodepkg="robot_vision"type="cv_bridge_test.py"name="cv_bridge_test"output="screen"/><nodepkg="rqt_image_view"type="rqt_image_view"name="rqt_image_view"output="screen"/>
</launch>

(4)编译并运行

cd ~/catkin_ws/
catkin_make --source src/robot_vision 
source devel/setup.bash
roslaunch robot_vision cv_bridge_test.launch

总结

本文主要系统介绍了机器视觉处理的外围知识,引入了opencv和cv_bridge,后面几篇文章,我们将用它们继续丰富 robot_vision 软件包。

相关文章:

从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…...

ArcGIS Pro SDK (二十七)自定义许可

ArcGIS Pro SDK (二十七)自定义许可 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 文章目录 ArcGIS Pro SDK (二十七)自定义许可1 在Config.xaml中添加扩展配置2 在Module1.cs中实现接口IExtensionConfig1 在Config.xaml中添加扩展配置 <modules><inse…...

一、kubernetes k8s

k8s概述: k8s的全称:kubernetes k8s k8s的版本:1.30 1.20------------用的最多的版本&#xff0c;1.18-1.21 1.24------------>k8s的镜像不再使用docker&#xff0c;containerd k8s的作用&#xff1a; 用于自动部署&#xff0c;自动扩展和管理“容器化应…...

C#、.Net 中级高级架构管理面试题杂烩

1、简述值类型和引用类型的区别 存储位置&#xff1a;值类型变量直接存储数据的值&#xff0c;通常存储在栈上&#xff1b;引用类型变量存储的是对象在堆上的引用地址。 内存管理&#xff1a;值类型的内存由系统自动管理&#xff0c;当超出作用域时自动释放&#xff1b;引用类…...

ArrayList和LinkedList有什么区别?在什么情况下使用ArrayList更高效?

ArrayList和LinkedList在Java中是两种常用的数据结构&#xff0c;分别基于数组和链表实现。它们在性能、内存使用和适用场景上各有特点。 ArrayList与LinkedList的主要区别 数据结构&#xff1a; ArrayList&#xff1a;基于动态数组实现&#xff0c;元素存储在连续的内存空间…...

KITE提示词框架:引导大语言模型的高效新工具

大语言模型的应用日益广泛。然而&#xff0c;如何确保这些模型生成的内容在AI原生应用中符合预期&#xff0c;仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发&#xff1a;提示工程原理与实战》一书&#xff08;京东图书&#xff1a;https://item.jd.com/1013604…...

Spring 整合 MyBatis:核心知识点详解

一、Spring 整合 MyBatis 的优势 依赖注入&#xff1a;Spring 的 IOC 容器可以管理 MyBatis 的组件&#xff08;如 SqlSessionFactory、Mapper 接口等&#xff09;&#xff0c;减少手动创建对象的繁琐。 事务管理&#xff1a;Spring 提供了声明式事务管理&#xff0c;可以轻松…...

centos docker安装

一、前置条件 安装gcc和c: yum -y install gcc yum -y install gcc-c 二、卸载旧版本 如果之前安装过Docker&#xff0c;需要先卸载旧版本&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logr…...

推荐一款 免费的SSL,自动续期

支持自动续期 、泛域名 、可视化所有证书时效性 、可配置CDN 的一款工具。免费5个泛域名和1个自动更新。 链接 支持&#xff1a;nginx、通配符证书、七牛云、腾讯云、阿里云、CDN、OSS、LB&#xff08;负载均衡&#xff09; 执行自动部署脚本 提示系统过缺少crontab 安装cro…...

python-leetcode 24.回文链表

题目&#xff1a; 给定单链表的头节点head,判断该链表是否为回文链表&#xff0c;如果是&#xff0c;返回True,否则&#xff0c;返回False 输入&#xff1a;head[1,2,2,1] 输出&#xff1a;true 方法一&#xff1a;将值复制到数组中后用双指针法 有两种常用的列表实现&#…...

利用kali linux 进行自动化渗透测试

本方案旨在自动化创建渗透测试全流程 一、架构 1.智能信息收集体系 class IntelligentOSINT:def __init__(self, target):self.target targetself.intelligence_sources [OSINT_Platforms,DeepWeb_Crawlers, SocialMedia_Trackers,ML_Correlation_Engine]def advanced_col…...

蓝桥杯试题:冒泡排序 选择排序

一、问题描述 在一个神秘的岛屿上&#xff0c;有一支探险队发现了一批宝藏&#xff0c;这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字&#xff0c;代表了其珍贵程度。然而&#xff0c;由于某种神奇的力量&#xff0c;这批宝藏的顺序被打乱了&#xff0c;探险队…...

curl与telnet的区别

协议支持&#xff1a;curl支持多种协议&#xff0c;如HTTP、HTTPS、FTP等&#xff0c;而telnet主要用于基于TCP协议的连接。 功能&#xff1a;curl是一个功能强大的工具&#xff0c;可以用来发送各种HTTP请求、下载文件等&#xff0c;而telnet主要用于在远程服务器上进行简单的…...

防火墙综合练习2

准备阶段 实验拓扑图如下&#xff1a; 试验要求如下&#xff1a; 需求一&#xff1a;完成相关配置 需求二&#xff1a;配置DHCP协议 需求三&#xff1a;防火墙安全区域配置 需求四&#xff1a;防火墙地址组信息 需求五&#xff1a;管理员 需求六&#xff1a;用户认证…...

leetcode_26删除有序数组中的重复项

1. 题意 给定一个重复数组&#xff0c;删除其中的重复项目。 2. 题解 双指针 一个指针指向有序不重复数组的最后一个数&#xff0c;另外一个数遍历整个数组&#xff0c;若两个指针对应用的数不相同&#xff0c;有序数组的指针右移&#xff0c;将数填入。 代码一 class Sol…...

SQLServer的创建,表创建,主键,约束,模糊查询

设置 注意: 设置完成之后 重新启动 创建数据库 注意: 这个目标路径必须要有该文件名的文件夹 -- 指向 master 数据库&#xff0c;告诉它我们要创建一个新的数据库操作了 use master go-- 创建数据库 create database StudentManageDB on primary (-- 以下四个组成部分缺一不可…...

钉钉位置偏移解决,钉钉虚拟定位打卡

虚拟定位打卡工具 一&#xff0c;介绍免费获取工具 一&#xff0c;介绍 提到上班打卡&#xff0c;职场人的内心戏估计能拍成一部连续剧。打卡&#xff0c;这俩字仿佛自带“紧箍咒”&#xff0c;让无数打工人又爱又恨。想象一下&#xff0c;你气喘吁吁地冲进办公室&#xff0c;…...

自有服务与软件包

—— 小 峰 编 程 目录 ​编辑 一、自有服务概述 二、systemctl管理服务命令 1、显示服务 2、查看启动和停止服务 3、服务持久化 三、常用自有服务&#xff08;ntp,firewalld,crond) 1、ntp时间同步服务 1&#xff09;NTP同步服务器原理 2&#xff09;到哪里去找NPT服务…...

PHP之hyperf学习笔记

Hyperf Model,Dao&#xff0c;Service&#xff0c;Contronller 路由 使用文件来配置路由&#xff0c;就是和laravel一样的 Router::addGroup(["middleware" > ["web", "auth"],"namespace" > "Hyperf\HttpServer\Contr…...

C++STL(六)——list模拟

目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…...

Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?

1、两者概述 拦截器&#xff08;Interceptor&#xff09;&#xff1a; 只会拦截那些被 Controller 或 RestController 标注的类中的方法处理的请求&#xff0c;也就是那些由 Spring MVC 调度的请求。过滤器&#xff08;Filter&#xff09;&#xff1a; 会拦截所有类型的 HTTP …...

MySQL查询主从同步状态

在MySQL中&#xff0c;监控和检查主从复制&#xff08;Master-Slave replication&#xff09;的状态是非常重要的&#xff0c;这有助于确保数据的一致性和完整性。以下是一些常用的方法&#xff0c;可以帮助你查询MySQL的主从数据同步状态&#xff1a; 1. 查看主服务器状态 首…...

docker 安装 --在线方式

第一步&#xff1a; #!/bin/bash sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo sudo sed -i -e /mirrors.cloud.aliyuncs.com/d -e /mirrors.aliyuncs.com/d /etc/yum.repos.d/CentOS-Base.repo sudo curl -o /etc/yum.repo…...

Linux系统-centos防火墙firewalld详解

Linux系统-centos7.6 防火墙firewalld详解 1 firewalld了解 CentOS 7.6默认的防火墙管理工具是firewalld&#xff0c;它取代了之前的iptables防火墙。firewalld属于典型的包过滤防火墙或称之为网络层防火墙&#xff0c;与iptables一样&#xff0c;都是用来管理防火墙的工具&a…...

物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统

随着物联网技术的飞速发展&#xff0c;物联网软件开发与应用方向成为了众多开发者关注的焦点。那么&#xff0c;如何在这个领域中脱颖而出呢&#xff1f;本文将为你提供一份详细的学习指南&#xff0c;帮助你从零开始&#xff0c;逐步掌握物联网软件开发与应用的核心技能。 一…...

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…...

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…...

qt widget和qml界面集成到一起

将 Qt Widgets 和 QML 界面集成在一起可以利用 QQuickWidget 或 QQuickView。以下是基本步骤: 使用 QQuickWidget 创建 Qt Widgets 项目: 创建一个基于 Widgets 的应用程序。添加 QQuickWidget: 在你的窗口或布局中添加 QQuickWidget。 例如,可以在 QMainWindow 中使用: …...

mybatis 是否支持延迟加载?延迟加载的原理是什么?

1. MyBatis 是否支持延迟加载&#xff1f; 是的&#xff0c;MyBatis 支持延迟加载。延迟加载的主要功能是推迟数据加载的时机&#xff0c;直到真正需要时再去加载。这种方式能提高性能&#xff0c;尤其是在处理关系型数据时&#xff0c;可以避免不必要的数据库查询。 具体来说…...

MariaDB MaxScale实现mysql8主从同步读写分离

一、MaxScale基本介绍 MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 二、MaxScale实验环境 中间件192.168.121.51MaxScale…...

【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案

建筑设计公司在项目执行过程中&#xff0c;会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求&#xff1a;为了方便内部管理和向客户交付完整的设计方案&#xff0c;公司需要将每个项目文件…...

基于logback+fastjson实现日志脱敏

一、需求背景 日常工作中&#xff0c;必不可免的会将一些敏感信息&#xff0c;如用户名、密码、手机号、身份证号、银行账号等等打印出来&#xff0c;但往往为了安全&#xff0c;这些信息都需要进行脱敏。脱敏实际就是用一些特殊字符来替换部分值。 JSON 和 JSONObject Fastj…...

13.10 统一配置管理中心:TranslationChain 架构的简洁配置管理方案

统一配置管理中心:TranslationChain 架构的简洁配置管理方案 1. 集中式配置文件设计 config/settings.yaml: # 多环境配置开关 env: production # development|test|production# 模型管理中心 models:openai:class: langchain_openai.ChatOpenAIparams...

deepseek大模型集成到idea

1 下载插件 安装CodeGPT打开 IntelliJ IDEA&#xff0c;鼠标点击左上角导航栏&#xff0c;File --> Setting 2 申请API key 3 配置deepseek 在 Settings 界面中的搜索框中&#xff0c;搜索 CodeGPT&#xff0c;路径 Tools --> CodeGPT --> Providers --> 如下一…...

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒&#xff0c;如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡 实战操作 去除权限 要在 Cocos2d-x 开发的游戏中去掉 APK 自带权限&#xff0c;可以按照以下步骤操作&#xff1a; 编辑 AndroidMa…...

gitlab多项目流水线

背景是我有多个项目&#xff0c;希望其中一个项目被触发的时候&#xff0c;联动另外一个项目自动打包。然后我就看文档尝试操作了一下&#xff0c;所以有本文。 官方文档参考&#xff1a;https://gitlab.cn/docs/14.5/jh/ci/pipelines/multi_project_pipelines.html 不知道是不…...

GWO优化决策树回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是模仿灰狼社会的结构与行为模式。 在本…...

2025影视泛目录站群程序设计_源码二次开发新版本无缓存刷新不变实现原理

1. 引言 本设站群程序计书旨在详细阐述苹果CMS泛目录的创新设计与实现&#xff0c;介绍无缓存刷新技术、数据统一化、局部URL控制及性能优化等核心功能&#xff0c;以提升网站访问速度和用户体验。 2. 技术概述 2.1 无缓存刷新技术 功能特点&#xff1a; 内容不变性&#x…...

在Linux上创建虚拟网卡

在 Linux 上创建虚拟网卡可以通过多种方式进行&#xff0c;常见的方式是使用 ip 命令来配置虚拟网卡。以下是一个简单的步骤指南&#xff0c;用于创建虚拟网卡&#xff1a; 步骤 1: 查看现有的网络接口 首先&#xff0c;查看当前网络接口的状态&#xff0c;可以使用以下命令&…...

JVM 类加载子系统在干什么?

JVM 类加载子系统是什么&#xff1f; 类加载子系统&#xff08;Class Loader Subsystem&#xff09;是 JVM 负责 加载、链接和初始化 .class 文件的组件。它的主要作用是将字节码文件加载进 JVM 并准备执行。 类加载器&#xff08;ClassLoader&#xff09;是 字节码的搬运工&…...

STM32的HAL库开发---高级定时器---互补输出带死区实验

一、互补输出简介 互补输出&#xff1a;OCx输出高电平&#xff0c;则互补通道OCxN输出低电平。OCx输出低电平&#xff0c;则互补通道OCxN输出高电平。 带死区控制的互补输出&#xff1a;OCx输出高电平时&#xff0c;则互补通道OCxN过一会再输出输出低电平。这个时间里输出的电…...

AntDesign X 报错:Cannot read properties of undefined (reading ‘_context‘)

解决&#xff1a; Cannot read properties of undefined (reading _context) 报错问题 我是基于umi的前端工程&#xff0c;react版本18.2&#xff0c; package.json,全部安装完之后的 "react": "^18.2.0", "ant-design/x": "^1…...

Day62_补20250210_图论part6_108冗余连接|109.冗余连接II

Day62_20250210_图论part6_108冗余连接|109.冗余连接II 108冗余连接 【把题意转化为并查集问题】 题目 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&am…...

06排序 + 查找(D2_查找(D1_基础学习))

目录 温故而知新 -------------------------------- 讲解一&#xff1a;基础理论 一、什么是查找 二、为什么需要查找 -------------------------------- 讲解二&#xff1a;代码学习 一、顺序查找 1. 算法原理 2. 算法步骤 3. Java代码实现 4. 适用场景 5. 知识小…...

SystemVerilog基础:disable fork语句

相关阅读 SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html?spm1001.2014.3001.5482 一、进程的概念 在学习disable fork语句之前&#xff0c;首先的了解SystemVerilog中的进程概念&#xff1a;进程是一系列可以独立执行的一个或多个表达式。…...

基于钉钉API的连接器实现:企业数据集成与自动化管理

文章目录 概要背景与需求钉钉API概述连接器实现小结 概要 在当今数字化时代&#xff0c;企业面临着海量数据的管理与整合挑战。钉钉作为国内广泛使用的办公协作平台&#xff0c;提供了丰富的API接口&#xff0c;支持企业进行数据集成与自动化管理。本文将介绍如何通过钉钉API实…...

windows server独立部署Qwen2.5-vl-7B

服务器配置信息 CPU&#xff1a;64G GPU&#xff1a;48G&#xff08;RTX 4090&#xff09; 一、使用conda下载模型 Qwen2.5-VL-7B-Instruct conda下载 conda create --name qwen python3.11 conda activate qwen 魔塔社区下载模型 pip install modelscope modelscope downl…...

nginx安装并部署前端项目【包括Linux与Windows系统】

nginx安装并部署前端项目 一、 nginx下载与安装二、 前端项目部署三、 常用命令&注意事项四、 常见问题【持续更新】 一、 nginx下载与安装 ① 下载地址&#xff1a;https://nginx.org/en/download.html ② 下载教程&#xff1a;根据不同操作系统&#xff08;Linux或者Wi…...

pytest生成报告no tests ran in 0.01s

除了基本的环境配置、用例名要以test_开头&#xff0c;有个地方是我自己忽略了&#xff0c;在执行时没有指定用例文件&#xff0c;所以没有找到。 if __name__ __main__:pytest.main(["testcases/test_demo.py","-svq", __file__, --alluredir./allure-r…...

前后端服务配置

1、安装虚拟机&#xff08;VirtualBox或者vmware&#xff09;&#xff0c;在虚拟机上配置centos(选择你需要的Linux版本)&#xff0c;配置如nginx服务器等 1.1 VMware 下载路径Sign In注册下载 1.2 VirtualBox 下载路径https://www.virtualbox.org/wiki/Downloads 2、配置服…...