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

基于Media+Unity的手部位姿三维位姿估计

在这里插入图片描述

使用mediapipe + Unity 手部位姿三维位姿估计

参考文章

基于Mediapipe的姿势识别并同步到Unity人体模型中

Mediapipe+Unity3d实现虚拟手_unity mediapipe-CSDN博客

需求

我的需求就是快速、准确的跟踪手部位姿并实现一个三维显示。

主要思路

搭建mdeiapipe系统,这个很简单,可以参考官方文档,配置好环境,下载一个相应的权重,然后就可以识别手部姿态了。

这里最好采用threading的方式来异步执行,因为我弄了一个小软件。

适配线程函数

处理数据的函数和可视化在同一个线程,

发送数据的线程是单独的线程

最终实现的结果是这样的

在这里插入图片描述

源码不太好贴

from queue import Queueimport mediapipe as mp
from matplotlib import pyplot as plt
from mediapipe.python.solutions.drawing_utils import draw_axis
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
from mediapipe import solutions
from mediapipe.framework.formats import landmark_pb2
import numpy as np
import cv2
from mediapipe.tasks.python.vision import HandLandmarkerResultfrom run.media_hand.med_hand3d_base import MedHandInferBase
from run.media_hand.view_3d import MyView3D
from run.rootnet.root_infer import HandRootNetclass MedHandInfer( MedHandInferBase):def __init__(self,_update_table_signal = None,_send_hd_client= None,_img_path = None,_vid_path = None) -> object:super().__init__()self.options = self.HandLandmarkerOptions(base_options=self.BaseOptions(model_asset_path=self.model_path),running_mode =self. VisionRunningMode.LIVE_STREAM,result_callback = self.print_result,num_hands=2)self.video_infer_flag = Trueself.root_infer = HandRootNet()if _update_table_signal != None:self.update_table_signal_h = _update_table_signalif _img_path != None:self.img_path = _img_pathif _vid_path != None:self.vid_path = _vid_pathif _send_hd_client != None:  # 在这里获取了client类的实例,因此可以用封装包的函数self.send_hd_client_infer = _send_hd_clientdef med_hand_infer_img(self):'''执行图片推断'''self.options = self.HandLandmarkerOptions(base_options=self.BaseOptions(model_asset_path=self.model_path),running_mode=self.VisionRunningMode.IMAGE,num_hands=2)mp_image = mp.Image.create_from_file(self.img_path)mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=mp_image)with self.HandLandmarker.create_from_options(self.options) as landmarker:hand_landmarker_result = landmarker.detect(mp_image)print(self.show_time() + "图片的识别结果为{0}".format(hand_landmarker_result))def med_hand_infer_video(self):'''执行视频推断'''self.options = self.HandLandmarkerOptions(base_options=self.BaseOptions(model_asset_path=self.model_path),running_mode=self.VisionRunningMode.VIDEO,num_hands=2)cap = cv2.VideoCapture(self.vid_path)self.video_infer_flag = Truewhile cap.isOpened():if self.video_infer_flag:ret, frame = cap.read()mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)with self.HandLandmarker.create_from_options(self.options) as landmarker:hand_landmarker_result = landmarker.detect(mp_image)print(self.show_time() + "视频帧的识别结果为{0}".format(hand_landmarker_result))if not ret:breakdef med_hand_infer_web(self):print(self.show_time() + "开始执行media相机推理")cap = cv2.VideoCapture(0)print(self.show_time() + "开始读取视频帧")self.video_infer_flag = Truewhile True:if not self.video_infer_flag:breakret,frame = cap.read()start_time = cv2.getTickCount()# 因为摄像头是镜像的,所以将摄像头水平翻转# 不是镜像的可以不翻转frame = cv2.flip(frame, 1)frame_new = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 获取视频宽度高度width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 创建一个黑色图像black_image = np.zeros((height, width, 3), dtype=np.uint8)# 改变图像的着色模式,用于推理,但是不用于显示mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame_new)with self.HandLandmarker.create_from_options(self.options) as landmarker:# The landmarker is initialized. Use it here.landmarker.detect_async(mp_image,1)# 为了绘图获取结果cur_res =  self.res_que.get()self.h_frame_num += 1lm_img  = self.draw_landmarks_on_image(frame, cur_res) # 在每一帧图片上绘图lm_img_axis = MyView3D.my_draw_axis(black_image) # 先绘制坐标轴lm_img_2 = self.draw_landmarks_on_image(lm_img_axis, cur_res) # 在每一帧图片上绘图# 合并图片concatenated_image = np.hstack((lm_img, lm_img_2))# 关节转换可以放到线程中处理con_res_hlm =  self.con_res_que.get()# 滤波在绘图线程上进行fil_res_hlm, scores = self.data_filter.get_med_fil_pose(con_res_hlm, cur_res.handedness)print(self.show_time() + "滤波之后的数据为{}".format(fil_res_hlm))############ 获取手部姿态的xmin ymin xmax ymax 并转化为像素坐标 ###########np_hlm_rig = np.array(con_res_hlm[0:21])np_hlm_left = np.array(con_res_hlm[21:])x_min_r = np.min(np_hlm_rig,axis=0)[0]y_min_r = np.min(np_hlm_rig, axis=0)[1]x_max_r = np.max(np_hlm_rig, axis=0)[0]y_max_r = np.max(np_hlm_rig, axis=0)[1]x_min_l = np.min(np_hlm_left, axis=0)[0]y_min_l = np.min(np_hlm_left, axis=0)[1]x_max_l = np.max(np_hlm_left, axis=0)[0]y_max_l = np.max(np_hlm_left, axis=0)[1]# 转化为像素值x_min_r = int(x_min_r * width); x_max_r = int(x_max_r * width); y_min_r = int(y_min_r * height); y_max_r = int(y_max_r * height);x_min_l = int(x_min_l * width); x_max_l = int(x_max_l * width); y_min_l = int(y_min_l * height); y_max_l = int(y_max_l * height);# 绘制矩形rec_img = cv2.rectangle(frame,(x_min_r-40,y_min_r-40),(x_max_r+40,y_max_r + 40),(0,255,0),2)rec_img = cv2.rectangle(rec_img,(x_min_l-40,y_min_l-40),(x_max_l+40,y_max_l + 40),(0,255,0),2)# 生成 bboxbbox_rig = [x_min_r-40, y_min_r-40, x_max_r+40, y_max_r + 40]bbox_left = [x_min_l-40, y_min_l-40, x_max_l+40, y_max_l + 40]root_depth_list =  self.root_infer.get_hand_root_depth(frame,scores,[bbox_rig,bbox_left])print(self.show_time() + "手部root关节的绝对深度为{}mm".format(root_depth_list))############ 获取世界坐标系的手部坐标 ###########scal_res_hlm = self.res_scal(fil_res_hlm, width, height)print(self.show_time() + "计算缩放之后的数据为{}".format(scal_res_hlm))############ 向客户端发送数据 发送的是滤波之后的数据 没有发送加上手腕的 ###########self.fil_res_que.put(fil_res_hlm) # 准备发送数据self.update_table_signal_h.emit(fil_res_hlm) # 更新table############ 绘制滤波后的图 ###########fil_img = self.draw_filt_landmarks_on_image(frame, fil_res_hlm)  # 使用处理后的数据绘图 做对比fil_img_2 = self.draw_filt_landmarks_on_image(lm_img_axis, fil_res_hlm)  # 在每一帧图片上绘图concatenated_image_2 = np.hstack((fil_img, fil_img_2))print(self.show_time() + "已经处理了{0}帧".format(self.h_frame_num))# 计算时间间隔并实时更新帧率end_time = cv2.getTickCount()total_time = (end_time - start_time) / cv2.getTickFrequency()fps =round(1 / total_time,2)fps_text = f"FPS: {round(fps, 2)}"cv2.putText(concatenated_image, fps_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)cv2.imshow('MediaPipe Hands det', rec_img)cv2.imshow('MediaPipe Hands', concatenated_image)cv2.imshow('MediaPipe Hands Filter', concatenated_image_2)# self.draw_hand3d(fig,hand_mark_list_fil)if cv2.waitKey(1) & 0xFF == 27: # oh 天呐 我是沙口 原来摁一下 esc 就行print("停止手部姿态检测")breakcap.release()cv2.destroyAllWindows()print("cv2资源已经释放")def send_data_packet_thm(self):'''线程函数 将数据封装成数据包'''print(self.show_time() + "进入send_data_packet_thm函数,开始发送数据!")while True:# 获取处理后的数据 这里是 double [] 类型的数据self.res_kps_handled = self.fil_res_que.get()# 将手部数据封装成字节数组 存在了 send_hd_client_infer.joint_data_packetself.send_hd_client_infer.create_send_packet(self.res_kps_handled) # 处理结果存在了 joint_data_packetself.send_hd_client_infer.send_packet(self.send_hd_client_infer.joint_data_packet) # 发送数据
#def draw_hand3d(self,fig,_hand_mark_list:list):'''废弃的 在子线程用matlip会崩溃'''x = []y = []z = []for item in _hand_mark_list:x.append(item[0])y.append(item[0])z.append(item[0])# 创建一个新的三维图形ax = fig.add_subplot(111, projection='3d')# 绘制三维散点图ax.scatter(x, y, z, c='b', marker='o')# 绘制连线 1 手腕到拇指for i in range(0,5): # 5个手指for j in range(4 * i, 4 * i + 3 ): # 循环三次即可if self.is_joint_exist(_hand_mark_list[j]):ax.plot([x[j], x[j + 1]], [y[j], y[j + 1]], [z[j], z[j + 1]])for k in range(4 * i + 21, 4 * i + 24 ): # 左手if self.is_joint_exist(_hand_mark_list[k]):ax.plot([x[k], x[k + 1]], [y[k], y[k + 1]], [z[k], z[k + 1]])if i == 4:ax.plot([x[3], x[20]], [y[2], y[20]], [z[2], z[20]])ax.plot([x[7], x[20]], [y[7], y[20]], [z[7], z[20]])ax.plot([x[11], x[20]], [y[11], y[20]], [z[11], z[20]])ax.plot([x[15], x[20]], [y[15], y[20]], [z[15], z[20]])ax.plot([x[19], x[20]], [y[19], y[20]], [z[19], z[20]])ax.plot([x[24], x[20]], [y[24], y[20]], [z[24], z[20]])ax.plot([x[28], x[20]], [y[28], y[20]], [z[28], z[20]])ax.plot([x[32], x[20]], [y[32], y[20]], [z[32], z[20]])ax.plot([x[36], x[20]], [y[36], y[20]], [z[36], z[20]])ax.plot([x[40], x[20]], [y[40], y[20]], [z[40], z[20]])# 设置图形属性ax.set_xlabel('X Label')ax.set_ylabel('Y Label')ax.set_zlabel('Z Label')# 显示图形plt.show()def is_joint_exist(self,_point:list):to = sum(_point)return False if to < 0.001 else True# med = MedHandInfer()
# med.med_hand_infer_web()

