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

基于python实现一个二维图片的路径规划问题

一、场景

基于如下的一个楼层平面图,假设有几个预置的点(实际项目中可能是动态的点,比如找车位,找工位),做路径规划,并画在平面图上

二、方案

1.准备平面室内图

可以自己用QGIS/cad等其他方式自己画,或者看是否有现成的

2.将室内图转换为可计算的栅格数据或矢量数据

这里就是借助于OpenCV+python

  • 栅格地图:

就是用个黑白像素表示可以行走的区域(白)与障碍物(黑)

适合简单场景

  • 矢量路网:

用节点和变构成图结构,适合复杂场景

矢量路网:适合路径规划,GIS分析,存储道路的几何信息

二值图像:适合图像处理,只有黑白两种像素值

3.实现寻路算法

有现成的路径规划库,比如A*算法,networkX算法等

栅格地图+A*算法

矢量地图+NetworkX算法

三、实现步骤

1.扫描地图,处理后得到二值图像

2.栅格地图处理

3.矢量路网生成

4.定义关键路径点

5.使用A*算法进行路径规划

四、代码

import cv2
import networkx
import numpy as np
import matplotlib.pyplot as plt
import heapqimport skimage
from scipy import ndimage
import geopandas as gpd
from shapely.geometry import LineString# 室内路径规划
class IndoorPathPlanning:def __init__(self):self.map_image = Noneself.original_map = Noneself.grid_map = Noneself.vector_network = Noneself.key_points = {}self.graph = Noneself.cell_size = 1  # 默认单元格大小def scan_real_map(self, image_path):"""扫描真实地图并加载为图像参数:image_path: 地图图像的路径返回:处理后的二值图像"""print("步骤1: 扫描真实地图")# 读取图像self.map_image = cv2.imread(image_path)if self.map_image is None:raise ValueError(f"无法读取图像: {image_path}")# 保存原始图像的副本self.original_map = self.map_image.copy()# 转换为灰度图gray_map = cv2.cvtColor(self.map_image, cv2.COLOR_BGR2GRAY)# 应用阈值分割得到二值图像_, binary_map = cv2.threshold(gray_map, 127, 255, cv2.THRESH_BINARY)# 显示结果 这里如果不指定是默认字体,没有就报错,用于画图的字体指定plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'FangSong']  # 汉字字体,优先使用楷体,如果找不到楷体,则使用黑体plt.rcParams['font.size'] = 12  # 字体大小plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号plt.figure(figsize=(10, 8))plt.imshow(cv2.cvtColor(self.map_image, cv2.COLOR_BGR2RGB))plt.title('原始地图')plt.savefig('original_map.png')return binary_mapdef process_grid_map(self, binary_map, cell_size=10, obstacle_dilation=5):"""处理二值图像为栅格地图参数:binary_map: 二值图像cell_size: 栅格单元大小obstacle_dilation: 障碍物膨胀像素数返回:处理后的栅格地图 (0表示可通行,1表示障碍物)"""print("步骤2: 栅格地图处理")# 保存单元格大小,用于后续坐标转换self.cell_size = cell_size# 反转二值图,使障碍物为1,可通行区域为0inverted_map = cv2.bitwise_not(binary_map) // 255# 对障碍物进行膨胀处理,确保机器人不会撞到障碍物kernel = np.ones((obstacle_dilation, obstacle_dilation), np.uint8)dilated_map = cv2.dilate(inverted_map, kernel, iterations=1)# 根据单元格大小调整栅格地图的分辨率height, width = dilated_map.shapegrid_height = height // cell_sizegrid_width = width // cell_size# 创建栅格地图self.grid_map = np.zeros((grid_height, grid_width), dtype=np.uint8)# 将原始图像映射到栅格地图 就是0可通行 1不可同通行for i in range(grid_height):for j in range(grid_width):cell = dilated_map[i * cell_size:(i + 1) * cell_size, j * cell_size:(j + 1) * cell_size]# 如果单元格中有任何障碍物,将其标记为不可通行if np.any(cell):self.grid_map[i, j] = 1# 显示栅格地图plt.figure(figsize=(10, 8))plt.imshow(self.grid_map, cmap='binary')plt.title('栅格地图')plt.savefig('grid_map.png')return self.grid_map# 添加一个新方法用于栅格坐标转换为原图坐标def grid_to_original_coords(self, grid_point):"""将栅格地图上的坐标转换为原始图像上的坐标参数:grid_point: 栅格地图上的坐标 (行, 列)返回:原始图像上的坐标 (y, x)"""return (grid_point[0] * self.cell_size + self.cell_size // 2,grid_point[1] * self.cell_size + self.cell_size // 2)def generate_vector_network(self, output_shapefile="vector_network.shp"):"""生成矢量路网参数:output_shapefile: 输出的shapefile文件路径返回:矢量路网图"""print("步骤3: 矢量路网生成")# 使用距离变换找到空闲空间的中心线dist_transform = ndimage.distance_transform_edt(1 - self.grid_map)# 使用骨架化算法提取中心线skeleton = skimage.morphology.skeletonize(1 - self.grid_map)# 将骨架转换为图像skeleton_img = skeleton.astype(np.uint8) * 255# 找到骨架上的所有点points = np.column_stack(np.where(skeleton_img > 0))# 创建一个图结构来表示路网self.graph = networkx.Graph()# 将所有骨架点添加到图中for point in points:self.graph.add_node((point[0], point[1]))# 将相邻的骨架点连接起来for point in points:y, x = point# 检查8个相邻方向for dy in [-1, 0, 1]:for dx in [-1, 0, 1]:if dy == 0 and dx == 0:continueny, nx = y + dy, x + dxif 0 <= ny < skeleton.shape[0] and 0 <= nx < skeleton.shape[1] and skeleton[ny, nx]:# 计算欧几里得距离作为边的权重weight = np.sqrt(dy ** 2 + dx ** 2)self.graph.add_edge((y, x), (ny, nx), weight=weight)# 将路网保存为shapefile格式# 创建线要素列表lines = []for u, v, data in self.graph.edges(data=True):# 创建一个从点u到点v的线要素line = LineString([(u[1], u[0]), (v[1], v[0])])lines.append({'geometry': line,'weight': data['weight']})# 创建GeoDataFrameif lines:gdf = gpd.GeoDataFrame(lines, geometry='geometry', crs="EPSG:4326")# 保存为shapefilegdf.to_file(output_shapefile)# 显示结果 这里如果不指定是默认字体,没有就报错,用于画图的字体指定plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'FangSong']  # 汉字字体,优先使用楷体,如果找不到楷体,则使用黑体plt.rcParams['font.size'] = 12  # 字体大小plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号# 可视化路网plt.figure(figsize=(10, 8))plt.imshow(skeleton, cmap='gray')plt.title('矢量路网')plt.savefig('vector_network.png')self.vector_network = skeletonreturn skeletondef define_key_points(self, points_dict):"""定义路径关键点参数:points_dict: 字典,键为点的名称,值为(行, 列)坐标返回:关键点字典"""print("步骤4: 定义路径关键点")self.key_points = points_dict# 可视化关键点plt.figure(figsize=(10, 8))plt.imshow(self.grid_map, cmap='binary')# 在图上标记关键点for name, point in self.key_points.items():plt.plot(point[1], point[0], 'ro', markersize=8)plt.text(point[1] + 2, point[0] + 2, name, color='red', fontsize=12)plt.title('路径关键点')plt.savefig('key_points.png')# 可视化关键点在原始地图上original_img = self.original_map.copy()# 在原图上标记关键点for name, grid_point in self.key_points.items():# 转换栅格坐标到原图坐标orig_point = self.grid_to_original_coords(grid_point)# 绘制点cv2.circle(original_img, (orig_point[1], orig_point[0]), 5, (0, 0, 255), -1)# 添加文本cv2.putText(original_img, name, (orig_point[1] + 10, orig_point[0] + 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)# 显示和保存plt.figure(figsize=(10, 8))plt.imshow(cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB))plt.title('原始地图上的路径关键点')plt.savefig('key_points_original.png')return self.key_pointsdef find_path_a_star(self, start_point_name, end_point_name):"""使用A*算法在栅格地图上寻找最短路径参数:start_point_name: 起点名称end_point_name: 终点名称返回:最短路径的坐标列表"""print(f"步骤5: 使用A*算法寻找从{start_point_name}到{end_point_name}的路径")if start_point_name not in self.key_points or end_point_name not in self.key_points:raise ValueError(f"起点或终点不在关键点列表中")start = self.key_points[start_point_name]goal = self.key_points[end_point_name]# 定义启发函数(曼哈顿距离)def heuristic(a, b):return abs(a[0] - b[0]) + abs(a[1] - b[1])# A*算法实现open_set = []heapq.heappush(open_set, (0, start))came_from = {}g_score = {start: 0}f_score = {start: heuristic(start, goal)}open_set_hash = {start}while open_set:current = heapq.heappop(open_set)[1]open_set_hash.remove(current)if current == goal:# 重建路径path = []while current in came_from:path.append(current)current = came_from[current]path.append(start)path.reverse()# 可视化路径plt.figure(figsize=(10, 8))plt.imshow(self.grid_map, cmap='binary')# 绘制路径path_y = [p[0] for p in path]path_x = [p[1] for p in path]plt.plot(path_x, path_y, 'b-', linewidth=2)# 标记起点和终点plt.plot(start[1], start[0], 'go', markersize=10)plt.plot(goal[1], goal[0], 'ro', markersize=10)plt.title(f'从{start_point_name}到{end_point_name}的A*路径规划')plt.savefig('astar_path.png')# 2. 可视化路径在原始地图上original_img = self.original_map.copy()# 将栅格路径转换为原始图像坐标original_path = [self.grid_to_original_coords(p) for p in path]# 在原图上绘制路径for i in range(len(original_path) - 1):pt1 = (original_path[i][1], original_path[i][0])pt2 = (original_path[i + 1][1], original_path[i + 1][0])cv2.line(original_img, pt1, pt2, (0, 255, 0), 2)# 标记起点和终点start_orig = self.grid_to_original_coords(start)goal_orig = self.grid_to_original_coords(goal)cv2.circle(original_img, (start_orig[1], start_orig[0]), 8, (0, 255, 0), -1)cv2.circle(original_img, (goal_orig[1], goal_orig[0]), 8, (0, 0, 255), -1)# 添加起点终点文本cv2.putText(original_img, start_point_name, (start_orig[1] + 10, start_orig[0] + 10),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)cv2.putText(original_img, end_point_name, (goal_orig[1] + 10, goal_orig[0] + 10),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 显示和保存plt.figure(figsize=(12, 10))plt.imshow(cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB))plt.title(f'原始地图上从{start_point_name}到{end_point_name}的A*路径')plt.savefig('astar_path_original.png')return path# 检查8个相邻方向的邻居for dy in [-1, 0, 1]:for dx in [-1, 0, 1]:if dy == 0 and dx == 0:continueneighbor = (current[0] + dy, current[1] + dx)# 检查是否在栅格地图范围内if (0 <= neighbor[0] < self.grid_map.shape[0] and0 <= neighbor[1] < self.grid_map.shape[1]):# 检查是否是障碍物if self.grid_map[neighbor[0], neighbor[1]] == 1:continue# 计算距离(对角线距离为1.414,直线距离为1)dist = np.sqrt(dy ** 2 + dx ** 2)tentative_g_score = g_score.get(current, float('inf')) + distif tentative_g_score < g_score.get(neighbor, float('inf')):# 找到了更好的路径came_from[neighbor] = currentg_score[neighbor] = tentative_g_scoref_score[neighbor] = tentative_g_score + heuristic(neighbor, goal)if neighbor not in open_set_hash:heapq.heappush(open_set, (f_score[neighbor], neighbor))open_set_hash.add(neighbor)# 如果没有找到路径print(f"无法找到从{start_point_name}到{end_point_name}的路径")return Nonedef visualize_complete_system(self, path=None):"""可视化整个系统,包括栅格地图、矢量路网和路径参数:path: 可选,要显示的路径"""plt.figure(figsize=(12, 10))# 显示栅格地图plt.imshow(self.grid_map, cmap='binary', alpha=0.5)# 显示矢量路网if self.vector_network is not None:y, x = np.where(self.vector_network > 0)plt.scatter(x, y, color='blue', s=1, alpha=0.5)# 显示关键点for name, point in self.key_points.items():plt.plot(point[1], point[0], 'ro', markersize=8)plt.text(point[1] + 2, point[0] + 2, name, color='red', fontsize=12)# 显示路径if path:path_y = [p[0] for p in path]path_x = [p[1] for p in path]plt.plot(path_x, path_y, 'g-', linewidth=3)plt.title('栅格地图上的完整系统')plt.savefig('complete_system_grid.png')# 2. 在原始地图上可视化if self.original_map is not None:original_img = self.original_map.copy()# 显示关键点for name, grid_point in self.key_points.items():orig_point = self.grid_to_original_coords(grid_point)cv2.circle(original_img, (orig_point[1], orig_point[0]), 5, (0, 0, 255), -1)cv2.putText(original_img, name, (orig_point[1] + 10, orig_point[0] + 10),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)# 显示路径if path:original_path = [self.grid_to_original_coords(p) for p in path]for i in range(len(original_path) - 1):pt1 = (original_path[i][1], original_path[i][0])pt2 = (original_path[i + 1][1], original_path[i + 1][0])cv2.line(original_img, pt1, pt2, (0, 255, 0), 2)# 显示结果 这里如果不指定是默认字体,没有就报错,用于画图的字体指定plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'FangSong']  # 汉字字体,优先使用楷体,如果找不到楷体,则使用黑体plt.rcParams['font.size'] = 12  # 字体大小plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号# 显示和保存plt.figure(figsize=(12, 10))plt.imshow(cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB))plt.title('原始地图上的完整系统')plt.savefig('complete_system_original.png')plt.show()# 示例使用
def main():# 创建路径规划系统planner = IndoorPathPlanning()# 1. 扫描真实地图binary_map = planner.scan_real_map('1.jpg')# 2. 栅格地图处理grid_map = planner.process_grid_map(binary_map, cell_size=5)# 3. 矢量路网生成skeleton = planner.generate_vector_network()# 4. 定义路径关键点key_points = {'A': (20, 20),'C': (50, 80),'D': (100, 100),'E': (110, 50),'F': (70, 80),'B': (110, 20)}planner.define_key_points(key_points)# 5. 使用A*算法进行路径规划path = planner.find_path_a_star('A', 'B')# 可视化整个系统planner.visualize_complete_system(path)if __name__ == "__main__":main()

