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

(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练

这里写目录标题

  • 一、colmap解算数据放入高斯
    • 1. 将稀疏重建的文件放入高斯
    • 2. 将稠密重建的文件放入高斯
  • 二、vkitti数据放入高斯

一、colmap解算数据放入高斯

运行Colmap.bat文件之后,进行稀疏重建和稠密重建之后可以得到如下文件结构。
在这里插入图片描述

1. 将稀疏重建的文件放入高斯

按照以下文件结构将colmap中的数据放入高斯中,就可以执行 python train.py -s data/data_blender_60 -m data/data_blender_60/output
在这里插入图片描述

2. 将稠密重建的文件放入高斯

按照以下文件结构将colmap中的数据放入高斯中,
在这里插入图片描述
此时若直接运行train文件会有如下报错:
在这里插入图片描述
意思是没有获取到cameras,点开sparse/0中的cameras文件,发现全是null,此时,**先删除sparse/0中的cameras.bin和images.bin,再将distorted/sparse/0中的cameras.bin和images.bin文件复制到sparse/0中。**实在不行也可以在colmap中重新导出一下模型。

就可以执行 python train.py -s data/data_blender_60 -m data/data_blender_60/output

二、vkitti数据放入高斯

vkitti数据数据格式如下:
在这里插入图片描述
colmap数据数据格式如下(外参数据一定要空一行否则后续不会执行):
在这里插入图片描述
最后我的colmap中目录结构如下:
在这里插入图片描述
先自行创建以下几个文件夹:执行command.bat

@echo off
if not exist created\sparse\model (mkdir created\sparse\modelecho Created directory: created\sparse\model
)
if not exist triangulated\sparse\model (mkdir triangulated\sparse\modelecho Created directory: triangulated\sparse\model
)
if not exist mapper\sparse\model (mkdir mapper\sparse\modelecho Created directory: mapper\sparse\model
)

接下来开始操作:

写了一个程序进行格式转换:vkitti_to_colmap_cameras.py

import numpy as np
from scipy.spatial.transform import Rotationindex = 339 #要转换的图片张数def cameras(input_path, output_path):# 定义一个字典用于存储提取的数据data_dict = {'frame': [], 'cameraID': [], 'PARAMS': []}# 打开文件并读取内容with open(input_path, 'r') as file:lines = file.readlines()[1:]# # 删除 camera=1的行# lines = [line for index, line in enumerate(lines) if index % 2 == 0]# 遍历每一行数据for line in lines:# 分割每一行数据elements = line.split()# 提取frame和cameraIDframe = int(elements[0])cameraID = int(elements[1])if cameraID == 1:continue# 提取PARAMSPARAMS = elements[2:6]# 将提取的数据存入字典data_dict['frame'].append(frame)data_dict['cameraID'].append(frame + 1)data_dict['PARAMS'].append(PARAMS)width = 1242height = 375# 将处理后的内容写回文件# 打开文件以写入数据with open(output_path, 'w') as output_file:# 写入文件头部信息output_file.write("# Camera list with one line of data per camera:\n# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[fx,fy,cx,cy]\n# Number of cameras: 1\n")# 遍历每个数据点for i in range(len(data_dict['frame'])):# 获取相应的数据if data_dict['frame'][i] > index - 1:breakcameraID = data_dict['cameraID'][i]PARAMS = data_dict['PARAMS'][i]fx, fy, cx, cy = PARAMS# 写入数据到文件output_file.write(f"{cameraID} PINHOLE {width} {height} {fx} {fy} {cx} {cy}\n")def images(input_path, output_path):# 定义一个字典用于存储提取的数据data_dict = {'frame': [], 'cameraID': [], 'quaternions': []}# 打开文件并读取内容with open(input_path, 'r') as file:lines = file.readlines()[1:]# 遍历每一行数据for line in lines:# 分割每一行数据elements = line.split()# 提取frame和cameraIDframe = int(elements[0])cameraID = int(elements[1])if cameraID == 1:continue# 提取旋转矩阵部分rotation_matrix = np.array([[float(elements[i]) for i in range(2, 11, 4)],[float(elements[i]) for i in range(3, 12, 4)],[float(elements[i]) for i in range(4, 13, 4)]])# 将旋转矩阵转换为四元数rotation = Rotation.from_matrix(rotation_matrix)quaternion = rotation.as_quat()# 将提取的数据存入字典data_dict['frame'].append(frame)data_dict['cameraID'].append(frame + 1)data_dict['quaternions'].append(quaternion)# 打开文件以写入数据with open(output_path, 'w') as output_file:# 写入文件头部信息output_file.write("# Image list with two lines of data per image:\n# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME\n# POINTS2D[] as (X, Y, POINT3D_ID)\n# Number of images: 339, mean observations per image: 1\n")# 遍历每个数据点for i in range(len(data_dict['frame'])):# 获取相应的数据if data_dict['frame'][i] > index - 1:breakframe = data_dict['frame'][i]cameraID = data_dict['cameraID'][i]quaternion = data_dict['quaternions'][i]# 将四元数和平移向量分开qw, qx, qy, qz = quaterniontx, ty, tz = [float(elem) for elem in lines[i].split()[11:14]]# 写入数据到文件output_file.write(f"{frame + 1} {qw} {qx} {qy} {qz} {tx} {ty} {tz} {cameraID} rgb_{frame:05d}.jpg\n\n")if __name__ == '__main__':input_path = "./intrinsic.txt"output_path = "./cameras.txt"cameras(input_path, output_path)input_path = "./extrinsic.txt"output_path = "./images.txt"images(input_path, output_path)

我的同学写了一个创建数据库的代码 ,这将cameras.txt和images.txt文件中的数据都放入database.db中:create_colmap_database.py

# Copyright (c) 2023, ETH Zurich and UNC Chapel Hill.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#
#     * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
#       its contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.# This script is based on an original implementation by True Price.import sys
import sqlite3
import numpy as npIS_PYTHON3 = sys.version_info[0] >= 3MAX_IMAGE_ID = 2 ** 31 - 1CREATE_CAMERAS_TABLE = """CREATE TABLE IF NOT EXISTS cameras (camera_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,model INTEGER NOT NULL,width INTEGER NOT NULL,height INTEGER NOT NULL,params BLOB,prior_focal_length INTEGER NOT NULL)"""CREATE_DESCRIPTORS_TABLE = """CREATE TABLE IF NOT EXISTS descriptors (image_id INTEGER PRIMARY KEY NOT NULL,rows INTEGER NOT NULL,cols INTEGER NOT NULL,data BLOB,FOREIGN KEY(image_id) REFERENCES images(image_id) ON DELETE CASCADE)"""CREATE_IMAGES_TABLE = """CREATE TABLE IF NOT EXISTS images (image_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name TEXT NOT NULL UNIQUE,camera_id INTEGER NOT NULL,prior_qw REAL,prior_qx REAL,prior_qy REAL,prior_qz REAL,prior_tx REAL,prior_ty REAL,prior_tz REAL,CONSTRAINT image_id_check CHECK(image_id >= 0 and image_id < {}),FOREIGN KEY(camera_id) REFERENCES cameras(camera_id))
""".format(MAX_IMAGE_ID
)CREATE_TWO_VIEW_GEOMETRIES_TABLE = """
CREATE TABLE IF NOT EXISTS two_view_geometries (pair_id INTEGER PRIMARY KEY NOT NULL,rows INTEGER NOT NULL,cols INTEGER NOT NULL,data BLOB,config INTEGER NOT NULL,F BLOB,E BLOB,H BLOB,qvec BLOB,tvec BLOB)
"""CREATE_KEYPOINTS_TABLE = """CREATE TABLE IF NOT EXISTS keypoints (image_id INTEGER PRIMARY KEY NOT NULL,rows INTEGER NOT NULL,cols INTEGER NOT NULL,data BLOB,FOREIGN KEY(image_id) REFERENCES images(image_id) ON DELETE CASCADE)
"""CREATE_MATCHES_TABLE = """CREATE TABLE IF NOT EXISTS matches (pair_id INTEGER PRIMARY KEY NOT NULL,rows INTEGER NOT NULL,cols INTEGER NOT NULL,data BLOB)"""CREATE_NAME_INDEX = ("CREATE UNIQUE INDEX IF NOT EXISTS index_name ON images(name)"
)CREATE_ALL = "; ".join([CREATE_CAMERAS_TABLE,CREATE_IMAGES_TABLE,CREATE_KEYPOINTS_TABLE,CREATE_DESCRIPTORS_TABLE,CREATE_MATCHES_TABLE,CREATE_TWO_VIEW_GEOMETRIES_TABLE,CREATE_NAME_INDEX,]
)def image_ids_to_pair_id(image_id1, image_id2):if image_id1 > image_id2:image_id1, image_id2 = image_id2, image_id1return image_id1 * MAX_IMAGE_ID + image_id2def pair_id_to_image_ids(pair_id):image_id2 = pair_id % MAX_IMAGE_IDimage_id1 = (pair_id - image_id2) / MAX_IMAGE_IDreturn image_id1, image_id2def array_to_blob(array):if IS_PYTHON3:return array.tobytes()else:return np.getbuffer(array)def blob_to_array(blob, dtype, shape=(-1,)):if IS_PYTHON3:return np.fromstring(blob, dtype=dtype).reshape(*shape)else:return np.frombuffer(blob, dtype=dtype).reshape(*shape)class COLMAPDatabase(sqlite3.Connection):@staticmethoddef connect(database_path):return sqlite3.connect(database_path, factory=COLMAPDatabase)def __init__(self, *args, **kwargs):super(COLMAPDatabase, self).__init__(*args, **kwargs)self.create_tables = lambda: self.executescript(CREATE_ALL)self.create_cameras_table = lambda: self.executescript(CREATE_CAMERAS_TABLE)self.create_descriptors_table = lambda: self.executescript(CREATE_DESCRIPTORS_TABLE)self.create_images_table = lambda: self.executescript(CREATE_IMAGES_TABLE)self.create_two_view_geometries_table = lambda: self.executescript(CREATE_TWO_VIEW_GEOMETRIES_TABLE)self.create_keypoints_table = lambda: self.executescript(CREATE_KEYPOINTS_TABLE)self.create_matches_table = lambda: self.executescript(CREATE_MATCHES_TABLE)self.create_name_index = lambda: self.executescript(CREATE_NAME_INDEX)def add_camera(self,model,width,height,params,prior_focal_length=False,camera_id=None,):params = np.asarray(params, np.float64)cursor = self.execute("INSERT INTO cameras VALUES (?, ?, ?, ?, ?, ?)",(camera_id,model,width,height,array_to_blob(params),prior_focal_length,),)return cursor.lastrowiddef add_image(self,name,camera_id,prior_q=np.full(4, np.NaN),prior_t=np.full(3, np.NaN),image_id=None,):cursor = self.execute("INSERT INTO images VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",(image_id,name,camera_id,prior_q[0],prior_q[1],prior_q[2],prior_q[3],prior_t[0],prior_t[1],prior_t[2],),)return cursor.lastrowiddef add_keypoints(self, image_id, keypoints):assert len(keypoints.shape) == 2assert keypoints.shape[1] in [2, 4, 6]keypoints = np.asarray(keypoints, np.float32)self.execute("INSERT INTO keypoints VALUES (?, ?, ?, ?)",(image_id,) + keypoints.shape + (array_to_blob(keypoints),),)def add_descriptors(self, image_id, descriptors):descriptors = np.ascontiguousarray(descriptors, np.uint8)self.execute("INSERT INTO descriptors VALUES (?, ?, ?, ?)",(image_id,) + descriptors.shape + (array_to_blob(descriptors),),)def add_matches(self, image_id1, image_id2, matches):assert len(matches.shape) == 2assert matches.shape[1] == 2if image_id1 > image_id2:matches = matches[:, ::-1]pair_id = image_ids_to_pair_id(image_id1, image_id2)matches = np.asarray(matches, np.uint32)self.execute("INSERT INTO matches VALUES (?, ?, ?, ?)",(pair_id,) + matches.shape + (array_to_blob(matches),),)def add_two_view_geometry(self,image_id1,image_id2,matches,F=np.eye(3),E=np.eye(3),H=np.eye(3),qvec=np.array([1.0, 0.0, 0.0, 0.0]),tvec=np.zeros(3),config=2,):assert len(matches.shape) == 2assert matches.shape[1] == 2if image_id1 > image_id2:matches = matches[:, ::-1]pair_id = image_ids_to_pair_id(image_id1, image_id2)matches = np.asarray(matches, np.uint32)F = np.asarray(F, dtype=np.float64)E = np.asarray(E, dtype=np.float64)H = np.asarray(H, dtype=np.float64)qvec = np.asarray(qvec, dtype=np.float64)tvec = np.asarray(tvec, dtype=np.float64)self.execute("INSERT INTO two_view_geometries VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",(pair_id,)+ matches.shape+ (array_to_blob(matches),config,array_to_blob(F),array_to_blob(E),array_to_blob(H),array_to_blob(qvec),array_to_blob(tvec),),)def example_usage():import osimport argparseparser = argparse.ArgumentParser()parser.add_argument("--database_path", default="database.db")args = parser.parse_args()if os.path.exists(args.database_path):print("ERROR: database path already exists -- will not modify it.")return# Open the database.db = COLMAPDatabase.connect(args.database_path)# For convenience, try creating all the tables upfront.db.create_tables()# Create dummy cameras.model1, width1, height1, params1 = (0,1024,768,np.array((1024.0, 512.0, 384.0)),)model2, width2, height2, params2 = (2,1024,768,np.array((1024.0, 512.0, 384.0, 0.1)),)camera_id1 = db.add_camera(model1, width1, height1, params1)camera_id2 = db.add_camera(model2, width2, height2, params2)# Create dummy images.image_id1 = db.add_image("image1.png", camera_id1)image_id2 = db.add_image("image2.png", camera_id1)image_id3 = db.add_image("image3.png", camera_id2)image_id4 = db.add_image("image4.png", camera_id2)# Create dummy keypoints.## Note that COLMAP supports:#      - 2D keypoints: (x, y)#      - 4D keypoints: (x, y, theta, scale)#      - 6D affine keypoints: (x, y, a_11, a_12, a_21, a_22)num_keypoints = 1000keypoints1 = np.random.rand(num_keypoints, 2) * (width1, height1)keypoints2 = np.random.rand(num_keypoints, 2) * (width1, height1)keypoints3 = np.random.rand(num_keypoints, 2) * (width2, height2)keypoints4 = np.random.rand(num_keypoints, 2) * (width2, height2)db.add_keypoints(image_id1, keypoints1)db.add_keypoints(image_id2, keypoints2)db.add_keypoints(image_id3, keypoints3)db.add_keypoints(image_id4, keypoints4)# Create dummy matches.M = 50matches12 = np.random.randint(num_keypoints, size=(M, 2))matches23 = np.random.randint(num_keypoints, size=(M, 2))matches34 = np.random.randint(num_keypoints, size=(M, 2))db.add_matches(image_id1, image_id2, matches12)db.add_matches(image_id2, image_id3, matches23)db.add_matches(image_id3, image_id4, matches34)# Commit the data to the file.db.commit()# Read and check cameras.rows = db.execute("SELECT * FROM cameras")camera_id, model, width, height, params, prior = next(rows)params = blob_to_array(params, np.float64)assert camera_id == camera_id1assert model == model1 and width == width1 and height == height1assert np.allclose(params, params1)camera_id, model, width, height, params, prior = next(rows)params = blob_to_array(params, np.float64)assert camera_id == camera_id2assert model == model2 and width == width2 and height == height2assert np.allclose(params, params2)# Read and check keypoints.keypoints = dict((image_id, blob_to_array(data, np.float32, (-1, 2)))for image_id, data in db.execute("SELECT image_id, data FROM keypoints"))assert np.allclose(keypoints[image_id1], keypoints1)assert np.allclose(keypoints[image_id2], keypoints2)assert np.allclose(keypoints[image_id3], keypoints3)assert np.allclose(keypoints[image_id4], keypoints4)# Read and check matches.pair_ids = [image_ids_to_pair_id(*pair)for pair in ((image_id1, image_id2),(image_id2, image_id3),(image_id3, image_id4),)]matches = dict((pair_id_to_image_ids(pair_id), blob_to_array(data, np.uint32, (-1, 2)))for pair_id, data in db.execute("SELECT pair_id, data FROM matches"))assert np.all(matches[(image_id1, image_id2)] == matches12)assert np.all(matches[(image_id2, image_id3)] == matches23)assert np.all(matches[(image_id3, image_id4)] == matches34)# Clean up.db.close()if os.path.exists(args.database_path):os.remove(args.database_path)def create_database():import osimport argparseparser = argparse.ArgumentParser()parser.add_argument("--database_path", default="database.db")args = parser.parse_args()# if os.path.exists(args.database_path):#     print("ERROR: database path already exists -- will not modify it.")#     returnif os.path.exists(args.database_path):os.remove(args.database_path)# if not os.path.exists("distorted"):#     os.mkdir("distorted")# Open the database.db = COLMAPDatabase.connect(args.database_path)# For convenience, try creating all the tables upfront.db.create_tables()# Create dummy cameras.camModelDict = {'SIMPLE_PINHOLE': 0,'PINHOLE': 1,'SIMPLE_RADIAL': 2,'RADIAL': 3,'OPENCV': 4,'FULL_OPENCV': 5,'SIMPLE_RADIAL_FISHEYE': 6,'RADIAL_FISHEYE': 7,'OPENCV_FISHEYE': 8,'FOV': 9,'THIN_PRISM_FISHEYE': 10}with open("created/sparse/model/cameras.txt", "r") as cameras_file:cameras_instinct = cameras_file.read().replace("\n", "")passcameras_instinct = cameras_instinct.split(" ")# print(cameras_instinct)model1 = camModelDict[cameras_instinct[1]]width1, height1 = int(cameras_instinct[2]), int(cameras_instinct[3])params1 = np.array([float(param) for param in cameras_instinct[4:]])# print(model1,width1,height1,params1)camera_id1 = db.add_camera(model1, width1, height1, params1)# print(camera_id1)# 图片with open("created/sparse/model/images.txt", "r") as images_file:images_list = images_file.readlines()passfor images_info in images_list:if images_info == "\n":continueimages_info = images_info.replace("\n", "").split(" ")# print(images_info)idx = int(images_info[0])image_name = images_info[-1]# images_info[1]-[4]  QW, QX, QY, QZimage_q = np.array([float(q_i) for q_i in images_info[1:5]])# images_info[5]-[7] TX, TY, TZimage_t = np.array([float(t_i) for t_i in images_info[5:8]])image_id_from_db = db.add_image(image_name, camera_id1, prior_q=image_q, prior_t=image_t)if idx != image_id_from_db:print(f"{idx}!={image_id_from_db}")passdb.commit()db.close()if __name__ == "__main__":# example_usage()create_database()

运行之后,你可以在colmap中新建项目,导入刚才的database.db文件,查看数据是否被加载进入:
在这里插入图片描述
执行:

colmap feature_extractor --database_path database.db --image_path images
colmap exhaustive_matcher --database_path database.db
colmap point_triangulator --database_path database.db --image_path images --input_path created\sparse\model --output_path triangulated\sparse\model
# 或者
colmap mapper --database_path database.db --image_path images --input_path created\sparse\model --output_path mapper\sparse\model

由于我的程序并没有给我 dense/stereo/ 目录下的 patch-match.cfg 等等,于是我自建:
执行程序:generate_fusion&patch_match.py

import numpy as np
import osdef main(folder_path):# 获取文件夹中所有文件名file_names = os.listdir(folder_path)# 写入文件名到txt文件output_file_path = 'patch-match.cfg'with open(output_file_path, 'w') as file:for file_name in file_names:file.write(f"{file_name}\n__auto__, 20\n")output_file_path = 'fusion.cfg'with open(output_file_path, 'w') as file:for file_name in file_names:file.write(f"{file_name}\n")if __name__ == '__main__':folder_path = "images"main(folder_path)

将数据移入高斯(我用的三角测量的):
在这里插入图片描述
就可以在高斯中执行就 python train.py -s data/data_scene18 -m data/data_scene18 /output
但在可视化的时候老是会崩,而且colmap中进行系数重建和稠密重建的效果也不好。中间肯定还是有步骤出错了。

相关文章:

(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练

这里写目录标题 一、colmap解算数据放入高斯1. 将稀疏重建的文件放入高斯2. 将稠密重建的文件放入高斯 二、vkitti数据放入高斯 一、colmap解算数据放入高斯 运行Colmap.bat文件之后&#xff0c;进行稀疏重建和稠密重建之后可以得到如下文件结构。 1. 将稀疏重建的文件放入高…...

4635: 【搜索】【广度优先】回家

题目描述 小 H 在一个划分成了nm 个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格&#xff08;当然小 H 不可以静止不动&#xff09;&#xff0c; 但不能离开封锁线&#xff0c;否则就被打死了。 刚开始时他有满血 6 点&#xff0c;每移动一格他要消耗 1 点血量…...

Uibot6.0 (RPA财务机器人师资培训第1天 )RPA+AI、RPA基础语法

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北之前的几篇博客&#xff0c;友友们我们即将开展新课的学习~…...

【吊打面试官系列】Redis篇 -Redis集群的主从复制模型是怎样的?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis集群的主从复制模型是怎样的&#xff1f;】 面试题&#xff0c;希望对大家有帮助&#xff1b; Redis集群的主从复制模型是怎样的&#xff1f; 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用&#xff0c;所…...

高效的二进制列化格式 MessagePack 详解

目录 MessagePack 序列化原理 MessagePack 数据类型及编码方式 MessagePack 序列化与反序列化过程 MessagePack 的优势 应用场景 注意事项 小结 MessagePack &#xff08;简称 msgPack&#xff09;是一种高效的二进制序列化格式&#xff0c;可以将各种数据类型&#xff…...

鸿蒙Harmony应用开发—ArkTS-if/else:条件渲染

ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句…...

JAVA 100道题(14)

14.使用LinkedList实现一个简单的堆栈&#xff08;Stack&#xff09;数据结构。 下面是一个简单的Java程序&#xff0c;使用LinkedList来实现一个堆栈&#xff08;Stack&#xff09;数据结构。在这个程序中&#xff0c;我们定义了一个MyStack类&#xff0c;它包含了一些基本的堆…...

STM32+ESP8266水墨屏天气时钟:简易多级菜单(数组查表法)

项目背景 本次的水墨屏幕项目需要做一个多级菜单的显示&#xff0c;所以写出来一起学习&#xff0c;本篇文章不单单适合于水墨屏&#xff0c;像0.96OLED屏幕也适用&#xff0c;区别就是修改显示函数。 设计思路 多级菜单的实现&#xff0c;一般有两种实现的方法 1.通过双向…...

数学建模综合评价模型与决策方法

评价方法主要分为两类&#xff0c;其主要区别在确定权重的方法上 一类是主观赋权法&#xff0c;多次采取综合资讯评分确定权重&#xff0c;如综合指数法&#xff0c;模糊综合评判法&#xff0c;层次评判法&#xff0c;功效系数法等 另一类是客观赋权法&#xff0c;根据各指标…...

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

window下安装并使用nvm&#xff08;含卸载node、卸载nvm、全局安装npm&#xff09; 一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、全局安装npm、cnpm八、遇到的问题 nvm 全名 node.js version management&#xff0c;顾名思义…...

Mysql——基础命令集合

目录 前期准备 先登录数据库 一、管理数据库 1.数据表结构解析 2.常用数据类型 3.适用所有类型的修饰符 4.使用数值型的修饰符 二、SQL语句 1.SQL语言分类 三、Mysql——Create,Show,Describe,Drop 1.创建数据库 2.查看数据库 3.切换数据库 4.创建数据表 5.查看…...

记录一次流相关故障

记录一次流相关故障 1、项目中有个JSON字典文件&#xff0c;通过流的方式加载进来&#xff0c;写了个输入流转字符串的方法&#xff0c;idea开发环境下运行一切正常&#xff0c;打成jar或者war包运行时&#xff0c;只能加载出部分数据&#xff0c;一开始怀疑过运行内存分配过小…...

linux源配置:ubuntu、centos;lspci与lsmod命令区别

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…...

面试算法-88-反转链表

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 解 class Solution {public ListNode reverseList(ListNode head) {if(head null || hea…...

如何在个人Windows电脑搭建Cloudreve云盘并实现无公网IP远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…...

一文详解Rust中的字符串

有人可能会说&#xff0c;字符串这么简单还用介绍&#xff1f;但是很多人学习rust受到的第一个暴击就来自这浓眉大眼、看似毫无难度的字符串。 请看下面的例子。 fn main() {let my_name "World!";greet(my_name); }fn greet(name: String) {println!("Hello…...

Mysql中用户密码修改

1、命令行修改 请确保已使用root或其他拥有足够权限的用户登录MySQL&#xff0c;对于MySQL 5.7.6及以上版本或者MariaDB 10.1.20及以上版本。 ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘root’; 1、使用命令 mysql -uroot -p你的密码 连接到mysql管理工具 2、使用命…...

day14-SpringBoot 原理篇

一、配置优先级 SpringBoot 中支持三种格式的配置文件&#xff1a; 注意事项 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml 是主流&#xff09;。 配置文件优先级排名&#xff08;从高到低&…...

ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】 目录 1.写作方法 2.方法设计 3.研究结果 4.讨论写作 5.总结结论 6.书…...

P1563 [NOIP2016 提高组] 玩具谜题

题目传送门 这道题实在是一道水题 话不多说&#xff0c;上代码 #include<iostream> #include<cstring> using namespace std; struct a{int io;//in朝里 out朝外 小人的朝向 string name;//小人的名字 int number;//角色编号 }a[100000]; int main(){int n, m…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...