相关文章:

基于Media+Unity的手部位姿三维位姿估计

使用mediapipe Unity 手部位姿三维位姿估计 参考文章 基于Mediapipe的姿势识别并同步到Unity人体模型中 MediapipeUnity3d实现虚拟手_unity mediapipe-CSDN博客 需求 我的需求就是快速、准确的跟踪手部位姿并实现一个三维显示。 主要思路 搭建mdeiapipe系统&#xff0c…...

cJson——序列化格式json和protobuf对比

cJson——序列化格式json和protobuf对比 1. 更小的消息体积2. 更快的序列化与反序列化速度3. 类型安全4. 向后和向前兼容性5. 更低的带宽消耗6. 高效的编码方式7. 易于跨语言支持8. 支持复杂的数据结构9. 更好的支持大型数据交换总结 Protocol Buffers (Protobuf) 和 JSON 都是…...

STM32F1学习——ADC模数转换器

一、ADC模数转换器 ADC的全称 Analog-Digital Converter 模拟-数字转换器&#xff0c;他可以用来将引脚上连续变换的模拟电压转换为内存中存储的数字变量。 ADC有两个重要指标&#xff0c;分辨率和频率。 STM32的ADC是 12位 逐次逼近型&#xff0c;1us转换时间&#xff0c;也就…...