五、下一步计划

下一步计划研究如果不是平面二维图,而是三维楼层文件,该如何处理路径的规划问题

相关文章:

基于python实现一个二维图片的路径规划问题

一、场景 基于如下的一个楼层平面图&#xff0c;假设有几个预置的点&#xff08;实际项目中可能是动态的点&#xff0c;比如找车位&#xff0c;找工位&#xff09;&#xff0c;做路径规划&#xff0c;并画在平面图上 二、方案 1.准备平面室内图 可以自己用QGIS/cad等其他方式…...

云服务器centos 安装hadoop集群

百度 搜索 云服务器centos 安装hadoop 创建Hadoop用户 sudo useradd hadoop -m -s /bin/bash sudo passwd hadoop 123456 下载Hadoop wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz 解压并移动Hadoop到指定目录 tar …...

【k8s】sidecar边车容器

一、Sidecar 模式简介 Sidecar 模式是一种常见的微服务架构设计模式。它通过将附加功能或服务与主应用程序部署在同一容器或主机上&#xff0c;从而实现对主应用程序的增强和扩展。Sidecar 的名称来源于摩托车的边车&#xff0c;它与摩托车紧密相连&#xff0c;为主车提供额外…...

Web漏洞--XSS之订单系统和Shell箱子

本文主要内容 手法 XSS平台使用 XSS工具使用 XSS结合其他漏洞 XSS具体使用场景 某订单系统XSS盲打_平台 某Shell箱子系统XSS盲打_工具 [1]订单系统经典案例 第一个简易攻击流程&#xff08;订单系统&#xff09;&#xff1a;通过平台完成XSS跨站之后&a…...

