预备知识学习笔记
C#
基础语法
- 一个 C# 程序主要包括以下部分:
- 命名空间声明(Namespace declaration)
- 一个 class
- Class 方法
- Class 属性
- 一个 Main 方法
- 语句(Statements)& 表达式(Expressions)
- 注释
-
新建C#项目:
dotnet new console [-o <Project_Name>]cd <Project_Name>dotnet run -
demo
using System;
namespace HelloWorldApplication
{
class HelloWorld
{
static void Main(string[] args)
{
/* 我的第一个 C# 程序*/
Console.WriteLine("Hello World");
Console.ReadKey();
}
}
}
- 数据类型:
-
数值类型
-
double
double.NaN:Not a numberdouble.isNaN(var):判断double类型的var是否是NaN
-
-
引用类型
object(是所有数据类型基类)、dynamic、String
String类型:
@"\xxx"(逐字字符串,将转义字符等特殊字符都当成普通字符)-
指针类型
type* identifier用法与C中指针相同
-
-
可空类型
int? i = 3;相当于:
Nullable<int> i = new Nullable<int>(3);变量i可赋值为空(null)
对于可空类型有合并运算符
??var3 = var1 ?? var2;如果var1为null则将var2赋值给var3
-
字符串
字符串的格式化
$"xxx{var:N2}":将var保留两位小数 -
I/O操作
Console.WriteLine()Console.ReadLine() -
类型转换
type1 var1 = (type2) var2
Convert.ToType(var):显示数据类型转换
double.TryParse(string, out double):尝试解析string中的内容成double,成功则返回true,否则false
-
日志写入
public Calculator() { //构造函数 StreamWriter logFile = File.CreateText("calculator.log"); Trace.Listeners.Add(new TextWriterTraceListener(logFile)); Trace.AutoFlush = true; Trace.WriteLine("Starting Calculator Log"); Trace.WriteLine(String.Format("Started {0}", System.DateTime.Now.ToString())); } -
快捷键
编译并运行项目:
F5设置断点:
F9 -
Windows Form(可视化窗口)
工具箱:
ctrl + alt + X-
对话框组件:
if (openFileDialog1.ShowDialog() == DialogResult.OK) { } -
图片组件
//show picture pictureBox1.Load(openFileDialog1.FileName); //Clear the picture. pictureBox1.Image = null;
-
Visual Studio的使用
<!--拷贝文件到Debug目录中-->
<ItemGroup>
<None Update="assets\bird.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="assets\car.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="assets\yolov8m.onnx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<!--拷贝指定目录下的所有文件-->
<ItemGroup>
<None Update="assets/*/*" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Unity
选中物体时坐标点显示方式:

资源商店
Window——Asset Store
搜索资源——添加/购买资源——在Unity中download——import
创建地形
Terrain——Paint Terrain
-
Raise or Lower Terrain : 绘制山峰和峡谷
直接点击滑动,绘制山峰(凸起)
按住shift点击滑动,绘制峡谷(凹陷)
-
Paint Hole : 挖洞
-
Set Height : 设置固定高度后绘制山峰(Flatten Tile->统一全部高度)
-
Smooth Height : 平滑山峰
组件(C#脚本)
设置脚本编辑器:首选项——外部工具——外部脚本编辑器
- 使用官方提供的组件
- 创建新组件

窗口——常规——控制台:ctrl + shift + C
FixedUpdate():固定时间执行(默认0.02s)修改步进时间:编辑——项目设置——时间
函数执行顺序:Awake-->Start
向量(Vector)
Vector2Vector3: 三元数组(坐标、旋转、缩放)Quaternion: 四元数
调试(Debug)
只在调试时有显示,正常运行没有显示
Debug.Log(): infoDebug.LogWarning: warningDebug.LogError: errorDebug.DrawLine()Debug.DrawRay(): 绘制射线
游戏物体(GameObject)
[this.]gameObject (GameObject类): 当前类中的 gameObject属性

GameObject的属性值
GameObject go = new GameObject();
go.name:获取游戏物体的名称
go.tag
go.layer
go.activeInHierarchy:当前的激活状态(父物体不激活时子物体也不激活)
go.activeSelf:自身的激活状态
go.transform:获取游戏物体的transform组件(含position、rotation、scale)获取组件:
<WidgetType> <name> = GetComponent<WidgetType>()使用到了C#的泛型和
GetComponent<>()方法添加组件(指定类型的默认组件):
<obj>.AddComponent<WidgetType>()获取游戏物体:
GameObject go = GameObject.Find(<name>)通过游戏物体的名称查找指定物体
GameObject go = GameObject.FindWithTag(<tag>)
go.SetActive(<bool>):设置物体的激活状态
Destroy(go):摧毁(删除)物体
游戏时间(Time)
Time.time:游戏开始运行到当前的时间
Time.timeScale:时间缩放(加减速)
Time.fixedDeltaTime:固定时间间隔
文件路径(Path)
Application.dataPath:Assets路径
Application.persistDataPath:持久化文件路径
Application.streamingAssetsPath:访问StreamingAssets路径(需要自行创建)
Application.temporaryCachePath:临时文件保存路径
Application.runInBackground:是否允许后台运行
游戏场景(Scene)
- 文件——生成设置——Build 中的场景
using UnityEngine.SceneManagement;:导入相关包
SceneManager.LoadScene(<scene_name>):跳转到指定场景
Scene scene = SceneManager.GetActiveScene():获取当前场景
GameObject[] gos = scene.GetRootGameObjects():获取当前场景中所有游戏物体
异步操作(Async)
//携程异步
AsyncOperation operation; //声明异步操作
IEnumerator async_function() { //定义异步函数
operation = SceneManager.LoadSceneAsync(1); //调用异步方法(返回值是AsyncOperation对象)
yield return operation; //异步返回值
}
StartCoroutine(async_function()); //携程异步执行异步函数
operation.progress //异步函数执行的进程(0~0.9)
键鼠输入(Key/Mouse)
需要在
Update函数中写
Input.GetMouseButtonDown(index):鼠标按下
index=0 鼠标左键
index=1 右键
index=2 中键
Input.GetMouseButton(index):鼠标持续按下
Input.GetMouseButtonUp(index):鼠标抬起
Input.GetKey(KeyCode.<key>):键盘 <key>持续按下
Input.GetKeyDown(KeyCode.<key>):键盘 <key>被按下时
虚拟轴(Axis)
float horizontal = Input.GetAxis("Horizontal"):获取轴向值

虚拟按键(Button)
Input.GetButton("Space"):获取虚拟按键
触摸输入(Touch)
Input.touchCount:触摸点个数
Touch[] touches = Input.touches:获取所有的触摸点
Touch touch = Input.touches[0]:获取第一个点

灯光(Light)
实时/烘焙灯光
实时灯光是系统实时渲染,比较消耗性能
烘焙灯光则是提前渲染好,后面不会再修改
修改平面和物体属性为——Contribute GI
窗口——渲染——光照
音效(Audio)
Audio Listener组件:一般在Main Camera中
Audio Source组件:可以添加到任意物体中
Audio Clip:音频文件对象
视频(Video)
using UnityEngine.Video;
VideoClip:视频文件对象
角色控制(Character Controler)
添加 Character Controler组件
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 vector = new Vector3(horizontal, 0, vertical); //角色运动方向
//Debug.DrawRay(transform.position, vector, Color.red);
player.SimpleMove(vector); //满足重力
player.Move(vector); //不满足重力
碰撞检测
RigidBody:刚体组件
-
碰撞
private void OnCollisionEnter(Collision collision) { } private void OnCollisionStay(Collision collision) { } private void OnCollisionExit(Collision collision) { } -
触发
private void OnTriggerEnter(Collision collision) { } private void OnTriggerStay(Collision collision) { } private void OnTriggerExit(Collision collision) { }
ctrl + shift + F:对齐视图
关节、铰链(joint)
Hinge Joint:铰链
平面材质
新建——新建物理材质
Mesh Collider——材质
射线检测
Ray ray = new Ray(<start_point>, <dest_point>)
新建一个点,传入起点和终点(Vector3)
Ray ray = Camera.main.ScreenPointToRay(<dest_point>)
从摄像机向<dest_point>发射一条射线

Physics.Raycast(ray, out hit):碰撞信息检测(检测单个物体)
RaycastHit[] hits = Physics.RaycastAll(ray):检测多个物体
动画(Animator)
添加 Animator 组件
新建 动画器控制器
创建动画:窗口——动画——动画——创建
角色控制(Character)
导航(Navigator)
选择游戏物体——将物体的属性从 静态的修改为 static navigator
菜单栏——窗口——AI——导航——Bake(烘焙)
using UnityEngine.AI;
private NavMeshAgent agent;
agent = GetComponent<NavMeshAgent>();
//获取鼠标点击的位置,并让导航代理移动到该位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit) {
Vector3 point = hit.point;
agent.SetDestination(point);
}
UI
生成设置
文件——生成设置——Platform
实战
-
对于例子系统需要设置
Play On Awake来保持播放状态 -
Text Mesh Pro组件的使用
首先需要使用命名空间:
using TMPro;TMP_Text:Text组件TMP_Button:Button组件...
-
使用UI组件
使用命名空间:
using UnityEngine.UI; -
使用场景Scene组件
使用命名空间:
using -
场景层级
选择
Sorting Layer,可以新建,越小越先渲染同一个层级下的可以通过设置
Order in Layer来区分,越小越先渲染 -
SendMessage
MRTK
-
想要对象在使用跟踪手时可抓取,需要添加组件
Object Manipulator系统会自动添加组件
Constraint Mananger -
为了性能考虑,需要修改游戏物体的材质为:
MRTK_Standard_White -
安装 gltFast :add by name field
com.unity.cloud.gltfastold version :
com.atteneder.gltfast -
添加箭头指示功能:给跟踪物体添加组件
DirectionalIndicator
ARDK
- 在Build Settings中将设备切换成
Android - Edit > Project Settings > Player > Other Settings
- Add package from git URL:
https://github.com/github-for-rayneo/OpenXR-Unity-ARDK.git - 将场景中的Main Camera,Directional Light删除
DIP
Simple(采样)

dpi : dot per inch
Quantization

最后一张图就是二值图

环境配置:
-
Tensorflow 1.9 (tensorboard)
-
Keras
-
Caffe
并行计算,配置模型
-
Pytorch
-
Opencv 3.4 (opencv-contrib-python)

图像处理的方法:
- RGB-->GRAY : (灰度图)

-
直方图均衡
-
自适应直方图均衡(AHE)
对图像局部区域执行直方图均衡算法,然后对各部分边缘进行特殊处理(镜像边缘像素)
-
CLAHE
对比度受限的直方图均衡(改进AHE)
将像素直方图进行一定的修正:
![img]()
滤波(卷积)算法:
-
均值滤波
-
平滑中值滤波
将卷积核中的所有值进行排序,取中间值
-
平滑高斯滤波
![img]()
![img]()
-
梯度滤波
-
Sobel算子
- Prewitt算子
-
Laplace算子(二阶导)
![img]()
![img]()
![img]()
Laplacian卷积核的和为0
加速卷积(使用FFT):
-
高斯金字塔
用于图像缩放处理
缩小:先对图像进行高斯平滑处理,然后再进行降采样
-
拉普拉斯金字塔
-
傅里叶变换
- 相位滤波
- 频谱滤波
先将图片进行傅里叶变换,对频谱进行滤波后再进行傅里叶逆变换
-
短时傅里叶变换
-
小波变换

图像特征
颜色特征
- RGB色彩空间
- HSV色彩空间
- Lab色彩空间
几何特征
-
边缘
-
关键点
-
Harris角点
https://zhuanlan.zhihu.com/p/449970674
![img]()
-
FAST角点
![img]()
以像素值为圆心的圆上有连续12个像素点的强度都高于圆心点threshold时则判定为角点
-
斑点
高斯+二阶导零点
-
高斯金字塔
先对图像进行降采样,然后进行高斯滤波
-
SIFT(局部特征)
尺度空间:
DOG(高斯差分函数):
![img]()
对同一张图片使用不同\({\sigma}\)的高斯模糊处理,然后相减,得到边缘
LOG(高斯拉普拉斯算子):
高斯滤波+二阶梯度算子
二阶梯度算子:
![img]()
核函数:
![img]()
效果上DOG能够近似LOG算子,具有更小的计算复杂度
HOG算法(方向梯度直方图):
Gamma标准化:
为了减少光照的影响,对像素的灰度值进行标准化
\[\{[\frac{(i + 0.5)}{256}]^{\frac{1}{\gamma}}\}*256 - 0.5 \] -
Haar-like小波特征
用于人脸检测(人脸检测还有dlib包)
特征模板(15个):
![img]()
使用积分图来减小计算复杂度
![img]()
AdaBoost:
Haar级联分类器
-
SURF
对SIFT的计算进行改进,速度提升3倍
-
BRIEF
二进制编码描述子。先利用特征点检测算法获取图中特征点的位置然后使用BRIEF算法建立特征描述符
-
ORB
-
LBP
-
Gabor
三维高斯函数和三角函数的叠加
-
特征检测
图像分割
-
基于阈值的分割方法
-
大津法
最大类间方差
将图像划分成多个灰度级(类),求类间方差最大时划分的灰度级的个数
-
-
基于边缘的分割方法
-
基于区域的分割方法
-
区域生长
设置一个生长阈值,开始先选择一个生长点,然后根据周边像素点与该生长点之间的像素差值(如果小于生长阈值时)向外生长,并对新的区域像素值求平均值,对所有新的像素继续重复向外生长
-
分水岭
-
-
基于图论的分割方法(Graph Cuts)
-
GMM(高斯混合模型)
-
K-means(聚类)
超参数:K
将所有的数据点划分成K个类别。
-
GrabCut
-
-
DPM模型
-
SVM
-
插值算法(interpolation)
图像检索
通过特征提取算法获取图像中的特征,再对图像特征求相似度
- 相似检索
- 颜色、纹理、形状
- 局部特征点
- 词袋(bag of visual words)
Opencv
kp, descriptor = cv2.xfeatures2d.SIFT_create().detectAndCompute(img1, None) # 特征检测+特征描述
三维人体姿态估计
-
关键点检测
-
主流的方案
- up-bottom:先检测有人的区域,然后对区域检测关键点
- bottom-up:先检测图中所有关键点,然后使用聚类算法连线(确定人)
-
包含技术和算法
-
Mediapipe
-
OpenPose
github:https://github.com/CMU-Perceptual-Computing-Lab/openpose
-
DeepCut
bottom-up
-
AlphaPose
-
将二维平面的人体关键点点转换到三维空间
-
Simple Baselines for Human Pose Estimation and Tracking
-
HRNet
-
BlazePose
用于移动设备(追求速度)
![img]()
-
Tensorflow
Tensorflow2.0以后的版本移除了原来的 tf.Session(),换成了 tf.compat.v1.Session(),并且需要在前面写上 tf.compat.v1.disable_eager_execution()来保证 sess.run()能够执行
Flask
基本框架
使用Python开发的Web应用框架
# Demo
from flask import Flask
app = Flask(__name__)
@app.route('/') # 绑定url
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run(debug=True)
绑定url
@app.route(<url>):使用函数装饰器
app.add_url_rule(<parent_url>, <child_url>, <function_name>):绑定新的url
规则变量
@app.route('/hello/<variable_name>') # 在url中传递变量
def function(variable_name):
# do sth
@app.route('/hello/<int:int_var>') # 在url中传递变量(并申明变量的类型:int、float、path)
def function(int_var):
# do sth
重定向
redirect(url_for(<function_name>, args)):重定向跳转到函数<function_name>对应的页面
模板
Jinja2模板渲染引擎
<!--Demo-->
<h1>{{ username }}的个人主页</h1>
{% if bio %}
<p>{{ bio }}</p> {# 这里的缩进只是为了可读性,不是必须的 #}
{% else %}
<p>自我介绍为空。</p>
{% endif %} {# 大部分 Jinja 语句都需要声明关闭 #}
{{ ... }}用来标记变量。{% ... %}用来标记语句,比如 if 语句,for 语句等。{# ... #}用来写注释。{{ var | filter }}变量过滤器(相当于将左边的变量传入右边的函数中)
render_template(<html_file>, **kwargs):跳转到<html_file>文件页面
@app.route('/')
def index(): # 设置初始页面为form.html(默认flask从templates文件夹中查找模板文件)
return render_template(
'form.html',
my_str=my_str
)
在html模板文件中可以使用 {{var_name}}调用传入的参数
SLAM
基础知识
相机
-
单目相机
-
双目相机
通过两个摄像头拍摄图像的微小差异判断物体远近
近处物体变化大,远处物体变化小
-
深度相机
能够测得图像中每个像素点的深度
结构光ToF
主动测量,功耗大
量程小,易受外界环境影响
A* search algorithm
ROS
安装rosdepc
sudo pip3 install rosdepc
sudo rosdepc init
rosdepc update
创建catkin工作空间
mkdir -p catkin_ws/src
cd catkin_ws
catkin_make
source devel/setup.bash
创建package
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
rqt_graph
rosrun rqt_graph rqt_graph:可视化查看各节点之间的情况
vscode环境配置
task.json
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
CMakeList.txt配置
C++配置
add_executable(节点名称
src/C++源文件名.cpp
)
target_link_libraries(节点名称
${catkin_LIBRARIES}
)
Python配置
catkin_install_python(PROGRAMS
scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
Launch文件
-
创建
launch文件夹 -
在文件夹中创建
launch文件 -
文件内容
<launch> <node pkg="helloworld" type="demo_hello" name="hello" output="screen" /> <node pkg="turtlesim" type="turtlesim_node" name="t1"/> <node pkg="turtlesim" type="turtle_teleop_key" name="key1" /> </launch>- node ---> 包含的某个节点
- pkg -----> 功能包
- type ----> 被运行的节点文件
- name --> 为节点命名
- output-> 设置日志的输出目标
文件系统

ros工具包
下载命令:sudo apt install ros-noetic-<ros_package_name>
删除命令:sudo apt purge ros-noetic-<ros_package_name>
ros命令
rospack
ros + pack(age):与包相关的命令
rospack depends1 <package_name> # 查看包中的一级依赖 rospack depends1 <package_name> # 递归查看包中的所有依赖
rosnode
ros + node:与节点相关的命令
rosnode list # 查看所有正在运行的节点 rosnode info <node_name> # 查看节点的信息
rostopic
ros + topic:与话题相关的命令
Eigen
sudo apt install libeigen3-dev
链接库函数:sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen
库函数位置:/usr/include/eigen3
#include <Eigen/Core>
Eigen::Matrix<float, row, col> matrix_row_col; //声明矩阵
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic; //声明动态大小的矩阵
Eigen::MatrixXd matrix_x; //也是动态大小矩阵
Eigen::Vector3d v_3d; //库中预定义的类型(相当于Eigen::Matrix<float, 3, 1>)
matrix.block<m, n>() //获取矩阵左上角mxn的子矩阵
MatrixXd::Random(m, n) //随机(值为0~1)生成一个mxn的矩阵
CMake
CMakeLists.txt语法
# 单行注释
set(VARIABLE_NAME value) # 定义变量,可以通过${VARIABLE_NAME}调用
# 设置项目为debug模式:set(CMAKE_BUILD_TYPE "Release")
# 添加c++ 11标准支持:set(CMAKE_CXX_FLAGS "-std=c++11 -O2")
project(PROJECT_NAME) # 定义项目名(之后可以通过${PROJECT_NAME}调用)
message("sth to print")
find_package(OpenCV REQUIRED) # 寻找OpenCV库
add_library(<lib> <lib_file>) # 添加静态库
add_library(<lib> SHARED <lib_file>) # 添加共享库
# 静态库在每次调用时都会生成一个副本,而共享库则只会生成一个副本,更节省空间
include_directories(<header_files_directory>) # 添加库文件路径(针对于系统库文件)
# ex: include_directories("/usr/include/eigen3")
target_link_libraries(<exe> <lib>) # 将库链接到可执行文件中
# ex: target_link_libraries(undistortImage ${OpenCV_LIBS})
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
CMake使用方法
# 使用cmake编译C项目
mkdir build && cd build
cmake ..
make
# 编译并安装到电脑
sudo make install -j4 # 使用4条线程
Opencv
#include <opencv2/core/core.hpp>
cv::Mat img1;
img1 = cv::imread("test.jpg");
cv::imshow("image", img1);
cv::imwrite("output.jpg", img1);
cv::Mat img2(img1); //copy constructor
cv::Mat img3(img1, cv::Rect(10, 10, 100, 100)); //slice of index
//Rect(x, y, width, height)
cv::Mat img4 = img1(Range::all(), Range(1, 100));
cv::Mat img5 = img1.clone();
cv::Mat img6;
img1.copyTo(img6); //same as clone()
cv::Mat::eye(height, width, <data_type>);
cv::Mat::ones(height, width, <data_type>);
cv::Mat::zeros(height, width, <data_type>);
//遍历图片Mat中的像素
uchar *rowPtr,
for (int r=0; r<img1.rows; r++) { //行遍历
rowPtr = img1.ptr<uchar>(r); //行指针
for (int c=0; c<img1.cols; c++) { //列遍历
//for (int ch=0; ch<img1.channels(); ch++) { //通道遍历
//
//}
rowPtr[c] //对应像素
}
}
C++语法
宏定义
#define xxx xxx
宏定义与
const修饰符的区别宏定义只会把后面定义的常量原封不动的进行替换,而不会进行类型的判断
const修饰词
常量定义,且定义后的常量的值不能发生修改
-
常量的指针
const int *i = 10或int const *i = 10指针i的指向可以修改,但是不能通过指针来修改其指向的值
-
常指针
int *const i = 10指针i是一个常指针,不能修改其指向,但是可以通过指针来修改其指向的值
stringstream
#include <sstream> //头文件
stringstream sstream;
int i;
string s = "465";
sstream << s; //输入重定向
sstream >> i; //输出重定向(自动类型转换)
cout << "sstream.str is " << sstream.str() << endl;s //获取sstream中的string
sstream.str(""); //清空sstream中保存的string
sstream.clear(); //当进行多次不同类型转换时需要调用clear()函数
sstream << true;
sstream >> i;
cout << i << endl;
设计模式
单例模式
工厂模式
区块链
参考资料

工具

基础知识
Go语法
基础语法
-
字符串
字符串拼接:
"str1" + "str2"字符串格式化:
fmt.Printf(str, <fmt>) -> void:输出格式化字符串到标准输出string fmt.Sprintf() -> string:格式化字符串并输出新串 -
数据类型
数值类型:
uint8,uint16,uint32, ...布尔类型:
false,true指针类型:
uintptr...
-
变量声明
-
声明变量类型:
var i int:数值类型var list_i []int:数组类型 -
编译器根据值自动推断
var i = 10var str = "xxx" -
变量初始化
var intVal int //声明一个int类型变量 intVal = 10 //给变量赋值 intVal := 10 //与上两行作用相同 //注意:`:=`不用用于已经声明的变量,而且这种声明方式只能用于函数体中 -
全局变量声明
var ( v_name1 v_type1 v_name2 v_type2 )//声明v_name1,v_name2两个变量为全局变量
-
科创计划
基于Hololens2的视障人群环境感知应用开发
Hololens2是由微软公司研发的增强现实(AR)眼镜,具备强大的计算能力和深度感知技术。本应用采用先进的物体检测算法,通过Hololens2的传感器实时捕捉环境中的物体信息,并运用光学字符识别(OCR)算法解读文字,为用户提供环境中的文字信息。同时,引入SLAM定位技术,实现用户在空间中的精准定位和导航。通过综合利用这些先进技术,该应用旨在改善视障人士的生活质量,使其更便捷地适应和参与社会生活。本研究为AR技术在辅助功能领域的应用提供了创新思路,对于推动可穿戴设备在辅助生活方面的发展具有积极意义。
选题:
| 项目名称 | 项目内容简介 |
|---|---|
| 轻量级目标检测与位置估计技术研究 | 移动端目标检测具有广泛的应用,但有限的计算资源限制了AI网络规模和精度。设计和优化轻量级深度学习目标检测网络,应用到移动终端实现目标实时检测;基于深度图像,估计目标在空间中的位置, |
| 基于SLAM的空间定位方法研究 | 同时定位与建图(Simultaneous Localization and Mapping,SLAM)技术一直是机器人自主移动领域的研究重点,尤其在室内场景,缺乏GPS等全局定位信息。本项目基于已知室内高精度3D地图,基于RGB-D 、IMU等信息,估计当前的位置和姿态,定位出当前所在空间的具体位置。 |
| 基于AR眼镜的感知应用开发 | AR眼镜作为一新的交互终端,在工业制造、能源、交通等领域有着应用的需求,能极大的提升工作效率。视觉感知作为AR眼镜的基础,至关重要。本项目基于Holoens2 AR眼镜,开发智能感知AR应用,支持生活场景中常见物体的感知,语音播报目标种类及状态。 |
软件算法部分
目标检测
常用目标检测算法:
- R-CNN(区域卷积神经网络)
- YOLO
方位估计
-
视觉SLAM
定位周围物体
-
人体关键点检测
识别指定手势(人机交互)
计算处理模块
- 交互设计
- 操作系统
- 云计算/AI计算芯片
结构设计部分
- AR成像原理
- 三维建模设计眼镜外观
Hololens2 软件开发
环境搭建
- New Project——3D Core
![img]()
项目描述
设计一款基于AR眼镜的与外界进行无障碍交互的软件(或整机)
传感器
- RGB摄像头
- ToF传感器
- 麦克风、扬声器
- 、、、
功能
-
物体识别
能识别并显示物体种类(和语音播报)
-
障碍物检测
通过眼镜上的传感器进行三维场景建模,获取周围障碍物的距离(并进行语言播报)
-
手势识别
能识别手语并转换为文本(并进行语言播报)
优点
-
无障碍
语音交互
-
离线化
仅使用本地终端算力,能适应各种场景(电梯、地下室等封闭场所)
















浙公网安备 33010602011771号