2025-1-10-sklearn学习(36、37) 数据集转换-无监督降维+随机投影 沙上并禽池上暝。云破月来花弄影。

文章目录 sklearn学习(36、37) 数据集转换-无监督降维随机投影sklearn学习(36) 数据集转换-无监督降维36.1 PCA: 主成份分析36.2 随机投影36.3 特征聚集 sklearn学习(37) 数据集转换-随机投影37.1 Johnson-Lindenstrauss 辅助定理37.2 高斯随机投影37.3 稀疏随机矩阵 sklearn学…...

Linux之线程池与单例模式

目录 线程池 线程池代码 单例模式 饿汉模式单例模式 懒汉模式单例模式 在前几期&#xff0c;我们已经学习了多线程的创建和控制&#xff0c;学习了多线程中的同步和互斥&#xff0c;学习了多线程中的条件变量和信号量&#xff0c;基于此我们实现了基于阻塞队列和基于环形队…...

LabVIEW调用不定长数组 DLL数组

在使用 LabVIEW 调用 DLL 库函数时&#xff0c;如果函数中的结构体包含不定长数组&#xff0c;直接通过 调用库函数节点&#xff08;Call Library Function Node&#xff09; 调用通常会遇到问题。这是因为 LabVIEW 需要与 DLL 中的数据结构完全匹配&#xff0c;而包含不定长数…...