# 构建词汇表:自然语言处理中的关键步骤

构建词汇表&#xff1a;自然语言处理中的关键步骤 在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;词汇表&#xff08;Vocabulary&#xff09;是文本数据预处理的核心组件之一。它将文本中的单词或字符映射为数值索引&#xff0c;从而让计算机能够理解和处理语言…...

新!在 podman-machine-default 中安装 CUDA、cuDNN、Anaconda、PyTorch 等并验证安装

#工作记录 一、前言 在 Windows 系统开发环境中&#xff0c;Podman Desktop 凭借强大的容器管理与 WSL-Linux 子系统集成能力备受开发者关注。 其中&#xff0c;podman-machine-default 是 Podman Desktop 安装后自带的默认 WSL-Fedora 子系统&#xff0c;支持与显卡通信&am…...

python_BeautifulSoup提取html中的信息

目录 描述&#xff1a; 过程&#xff1a; step one 下载html网页到本地 step two 提取html信息 list_con soup.select(.list-con) [0] li_list list_con.find_all(li) a li.find(span).find(a) title a.get(title) url a.get(href) span li.find(span).find(spa…...

pcd2pgm的launch文件实现

1.新建工作空间和克隆代码 mkdir -p pcd2pgm_launch/src && cd pcd2pgm_launch/src git clone https://github.com/Hinson-A/pcd2pgm_package 2. 编译 cd .. catkin_make -j4 3.修改launch 在launch文件目录下&#xff0c;可以用gedit 打开launch文件&#xff0c…...

Vue里面elementUi-aside 和el-main不垂直排列

先说解决方法 main.js少导包 import element-ui/lib/theme-chalk/index.css; //加入此行即可 问题复现 排查了一个小时终于找出来问题了&#xff0c;建议导包去看官方的文档&#xff0c;作者就是因为看了别人的导包流程导致的问题 导包官网地址Element UI导包快速入门...

论文阅读:2024 ACL ArtPrompt: ASCII Art-based Jailbreak Attacks against Aligned LLMs

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Artprompt: Ascii art-based jailbreak attacks against aligned llms https://www.doubao.com/chat/3846685176618754 https://arxiv.org/pdf/2402.11753 https://github…...

项目maven版本不一致 导致无法下载

路程&#xff1a;打开一个新项目发现&#xff0c;maven加载不了 报错&#xff1a; Error running ‘dataManage [clean]’ No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your s…...

论文阅读:2024 NeurIPS Group Robust Preference Optimization in Reward-free RLHF

Group Robust Preference Optimization in Reward-free RLHF https://www.doubao.com/chat/3870738843518978 https://arxiv.org/pdf/2405.20304 速览 研究动机 传统RLHF忽视群体偏好差异&#xff0c;导致模型对少数群体表现不佳&#xff0c;需提升群体鲁棒性。研究问题 如…...