计算机的错误计算(二百零七)

摘要 利用两个数学大模型计算 arccot(0.125664e2)的值&#xff0c;结果保留16位有效数字。 实验表明&#xff0c;它们的输出中分别仅含有3位和1位正确数字。 例1. 计算 arccot(0.125664e2)的值&#xff0c;结果保留16位有效数字。 下面是与一个数学解题器的对话。 以上为与…...

基于 GEE 利用 RF 回归模型实现空间降尺度

目录 1 前言 2 完整代码 3 运行结果 1 前言 本篇讲述在GEE上基于回归模型降尺度&#xff0c;也就是要复现以下论文&#xff0c;该论文发表在J-Star期刊上。 “Ebrahimy H, Aghighi H, Azadbakht M, et al. Downscaling MODIS land surface temperature product using an a…...

Linux 系统下磁盘相关指令:df、du、fdisk、lsblk

文章目录 I df、du、fdisk、lsblk指令df命令用于显示文件系统的磁盘空间使用情况du命令用于估算目录或文件的磁盘空间使用情况fdisk命令用于对磁盘进行分区操作lsblk指令查看设备信息II 应用du估算目录或文件的磁盘空间使用情况lsblk查看服务器上查看硬盘个数III 知识扩展磁盘阵…...

在线或离线llama.cpp安装和模型启动

该版本安装时间是2025-01-10&#xff0c;因为不同版本可能安装上会有所不同&#xff0c;下面也会讲到。 先说下问题——按照官方文档找不到执行命令llama-cli或./llama-cli 先附上llama.cpp的github地址&#xff1a;https://github.com/ggerganov/llama.cpp&#xff0c;build…...

(Arxiv-2023)LORA-FA:针对大型语言模型微调的内存高效低秩自适应

LORA-FA&#xff1a;针对大型语言模型微调的内存高效低秩自适应 paper是香港浸会大学发表在Arxiv 2023的工作 paper title&#xff1a;LORA-FA: MEMORY-EFFICIENT LOW-RANK ADAPTATION FOR LARGE LANGUAGE MODELS FINE-TUNING ABSTRACT 低秩自适应 (LoRA) 方法可以大大减少微调…...

Ubuntu | 系统软件安装系列指导说明

文章目录 Ubuntu 系统软件安装系列指导说明工具系列1. Docker 与 Docker-Compose部署与安装 环境系列1. Golang部署与安装 数据库系列1. PostgreSQL17.2源码部署与安装 Ubuntu 系统软件安装系列指导说明 工具系列 1. Docker 与 Docker-Compose部署与安装 链接 环境系列 1…...

攻防靶场(32):两个爆破技巧 Funbox 7 EasyEnum

目录 攻击路径一 1. 侦查 1.1 收集目标网络信息&#xff1a;IP地址 1.2 主动扫描&#xff1a;扫描IP地址段 1.3 主动扫描&#xff1a;字典扫描 2. 初始访问 2.1 有效帐号&#xff1a;本地账户 3. 权限提升 3.1 滥用特权控制机制&#xff1a;Sudo和Sudo缓存 4. 凭据访问 4.1 凭据…...

Vue3初学之插槽(slot)使用

在 Vue 3 中&#xff0c;插槽&#xff08;Slots&#xff09;是一种强大的内容分发机制&#xff0c;允许你在组件中定义可替换的内容区域&#xff0c;从而使组件更加通用和灵活。以下是 Vue 3 中插槽的几种常见用法&#xff1a; 默认插槽 默认插槽是最基本的插槽类型&#xff0…...