数据可视化平台产品介绍及功能特色

数据可视化平台是一款适用于高校教学和各领域企业的零门槛可视化工具&#xff0c;能够解决高校数据分析与可视化类课程教学、实训问题。平台通过浏览器即可访问&#xff0c;无需安装客户端。平台内置公式编辑器与指标构建器&#xff0c;学生可通过四则运算、分组聚合等方式衍生…...

MySQL索引优化、SQL分析与运行原理 - Java架构师面试实战

MySQL索引优化、SQL分析与运行原理 - Java架构师面试实战 第一轮提问 面试官&#xff1a;马架构&#xff0c;请问您对MySQL的B树索引有什么理解&#xff1f; 马架构&#xff1a;B树是一种平衡多路查找树&#xff0c;所有的数据节点都存储在叶子节点上。相比于B树&#xff0c…...

C++学习:六个月从基础到就业——STL:函数对象与适配器

C学习&#xff1a;六个月从基础到就业——STL&#xff1a;函数对象与适配器 本文是我C学习之旅系列的第二十九篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第八篇&#xff0c;主要介绍C STL中的函数对象与适配器。查看完整系列目录了解更多内容。 引言 在前面的…...

Linux基础篇、第四章_02磁盘及分区管理fdisk 和 gdisk

题目&#xff1a;Linux 磁盘及分区管理 版本号: 1.0,0 作者: 老王要学习 日期: 2025.04.25 适用环境: Centos7 文档说明 本教程适用于 Centos7 环境&#xff0c;详细介绍 Linux 磁盘及分区管理操作。包含虚拟机添加磁盘的关机与开机添加方法、MBR 和 GPT 两种分区方式特点、…...

火山云的市场竞争

火山云是字节跳动旗下的云计算服务&#xff0c;对吧&#xff1f;那它的竞争对手应该包括国内外的大型云服务提供商。首先&#xff0c;国际市场上&#xff0c;像AWS、Azure、Google Cloud这些巨头肯定是大头。国内的话&#xff0c;阿里云、腾讯云、华为云这些应该都是主要的竞争…...

创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式

创建型设计模式之&#xff1a;简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式 &#xff08;一&#xff09;简单工厂模式 简单工厂模式将对象的实例化过程封装到一个工厂类中&#xff0c;根据输入的条件创建不同类型的对象。 角色划分&#xff1a; 抽象产品…...

【Linux内核设计与实现】第三章——进程管理01

文章目录 1. 引言2. 进程&线程——概念3. 进程控制块/进程描述符(PCB)4. 进程内核栈&#xff08;Kernel Stack&#xff09;4.1. 进程内核栈的定义4.2. thread_info 体系结构相关进程描述4.3. 定位进程描述符(task_struct)和内核栈以及内核栈指针的问题 5. 进程 ID&#xff…...

正大模型视角下的市场结构判断逻辑

正大模型视角下的市场结构判断逻辑 在多数交易策略中&#xff0c;结构识别往往先于方向判断。以正大的数据研判风格为例&#xff0c;其核心逻辑是&#xff1a;价格行为不能孤立解读&#xff0c;必须结合时间与成交效率来判断当前结构的有效性。 例如&#xff0c;一个上涨过程&…...

4.25学习——文件上传之00截断

继昨天学习的基础文件上传内容&#xff0c;进一步学习文件上传的绕过方式 00截断绕过 原理&#xff1a;00截断是操作系统层的漏洞&#xff0c;由于操作系统是C语言或汇编语言编写的&#xff0c;这两种语言在定义字符串时&#xff0c;都是以\0&#xff08;即0x00&#xff09;作…...

黑马Redis(三)黑马点评项目

优惠卷秒杀 一、全局唯一ID 基于Redis实现全局唯一ID的策略&#xff1a; Component RequiredArgsConstructor public class RedisIdWorker {private static final Long BEGIN_TIMESTAMP1713916800L;private static final int COUNT_BITS 32;Resourceprivate final StringRed…...

dedecms织梦arclist标签noflag属性过滤多个参数

织梦dedecms系统arclist标签noflag属性默认是只能过滤一个参数&#xff0c;比如过滤推荐是noflagc&#xff0c;过滤有图片的文章是noflagc&#xff0c;在模板制作过程中&#xff0c;有时候我们为了seo和避免重复&#xff0c;需要过滤多个参数。今天小编就来跟大家讲讲织梦dedec…...

Jira、PingCode、Redmine等18款缺陷管理工具对比评测

本文主要介绍了以下&#xff1a;1. PingCode; 2. Worktile; 3. Jira; 4. Bugzilla; 5. TAPD; 6. 码云; 7. Redmine; 8. Trac; 9. 蓝鲸智云; 10. 阿里云效等等18款缺陷管理工具。 在现代软件开发和项目管理中&#xff0c;缺陷管理工具扮演着至关重要的角色。随着企业对软件质量的…...

京东以图搜图(拍立淘)API接口返回参数详解

京东以图搜图&#xff08;拍立淘&#xff09;API接口的返回参数通常以结构化JSON格式呈现&#xff0c;涵盖商品基础信息、相似度评分、库存状态及扩展字段&#xff0c;以下为关键参数详解及使用建议&#xff1a; 一、核心返回参数解析 状态标识类 status&#xff1a;请求状态…...

LSTM+KNN - 多元数据异常检测 !

大家好!我是我不是小 upper~ 今天想和大家分享一个超实用的案例:如何通过 LSTM 与 KNN 实现多元数据异常检测。 想象一下,在工厂的智能化监控场景中,各类传感器实时采集着温度、湿度、压力等海量数据。我们的目标,就是从中精准识别出设备潜在故障等异常情况。 LSTM 作为时…...

OpenHarmony之电源管理子系统公共事件定义

OpenHarmony之电源管理子系统公共事件定义 电源管理子系统面向应用发布如下系统公共事件&#xff0c;应用如需订阅系统公共事件&#xff0c;请参考公共事件接口文档。 COMMON_EVENT_BATTERY_CHANGED 表示电池充电状态、电平和其他信息发生变化的公共事件的动作。 值&#x…...

angular 实现可编辑可选择复制的表格

这个实现的核心就是ag-grid 当然有类似的库就不必多说&#xff0c;React, Vue和纯h5类似。简单贴一下代码 1.首先是h5部分&#xff0c;就一个id为supply-chain-material-grid-table的div&#xff0c;记住要设置高度 <div class"dki-supply-chain-page-body">…...

组织用户数统计实现

# 完整的组织用户数统计实现 完整的组织用户数统计实现&#xff0c;包括模拟SQL查询、完整的Java代码实现以及详细解释。 ## 1. 模拟SQL查询 假设我们有一个组织表(organization)和用户表(user)&#xff0c;以下是模拟查询SQL&#xff1a; sql -- 获取各组织及其用户数量&a…...

天机学堂day10作业,完善兑换优惠券功能