从 0 开始上手 Solana 智能合约

Solana CLI 基础知识 Solana CLI 是一个命令行界面工具&#xff0c;提供了一系列用于与 Solana Cluster 交互的命令。 我们将介绍一些最常见的命令&#xff0c;但你始终可以通过运行 solana --help 查看所有可能的 Solana CLI 命令列表。 Solana CLI 配置 Solana CLI 存储了…...

USB基础 -- USB 控制传输(Control Transfer)的重传机制

USB 控制传输&#xff08;Control Transfer&#xff09;的重传机制 1. 控制传输的事务结构 控制传输分为三个阶段&#xff0c;每个阶段都有自己的事务&#xff0c;并可能触发重传机制&#xff1a; 设置阶段&#xff08;Setup Stage&#xff09;&#xff1a;主机发送 8 字节的…...

创建基本的 Electron 应用项目的详细步骤

创建一个基本的 Electron 应用项目的详细步骤。我们将从安装 Node.js 开始&#xff0c;然后创建项目文件夹并初始化 Electron 项目。 1. 安装 Node.js 首先&#xff0c;确保你已经安装了 Node.js 和 npm。你可以在终端中运行以下命令来检查是否已经安装&#xff1a; node -v…...

《异步编程之美》— 全栈修仙《Java 8 CompletableFuture 对比 ES6 Promise 以及Spring @Async》

哈喽&#xff0c;大家好&#xff01;在平常开发过程中会遇到许多意想不到的坑&#xff0c;本篇文章就记录在开发过程中遇到一些常见的问题&#xff0c;看了许多博主的异步编程&#xff0c;我只能说一言难尽。本文详细的讲解了异步编程之美&#xff0c;是不可多得的好文&#xf…...

Android 修改SVG属性并显示图片(AndroidSvg)

引入依赖&#xff1a; dependencies {implementation com.caverock:androidsvg-aar:1.4 }核心代码&#xff1a; import com.caverock.androidsvg.SVG import org.w3c.dom.Document import java.io.StringWriter import javax.xml.transform.OutputKeys import javax.xml.tran…...

Ubuntu 磁盘修复

Ubuntu 磁盘修复 在 ubuntu 文件系统变成只读模式&#xff0c;该处理呢&#xff1f; 文件系统内部的错误&#xff0c;如索引错误、元数据损坏等&#xff0c;也可能导致系统进入只读状态。磁盘坏道或硬件故障也可能引发文件系统只读的问题。/etc/fstab配置错误&#xff0c;可能…...

移动云自研云原生数据库入围国采!

近日&#xff0c;中央国家机关2024年度事务型数据库软件框架协议联合征集采购项目产品名单正式公布&#xff0c;移动云自主研发的云原生数据库产品顺利入围。这一成就不仅彰显了移动云在数据库领域深耕多年造就的领先技术优势&#xff0c;更标志着国家权威评审机构对移动云在数…...

Java一个简单的反弹动画练习

文章目录 说明代码详解创建窗体代码创建绘图板创建线程 运行结果完整代码 说明 做了一个小球和星型做反弹动画的窗体作为练习&#xff0c;分享给大家&#xff0c;为了方便和我一样的小白可以看的比较明白&#xff0c;所以尽量详细的标注了注释&#xff0c;希望能帮到同样在学习…...

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…...

git push命令

git push 常用命令 1. 拉取远程仓库最新数据 使用 git fetch git fetch作用&#xff1a; 获取远程仓库的最新数据&#xff08;包括分支、标签等&#xff09;&#xff0c;但不会修改本地工作目录。 结果&#xff1a; 仅更新远程分支&#xff08;如 origin/main&#xff09;的…...

day01-HTML-CSS——基础标签样式表格标签表单标签

目录 此篇为简写笔记下端1-3为之前笔记&#xff08;强迫症、保证文章连续性&#xff09;完整版笔记代码模仿新浪新闻首页完成审核不通过发不出去HTMLCSS1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标…...

软考信安16~网络安全风险评估技术原理与应用