UserCouponServiceImpl /*** 兑换码兑换优惠券* param code*/TransactionalOverridepublic void exchangeCoupon(String code) {//1、校验code是否为空if (StringUtils.isBlank(code)) {throw new BadRequestException("非法参数&#xff01;");}//2、解析兑换码&…...

Python编程的真谛:超越语法,理解编程本质

你是否也曾陷入这样的误区&#xff1a;学了无数的 Python 语法、刷了几十套题&#xff0c;写起代码却仍然卡顿、举步维艰&#xff1f;这时候你才发现&#xff0c;真正阻碍进步的&#xff0c;从不是语法&#xff0c;而是你对“编程本质”的理解。 如果你只是死记硬背Python的语…...

C语言 函数补充

目录 static和extern函数 1.static和extern函数 static和extern都是C语言中的关键字 static 是 静态的 的意思&#xff0c;可以用来: - 修饰局部变量- 修饰全局变量- 修饰函数 extern 是用来声明外部符号的。 在讲解 static 和 extern 之前再讲一下: 作用域和生命周期。 …...

【AI图像创作变现】04实操路径—插图/绘本/创意图集

引言 如果说头像是“一个角色的起点”&#xff0c;那么插图、绘本和图集就是“这个角色能走多远”。相比于头像这种单图任务&#xff0c;插图类创作更强调批量性、叙事性与风格统一性&#xff0c;它既可以承载故事&#xff0c;也可以构成一套完整的内容产品结构。 这类任务特…...

Lesar: 面向 Lustre/Scade 语言的形式化模型检查工具

在《同步反应式系统》的第一课中&#xff0c;介绍了同步数据流语言 Lustre 生态中的形式化模型检查器 Lesar 的用法。Lesar 可对 lustre v4 语言以及 Scade 语言中部分数据流核心特性进行模型检查。 Lesar 介绍 Lesar 是 Verimag 研发维护的形式化方法模型检查工具。该工具的理…...

告别 “幻觉” 回答:RAG 中知识库与生成模型的 7 种对齐策略

一、引言 大语言模型&#xff08;LLM&#xff09;在文本生成领域展现出惊人能力&#xff0c;但 “幻觉” 问题&#xff08;生成虚构或偏离事实的内容&#xff09;始终是落地应用的核心挑战。检索增强生成&#xff08;RAG&#xff09;通过将外部知识库与 LLM 结合&#xff0c;形…...

【Web应用服务器_Tomcat】一、Tomcat基础与核心功能详解

在 Java Web 应用开发领域&#xff0c;Apache Tomcat 是一座不可或缺的基石。作为一款开源、轻量级的 Servlet 容器和 Web 服务器&#xff0c;Tomcat 以其稳定可靠、易于部署和高度可定制性&#xff0c;被广泛应用于各类 Web 应用的部署与运行。 一、Tomcat 简介​ Tomcat 是…...

Cesium实现地形可视域分析

Cesium实现可视化分析 一、地形可视域主要实现技术(Ray + 地形碰撞检测) Cesium 本身的 Ray 类可以用来执行非常精确的射线检测,我们可以结合地形高度(sample)来逐点检测光线是否与 terrain 相交,从而判断是否可见。 1.1 优势 实时判断每条射线是否被 terrain 遮挡地形…...

Java—— 常见API介绍 第五期

JDK8以后新增的时间相关类 Date类ZoneId&#xff1a;时区Instant&#xff1a;时间戳ZoneDateTime&#xff1a;带时区的时间 日期格式化类 SimpleDateFormat DateTimeFormatter&#xff1a;用于时间的格式化和解析 日历类 Calendar LocalDate&#xff1a;年、月、日LocalTime…...

ViewPager FragmentPagerAdapter在系统杀死应用后重建时UI不刷新的问题

解决方案 通过重写getItemId方法&#xff0c;返回Fragment的hashCode&#xff1a; Override public long getItemId(int position) {/*** 恢复状态重建时&#xff0c;新的 Fragment 不刷新UI。* 原因&#xff1a;instantiateItem 中通过 mFragmentManager.findFragmentByTag(…...

第3讲、大模型如何理解和表示单词:词嵌入向量原理详解

1. 引言 大型语言模型&#xff08;Large Language Models&#xff0c;简称LLM&#xff09;如GPT-4、Claude和LLaMA等近年来取得了突破性进展&#xff0c;能够生成流畅自然的文本、回答复杂问题、甚至编写代码。但这些模型究竟是如何理解人类语言的&#xff1f;它们如何表示和处…...

关于STM32f1新建工程

创建文件夹 首先创建一个存放工程的文件夹&#xff0c;建议建立在D&#xff0c;E盘 新建工程 在kiel5里面 找到刚刚建立的文件夹&#xff0c;然后在此文件夹里面新建一个文件夹用来存放本次工程&#xff0c;文件夹可以根据工程内容所编写&#xff0c;然后给自己工程也就是…...

Linux:进程间通信---匿名管道

文章目录 1. 进程间通信1.1 什么是进程间通信&#xff1f;1.2 为什么进程要进行进程间通信&#xff1f;1.3 怎么实现进程间通信&#xff1f; 2. 匿名管道2.1 匿名管道的原理2.2 匿名管道的系统接口2.3 匿名管道的使用2.4 匿名管道的运用场景 序&#xff1a;在上一篇文章中我们知…...

python代做推荐系统深度学习知识图谱c#代码代编神经网络算法创新

以下是针对推荐系统、深度学习、知识图谱和神经网络算法创新的代码框架及开发建议&#xff0c;适用于C#和Python的跨语言协作项目。以下内容分为几个部分&#xff0c;涵盖技术选型、代码示例和创新方向。 1. 推荐系统&#xff08;Python C#&#xff09; Python部分&#xff0…...

【动手学大模型开发】VSCode 连接远程服务器

Visual Studio Code&#xff08;VSCode&#xff09;是一款由微软开发的免费、开源的现代化代码编辑器。它以其轻量级、高性能和广泛的编程语言支持而受到开发者的青睐。VSCode 的核心特点包括&#xff1a; 跨平台&#xff1a;支持 Windows、macOS 和 Linux 操作系统。扩展市场…...

PostgreSQL 漏洞信息详解

PostgreSQL 漏洞信息详解 PostgreSQL 作为一款开源关系型数据库&#xff0c;其安全漏洞会被社区及时发现和修复。以下是 PostgreSQL 漏洞相关的重要信息和资源。 一、主要漏洞信息来源 1. 官方安全公告 PostgreSQL 安全信息页面&#xff1a;https://www.postgresql.org/sup…...

华为L410上制作内网镜像模板:在客户端配置模板内容

华为L410上制作内网镜像模板&#xff1a;在客户端配置模板内容 在本教程中&#xff0c;我们将继续在华为L410上配置内网镜像模板&#xff0c;具体介绍如何在客户端设置以便于在首次开机时自动安装软件。我们将主要使用WeChat作为示例。 1. 制作镜像模板&#xff0c;开启 rc.l…...

分布式队列对消息语义的处理

在分布式系统中&#xff0c;消息的处理语义&#xff08;Message Processing Semantics&#xff09;是确保系统可靠性和一致性的关键。有三种语义&#xff1a; 在分布式系统中&#xff0c;消息的处理语义&#xff08;Message Processing Semantics&#xff09;是确保系统可靠性和…...

《免费开放”双刃剑:字节跳动Coze如何撬动AI生态霸权与暗涌危机?》

战略动机分析 降低技术门槛为数据采集接口 Coze平台宣称**“30秒无代码生成AI Bot”&#xff0c;大幅降低了企业开发AI应用的技术门槛。任何不懂编程的业务人员都可以通过可视化流程和提示词&#xff0c;在半分钟内搭建聊天机器人或智能代理。这种极低门槛意味着更多企业和个人…...

AI 开发工具提示词集体开源!解锁 Cursor、Cline、Windsurf 等工具的核心逻辑

✨ 前言&#xff1a;提示词&#xff0c;AI 编程工具的灵魂 随着大模型编程能力的迅速提升&#xff0c;AI 编程工具如雨后春笋般涌现&#xff0c;涵盖了从代码编辑器&#xff08;如 Cursor、Windsurf、Cline&#xff09;到应用生成服务&#xff08;如 Lovable、Bolt.new、V0&am…...

MYSQL 常用字符串函数 和 时间函数详解

一、字符串函数 1、​CONCAT(str1, str2, …) 拼接多个字符串。 SELECT CONCAT(Hello, , World); -- 输出 Hello World2、SUBSTRING(str, start, length)​​ 或 ​SUBSTR() 截取字符串。 SELECT SUBSTRING(MySQL, 3, 2); -- 输出 SQ3、LENGTH(str)​​ 与 ​CHAR_LENGTH…...