1、网络安全风险评估概述 1.1、网络安全风险评估概念 网络安全风险评估(简称“网络风险评估")就是指依据有关信息安全技术和管理标准,对网络系统的保密性、完整性、可控性和可用性等安全属性进行科学评价的过程,评估内容涉及网络系统的脆弱性、网络安全威胁以及脆弱性被…...

嵌入式C语言:二维数组

目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图&#xff08;简化表示&#xff09; 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…...

计算机网络期末复习(知识点)

概念题 在实际复习之前&#xff0c;可以看一下这个视频将网络知识串一下&#xff0c;以便更好地复习&#xff1a;【你管这破玩意叫网络&#xff1f;】 网络规模的分类 PAN&#xff08;个人区域网络&#xff09;&#xff1a;用于个人设备间的连接&#xff0c;如手机与蓝牙耳机…...

LeetCode:3298. 统计重新排列后包含另一个字符串的子字符串数目 II(滑动窗口 Java)

目录 3298. 统计重新排列后包含另一个字符串的子字符串数目 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 滑动窗口 原理思路&#xff1a; 3298. 统计重新排列后包含另一个字符串的子字符串数目 II 题目描述&#xff1a; 给你两个字符串 word1 和 word2 。 如果…...

【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述

前言 &#x1f31f;&#x1f31f;本期讲解关于spring aop的切面表达式和自身实现原理介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &am…...

es 3期 第23节-运用Pipeline实现二转聚合统计

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

T-SQL语言的编程范式

T-SQL编程范式探析 引言 随着信息技术的迅猛发展&#xff0c;数据库在各个行业的应用日益广泛。在众多数据库管理系统中&#xff0c;SQL Server以其高性能和易用性受到广泛欢迎。T-SQL&#xff08;Transact-SQL&#xff09;是SQL Server的扩展版本&#xff0c;是一种用于查询…...

【ArcGIS微课1000例】0137:色彩映射表转为RGB全彩模式

本文讲述ArcGIS中,将tif格式的影像数据从色彩映射表转为RGB全彩模式。 参考阅读:【GlobalMapper精品教程】093:将tif影像色彩映射表(调色板)转为RGB全彩模式 文章目录 一、色彩映射表预览二、色彩映射表转为RGB全彩模式一、色彩映射表预览 加载配套数据包中的0137.rar中的…...

论文笔记(六十一)Implicit Behavioral Cloning

Implicit Behavioral Cloning 文章概括摘要1 引言2 背景&#xff1a;隐式模型的训练与推理3 隐式模型与显式模型的有趣属性4 policy学习成果5 理论见解&#xff1a;隐式模型的通用逼近性6 相关工作7 结论 文章概括 引用&#xff1a; inproceedings{florence2022implicit,titl…...

网络安全核心目标CIA

网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨&#xff0c;机密性、可用性、完整性频频出现&#xff0c;被简称为CIA&#xff0c;也被成为你AIC&#xff0c;只是顺序不同而已…...

hive迁移后修复分区慢,怎么办?

我有1个30TB的分区表&#xff0c;客户给的带宽只有600MB&#xff0c;按照150%的耗时来算&#xff0c;大概要迁移17小时。 使用hive自带的修复分区命令&#xff08;一般修复分区比迁移时间长一点&#xff09;&#xff0c;可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…...

一块钱的RISC-V 32位芯片

‍‍ ‍‍之前跟一个朋友聊天&#xff0c;说以后的芯片一定是越来越趋向于定制化&#xff0c;比如我们需要一个ADC芯片&#xff0c;这颗ADC芯片需要有串口功能&#xff0c;那就只开发一颗这样的芯片就好了&#xff0c;其他的功能都可以裁剪掉。 ➵➵➵➵➵➵➵➵➵➵➵➵➵➵➵…...

Linux常用指令

目录 1 概述2 指令2.1 简单指令2.2 解压缩2.2.1 tar.bz2和tar.gz2.2.2 单独bz22.2.3 zip2.2.4 7z 2.3 网卡操作 1 概述 本章主要是记录一些日常用到的Linux指令&#xff0c;方便自己忘记的时候查找&#xff0c;也为有需要的人提供参考。 2 指令 2.1 简单指令 指令解释cat /…...

车载音频开发(二):对音频数据作音量调节

通过前一个章节打下的基础车载音频开发&#xff08;一&#xff09;&#xff1a;从看懂wav开始https://blog.csdn.net/Hellomino_/article/details/140873133?fromshareblogdetail&sharetypeblogdetail&sharerId140873133&sharereferPC&sharesourceHellomino_&…...

误差与误差限

目录 误差误差限小结 误差 设 x x x为准确值 , x ∗ ,x^* ,x∗为 x x x的一个近似值&#xff0c;称 e ∗ x ∗ − x e^*x^*-x e∗x∗−x为近似值的绝对误差&#xff0c;简称误差. 这样定义的误差 e ∗ e^{*} e∗可正可负&#xff0c;当绝对误差为正时近似值偏大&#xff0c;…...

halcon三维点云数据处理(七)find_shape_model_3d_recompute_score

目录 一、find_shape_model_3d_recompute_score例程代码二、set_object_model_3d_attrib_mod函数三、prepare_object_model_3d 函数四、create_cube_shape_model_3d函数五、获得CamPose六、project_cube_image函数七、find_shape_model_3d函数八、project_shape_model_3d函数 一…...

如何从串 ‘ 中国 +86‘ 中,获取到‘中国’:strip()、split()及正则表达式的使用

业务中有这样一个场景&#xff0c;国家列表中的数据格式是这样&#xff1a; 中国 86 &#xff0c;其中的 "中国" 前面有3个空格&#xff0c;需要从中提取出 "中国"&#xff0c;有哪些方法呢&#xff1f; 方法 1&#xff1a;使用 strip() 和 split() str…...

Java Web开发进阶——Spring Security基础与应用

Spring Security是Spring框架的核心模块之一&#xff0c;用于保护Web应用程序和微服务的安全。它提供强大的认证和授权功能&#xff0c;并与Spring生态系统无缝集成。本节将详细介绍Spring Security的基础知识及其在实际项目中的应用。 1. Spring Security概述与功能 1.1 什么…...

1. Doris分布式环境搭建

一. 环境准备 本次测试集群采用3台机器hadoop1、hadoop2、hadoop3, Frontend和Backend部署在同一台机器上&#xff0c;Frontend部署3台组成高可用&#xff0c;Backend部署3个节点&#xff0c;组成3副本存储。 主机IP操作系统FrontendBackendhadoop1192.168.47.128Centos7Foll…...

消息中间件类型介绍

消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据&#xff0c;实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍&#xff1a; 1.RabbitMQ 特点&#xff1a; • 基于AMQP&#…...

Win10微调大语言模型ChatGLM2-6B

在《Win10本地部署大语言模型ChatGLM2-6B-CSDN博客》基础上进行&#xff0c;官方文档在这里&#xff0c;参考了这篇文章 首先确保ChatGLM2-6B下的有ptuning AdvertiseGen下载地址1&#xff0c;地址2&#xff0c;文件中数据留几行 模型文件下载地址 &#xff08;注意&#xff1…...

C# GID+绘制不透明和半透明的线条

绘制线条时&#xff0c;必须将 Pen 对象传递给 DrawLine 类的 Graphics 方法。 Pen 构造函数的参数之一是 Color 对象。 若要绘制不透明的线条&#xff0c;请将颜色的 alpha 分量设置为 255。 若要绘制半透明的线条&#xff0c;请将 alpha 分量设置为从 1 到 254 的任何值。 在…...

解锁 C# 与 LiteDB 嵌入式 NoSQL 数据库

一、开篇&#xff1a;邂逅 C# 与 LiteDB 新世界 在当今的软件开发领域&#xff0c;数据管理如同建筑的基石&#xff0c;而选择一款合适的数据库则是项目成功与否的关键因素之一。对于 C# 开发者来说&#xff0c;面对琳琅满目的数据库选项&#xff0c;如何抉择常常令人头疼。今…...

iOS - 数组的真实类型

1. NSArray 类簇 // 1. __NSArray0 (空数组) NSArray *empty [];// 2. __NSArrayI (不可变数组) NSArray *immutable [1, 2, 3];// 3. __NSArrayM (可变数组) NSMutableArray *mutable [NSMutableArray array];// 4. __NSSingleObjectArrayI (单元素数组) NSArray *single …...

Unity热更新 之 Addressables(2) 本地/远端打包 流程测试

基础篇&#xff1a;Unity热更新 之 Addressables(1) 资源基础加载-CSDN博客 基础方法来源于唐老狮,我也是初学热更这一块&#xff0c;所有不保证步骤完全正确&#xff0c;如有不足还请斧正 目录 0.前提 1.本地打包 1.1.资源放入包 1.2.简化路径名称给出标签(如有需要的话) …...