Halcon/C# 图像窗口、读取图片及仿射变换

一、Halcon 清理窗口

        清除图像窗口的显示。

dev_clear_window()

二、Halcon 读取图片

(一) 读取一张图片

read_image (Image, 'printer_chip/printer_chip_01')Image:(输出参数)读取到的图片变量名
第二个参数:图片路径,这里可以自行修改为本地图片路径

(二) 转为灰度图

rgb1_to_gray(Image, GrayImage)

三、Halcon 仿射变换

(一) 概述

        仿射变换,即在二维平面内,对象进行平移、缩放、翻转、旋转和斜切等操作。

        仿射变换可以保持原来的线共点,点共线的关系不变,保持原来相互平行的线仍然平行;保持原来的中点仍是中点,保持原来在一直线上几段线段之间的比例关系不变,但不能保持原来的线段长度和夹角不变。

(二) 仿射变换类型

        仿射变换有:平移、缩放、翻转、旋转和斜切(就是将斜体字导正)。

(三) 仿射变换流程

        仿射变换的步骤主要有以下三步:

  1. 获取特征点坐标、角度;
  2. 对图像、区域、轮廓进行仿射变换。
  3. 计算仿射变换矩阵;

(四) 根据特征点、角度计算仿射变换矩阵

1. 从空变换矩阵创建仿射变换矩阵

        产生仿射变换矩阵(产生一个空的二维空变换矩阵)

hom_mat2d_identity(:::HomMat2dIdentity)

 2. 仿射变换图片

        在后续向空变换矩阵添加了需求(旋转、缩放等)之后,可以根据需要把仿射变换之后的图片显示出来。

affine_trans_image(Image,ImageAffineTrans,HomMat2d,'constant','false')Image:原始图片变量
ImageAffineTrans:仿射变换后的图片变量
HomMat2D(输入参数):仿射变换矩阵

3. 把旋转角度添加到仿射变换矩阵

        把旋转角度添加到仿射变换矩阵

hom_mat2d_rotate(::HomMat2d, Phi, Px, Py : HomMat2dRotate)HomMat2D(输入参数):仿射变换矩阵
Phi:旋转角度(单位弧度)
Px:变换的固定点行坐标。固定点是指以该点为支撑进行仿射变换(这里是指围绕这点进行旋转)
Py:变换的固定点列坐标
HomMt2DRotate:变换的固定点列坐标

        rad(角度) 函数用于旋转一定的角度。若为正,则顺时针旋转,若为负数,则逆时针旋转。

        例如有:

dev_clear_window()
read_image (Image, 'C:/Users/L/Desktop/练习.bmp')
hom_mat2d_identity (HomMat2DIdentity)
*创建一个旋转的仿射变换矩阵
hom_mat2d_rotate (HomMat2DIdentity, rad(90), 0, 0, HomMat2DRotate)
affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')

4. 把缩放添加到仿射变换矩阵

        把缩放添加到仿射变换矩阵

hom_mat2d_scale(::HomMat2D, Sx, Sy, Px, Py :HomMat2DScale)HomMat2D(输入参数):仿射变换矩阵
Sx(输入参数):x 轴方法的缩放因子
Sy(输入参数):y 轴方法的缩放因子
Px(输入参数):变换的固定点行坐标
Py(输入参数):变换的固定点列坐标
HomMat2DScale(输出参数):输出缩放变换矩阵

        例如有:

dev_clear_window ()
read_image (Image, 'C:/Users/L/Desktop/练习.bmp')
hom_mat2d_identity (HomMat2DIdentity)
*创建一个缩放的仿射变换矩阵
hom_mat2d_scale (HomMat2DIdentity, 0.5, 0.5, 0, 0, HomMat2DScale)
affine_trans_image (Image, ImageAffineTrans, HomMat2DScale, 'constant', 'false')

5. 把平移添加到仿射变换矩阵

        把平移添加到仿射变换矩阵

hom_mat2d_translate(::HomMat2D, Tx, Ty :HomMat2DTranslate)HomMat2D(输入参数):仿射变换矩阵
Tx(输入参数):沿 x 轴方向平移的距离
Ty(输入参数):沿 y 轴方向平移的距离
HomMat2DTranslate(输出参数):输出平移变换矩阵

        例如有:

dev_clear_window ()
read_image (Image, 'C:/Users/L/Desktop/练习.bmp')
hom_mat2d_identity (HomMat2DIdentity)
*创建一个平移的仿射变换矩阵
hom_mat2d_translate (HomMat2DIdentity, 200, 200, HomMat2DTranslate)
affine_trans_image (Image, ImageAffineTrans, HomMat2DTranslate, 'constant', 'false')

6. 把斜切添加到仿射变换矩阵

        把斜切添加到仿射变换矩阵

hom_mat2d_slant(::HomMat2D, Theta, Axis, Px, Py :HomMat2DSlant)HomMat2D(输入参数):仿射变换矩阵
Theta(输入参数):斜切角度(单位弧度)
Axis(输入参数):斜切的坐标值、取值列表:x,y
Px(输入参数):变换的固定点行坐标
Py(输入参数):变换的固定点列坐标
HomMat2DSlant(输出参数):输出斜切变换矩阵

        例如有:

dev_clear_window ()
read_image (Image, 'C:/Users/L/Desktop/练习.bmp')
hom_mat2d_identity (HomMat2DIdentity)
*创建一个斜切的仿射变换矩阵
hom_mat2d_slant (HomMat2DIdentity, rad(10), 'x', 130, 120, HomMat2DSlant)
affine_trans_image (Image, ImageAffineTrans, HomMat2DSlant, 'constant', 'false')

7. 根据点和角度计算刚性仿射变换矩阵

        根据点和角度计算刚性仿射变换矩阵,支持旋转和平移。一般用于处理斜着的图片,也就是将想要处理的地方转正。

vector_angle_to_rigid(::Row1, Column1, Angle1, Row2, Column2, Angle2 :HomMat2D)Row1(输入参数):原始点行坐标
Column1(输入参数):原始点列坐标
Angle1(输入参数):原始点角度
Row1(输入参数):变换的目的点行坐标
Column1(输入参数):变换的目的点列坐标
Angle1(输入参数):变换的目的点角度
HomMat2D(输出参数):输出仿射变换矩阵

        原始坐标可以通过一个算子获得:area_center(Image, Area, Row, Column),这里获得的是图片的中心点和对应面积 Area。原始角度也可以通过一个算子获得:orientation_region(Image, Phi),这时在使用点和角度计算刚性仿射变换矩阵时可以使用这两个算子,但需要注意变换的目的点角度需要更改,例如有:

dev_clear_window ()
read_image (Image, 'C:/Users/L/Desktop/练习.bmp')
*获取当前图片中心点及对应面积
area_center (Image, Area, Row, Column)
*获取图片原始弧度
orientation_region (Image, Phi)
*创建一个根据点和角度计算刚性仿射变换矩阵
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(0), HomMat2D)
*仿射变换图片
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')

        在获取图片原始弧度时,若获得的角度为负数,则变换的目的点角度一般为0°,若获得的角度为正数,则变换的目的点角度一般为180°。

(五) 根据多个特征点计算仿射变换矩阵

1. 根据两个以上特征点计算刚性仿射变换矩阵

        根据两个以上点计算刚性仿射变换矩阵,支持旋转和平移

vector_to_rigid(::Px, Py, Qx, Qy :HomMat2D)Px(输入参数):原始点组的 x 坐标
Py(输入参数):原始点组的 y 坐标
Qx(输入参数):变换的目的点组的 x 坐标
Qy(输入参数):变换的目的点组的 y 坐标
HomMat2D(输出参数):输出仿射变换矩阵

        例如有:

* 生成椭圆
gen_ellipse_contour_xld (ContEllipse, 200, 100, 0, 70, 95, rad(0), rad(360), 'positive', 2.5)
get_contour_xld (ContEllipse, Row, Col)
* 根据多个点生成仿射变换矩阵
vector_to_rigid (Col, Row, Col, Row, HomMat2D)
* 平移
hom_mat2d_translate (HomMat2D, 50, 150, HomMat2DTranslate)
* 仿射变换图片
affine_trans_contour_xld (ContEllipse, ContoursAffineTrans, HomMat2DTranslate)

2. 根据两个以上特征点计算近似仿射变换矩阵

vector_to_similarity(::Px, Py, Qx, Qy :HomMat2D)Px(输入参数):原始点组的 x 坐标
Py(输入参数):原始点组的 y 坐标
Qx(输入参数):变换的目的点组的 x 坐标
Qy(输入参数):变换的目的点组的 y 坐标
HomMat2D(输出参数):输出仿射变换矩阵

        例如有:

dev_clear_window ()* 生成椭圆
gen_ellipse_contour_xld (ContEllipse, 200, 100, rad(60), 70, 95, rad(0), rad(360), 'positive', 1.5)
* 得到椭圆的轮廓
get_contour_xld (ContEllipse, Row, Col)* 创建一个矩阵
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, 200, 150, HomMat2DTranslate)
affine_trans_contour_xld (ContEllipse, ContoursAffineTrans, HomMat2DTranslate)
hom_mat2d_rotate (HomMat2DTranslate, rad(90), 200, 150, HomMat2DRotate)
affine_trans_contour_xld (ContoursAffineTrans, ContoursAffineTrans1, HomMat2DRotate)
affine_trans_point_2d (HomMat2DRotate, Col, Row, Col1, Row1)* 生成一个近似的仿射变换矩阵
vector_to_similarity (Col1, Row1, Col1, Row1, HomMat2D)affine_trans_contour_xld (ContoursAffineTrans1, ContoursAffineTrans2, HomMat2D)

        计算刚性的仿射变换矩阵所获的的图片与计算近似的仿射变换矩阵所获的的图片基本相似。

3. 根据三个以上特征点获取仿射变换矩阵

        根据三个以上特征点计算仿射变换矩阵,支持旋转、平移、缩放、斜切。一般用于处理将图像坐标与物理坐标进行对应。

vector_to_hom_mat2d(::Px, Py, Qx, Qy :HomMat2D)Px(输入参数):原始点组的 x 坐标
Py(输入参数):原始点组的 y 坐标
Qx(输入参数):变换的目的点组的 x 坐标
Qy(输入参数):变换的目的点组的 y 坐标
HomMat2D(输出参数):输出仿射变换矩阵

        例如有:

* 图像坐标
r:=[400,350,680,50,45]
c:=[350,300,600,25,65]* 物理坐标(例如机械手臂)
r1:=[0,2,-2,-1,1]
c1:=[0,1,-4,-2,10]* 生成仿射变换矩阵
vector_to_hom_mat2d (r, c, r1, c1, HomMat2D)*图像坐标仿射变换为物理坐标
affine_trans_point_2d (HomMat2D, 500, 200, Qx, Qy)* 物理坐标放射为图像坐标
hom_mat2d_invert (HomMat2D, HomMat2DInvert)affine_trans_point_2d (HomMat2DInvert, Qx, Qy, Qx1, Qy1) 

4. 计算仿射变换参数

        根据仿射变换矩阵(齐次二维变换矩阵)计算仿射变换参数,主要用于得到一些列仿射变换(旋转、平移、缩放等)的数据。

hom_mat2d_affine_par(::HomMat2D :Sx, Sy, Phi, Theta, Tx, Ty)HomMat2D(输入参数):仿射变换矩阵
Sx(输入参数):x 方向的缩放因子(如果从图像空间变换到物理空间,就是 x 方向的像素单量)
Sy(输入参数):y 方向的缩放因子(如果从图像空间变换到物理空间,就是 y 方向的像素单量)
Phi(输出参数):旋转角度
Theta(输出参数):斜切角度
Tx(输出参数):沿 x 方向平移的距离
Ty(输出参数):沿 y 方向平移的距离

        例如有:

hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, 100, 100, HomMat2DTranslate)
hom_mat2d_scale (HomMat2DTranslate, 5, 5, 0, 0, HomMat2DScale)
hom_mat2d_rotate (HomMat2DScale, rad(90), 0, 0, HomMat2DRotate)
hom_mat2d_slant (HomMat2DRotate, rad(60), 'x', 0, 0, HomMat2DSlant)
hom_mat2d_to_affine_par (HomMat2DSlant, Sx, Sy, Phi, Theta, Tx, Ty)

(六) 对图像、region 和 XLD 进行仿射变换

1. 对 XLD 进行仿射变换

        对 XLD 轮廓进行二维仿射变换,支持缩放、平移、旋转、斜切

affine_trans_contour_xld(Contours :ContoursAffinTrans :HomMat2D :)Contours(输入参数):输入 XLD 轮廓
ContoursAffinTrans(输出参数):输出变换的 XLD 轮廓
HomMat2D(输入参数):仿射变换矩阵

        例如有:

dev_clear_window ()
read_image (Image, 'printer_chip/printer_chip_01')* 二值化
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 25000, 50000)
* 筛选左边第一个
select_obj (SelectedRegions, ObjectSelected, 4)
* 生成区域轮廓
gen_contour_region_xld (ObjectSelected, Contours, 'border')
* 将该区域移动到图像中心
area_center_xld (Contours, Area, Row, Column, PointOrder)
orientation_xld (Contours, Phi)
get_image_size (Image, Width, Height)
vector_angle_to_rigid (Row, Column, Phi, Width/2, Height/2, Phi, HomMat2D)
affine_trans_contour_xld (Contours, ContoursAffineTrans, HomMat2D)

2. 对图像 Image 进行仿射变换

        对图形轮廓进行二维仿射变换,支持缩放、平移、旋转、斜切

affine_trans_image(Image :ImageAffineTrans : HomMat2D,Interpolation,AdaptImageSize)Image(输入参数):输入图像
ImageAffineTrans(输出参数):变换后的图像
HomMat2D(输入参数):仿射变换矩阵
Interpolation(输入参数):插值算法。参数值列表 nearest_neighbor, bilinear,constant,weighted
AdaptImageSize(输入参数):结果图像尺寸是否自适应。默认值:false

        例如有:

dev_clear_window ()
read_image (Image, 'printer_chip/printer_chip_01')
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, 100, 100, HomMat2DTranslate)
affine_trans_image (Image, ImageAffineTrans, HomMat2DTranslate, 'constant', 'false')

3. 对 region 进行仿射变换

        对区域进行任意二维仿射变换,主要用于处理上述第四点的第7小节((四)、7),将要处理的斜着的图片中部分区域(例如:斜着拍到一张汽车图,将汽车图内斜着的车牌照扶正)筛选出来并进行仿射变换,这时就要用到区域仿射变换。

affine_trans_region(Region :RegionAffineTrans :HomMat2D, Interpolate)Region(输入参数):输入区域
RegionAffineTrans(输出参数):变换的区域
HomMat2D(输入参数):仿射变换矩阵
Interpolate(输入参数):插值算法。默认值 nearest_neighbor, 参数值列表 constant, nearest_neighbor

        例如有:

dev_clear_window ()
read_image (Image, 'printer_chip/printer_chip_01')
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, 100, 100, HomMat2DTranslate)
* 仿射变换区域
affine_trans_region (Image, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')
affine_trans_image (Image, ImageAffineTrans, HomMat2DTranslate, 'constant', 'false')

4. 对 polygon_xld 进行仿射变换

        轮廓线的点获取:

算子:get_region_contour(region, Rows, Columns)功能:获取已知区域 region 的散点,保存在 Rows,Columns 内

        获取线段区域:

算子:get_region_line(regline, row1, col1, row2, col2)功能:获取一条线段的区域,注意 regline 是个区域,不是像素列表,若要获取散列点如下:
get_region_line(RegionLines, 100, 50, 150, 250)
get_region_points(RegionLines, Rows, Columns)

        获取区域的像素元组:

算子:gen_region_points(regline, Rows, Columns)功能:将个别的像素存储为图像区域

        生成多边形:

算子:gen_region_polygon功能:将一个多边形存储为一个区域

        生成多边形实心:

算子:gen_region_polygon_filled(region, rows, cols)功能:将一个多边形存储为一个已填充区域

        从区域获取 xld :

算子:gen_contour_region_xld(reg, Contours, 'border')reg:输入区域
Contours:得到的 xld 对象

        生成多边形区域:

算子:gen_region_polygon_xld功能:创建一个 XLD 多边形中的区域

        对 XLD 多边形进行任意二维仿射变换,一般用于不是对图片而是对轮廓进行仿射变换时

affine_trans_polygon_xld(Polygon :PolygonsAffineTrans :HomMat2D:)Polygon(输入参数):输入 XLD 多边形
PolygonsAffineTrans(输出参数):变换的 XLD 多边形
HomMat2D(输入参数):仿射变换矩阵

        例如有:

dev_clear_window ()
row:=[100,50,50,100,300,300,300,100]
col:=[50,100,200,400,400,200,50,50]
* 空心多边形
*gen_region_polygon (PolygonRegion, row, col)
* 实心多边形
gen_region_polygon_filled (Region, row, col)
* 生成多边形轮廓
gen_contour_region_xld (Region, Contours, 'border')
area_center_xld (Contours, Area, Row, Column, PointOrder)
orientation_xld (Contours, Phi)
* 生成仿射变换矩阵
vector_angle_to_rigid (Phi, Phi, Phi, Phi, Phi, Phi, HomMat2D)
hom_mat2d_scale (HomMat2D, 0.5, 0.5, 0, 0, HomMat2DScale)
* 仿射变换多边形轮廓
affine_trans_contour_xld (Contours, ContoursAffineTrans, HomMat2DScale)

5. 对点进行仿射变换

        对点进行任意二维仿射变换,支持缩放、平移、旋转、斜切

affine_trans_point_2d(::HomMat2D, Px, Py :Qx, Qy)HomMat2D(输入参数):仿射变换矩阵
Px(输入参数):原始点 x 或行坐标
Py(输入参数):原始点 y 或列坐标
Qx(输出参数):变换点 x 或行坐标
Qy(输出参数):变换点 y 或列坐标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84793.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 反向代理服务和安装docker-compose

Nginx 反向代理服务和安装docker-compose Nginx Proxy Manager 他是一个可视化的nginx的反向代理神器,动动手指轻松的配置Nginx,我们可以通过一些网页,即可完成网站的代理配置,无需在动手安装Nginx; dockoer-compose部…

FPGA基础 -- Verilog 锁存器简介

由浅入深地讲解 Verilog 中的锁存器(Latch)**,包括: 什么是锁存器(定义与作用)锁存器的分类(透明锁存器 vs 边沿触发器)Verilog 中锁存器的建模方式锁存器与触发器的区别锁存器的时…

Eclipse Memory Analyzer (MAT) 相关配置调整

一、JDK版本过低提示 已安装高于 jdk 17 的版本依旧提示 jdk 版本过低,打开MAT的安装目录,在配置文件 MemoryAnalyzer.ini 中添加配置指向JDK即可。新增两行配置: -vm D:/jdk_21.0.7/bin/javaw.exe //jdk安装路径 bin 目录下的javaw.exe二…

机器学习常用评估指标

机器学习常用评估指标 机器学习的评价指标有精度、精确率、召回率、P-R曲线、F1 值、TPR、FPR、ROC等指标,还有在生物领域常用的敏感性、特异性等指标。 基础 在分类任务中,各指标的计算基础都来自于对正负样本的分类结果,用混淆矩阵表示&…

视频相似度检测算法(带课设报告)

摘 要 本文提出了一种基于关键帧特征提取的视频相似度检测方法,通过融合自适应采样与特征降维技术实现高效准确的视频内容比对。系统采用三阶段处理流程:首先对输入视频进行自适应关键帧采样,通过均匀间隔算法提取固定数量(默…

微服务江湖的爱恨情仇:Spring Cloud 与 Kubernetes 的双雄演义

引言:双雄并立,一个时代的序幕 微服务革命,如同一场燎原之火,将庞大、笨重的单体应用烧成灰烬,宣告了一个敏捷、独立、快速迭代的新纪元。然而,这场革命在摧毁旧世界的同时,也催生了一片混沌的新…

深度拆解RAGFlow分片引擎之切片实现

上一篇深度拆解RAGFlow分片引擎!3大阶段视觉增强,全网最硬核架构解析 讲了切片的整体流程,今天我们来拆下切片的实现。 我们在设置的时候,可以选择切片方法。这个参数是parser_id 在创建知识库的时候,选择对应的切片方…

CSS平滑滚动效果实现方法

一、纯CSS实现方案 使用 scroll-behavior 属性 属性值 auto (默认值):滚动框立即滚动smooth:滚动框以平滑的方式滚动 /* 全局平滑滚动 */ html {scroll-behavior: smooth; }/* 特定容器平滑滚动 */ .scroll-container {scroll-behavior: smooth;over…

李沐动手深度学习(pycharm中运行笔记)——12.权重衰退

12.权重衰退(与课程对应) 目录 一、权重衰退 1、使用均方范数作为硬性限制 2、使用均方范数作为柔性限制(通常这么做) 3、演示对最优解的影响 4、参数更新法则 5、总结 二、代码实现从零实现 三、代码实现简介实现 一、权重…

React Native【实战范例】同步跟随滚动

最终效果 实现原理 主动滚动区触发滚动事件,原生监听滚动值的变化,并用动画的方式实时同步到跟随滚动区 技术要点 使用 Animated.ScrollView 使用动画变量 const scrollY useRef(new Animated.Value(0)).current;主动滚动触发 onScroll,用 …

如何仅用AI开发完整的小程序<3>—创建小程序基础框架

1、启动小程序开发者工具-选择小程序,点击 2、创建一个项目工程 项目名称:自己填默认的也行,最好不要中文,拼音也行 目录:选择你的项目创建路径 AppID:可以先点测试号,后面再替换自己的AppID就…

SQL等价改写优化

or 与 union all的优化 在SQL开发中,我们经常会遇到这样的情况:需要组合多个相似但略有不同的查询结果。大多数开发者本能地使用UNION/UNION ALL来解决,这种方式直观易懂,但在特定场景下却隐藏着巨大的性能浪费。 本案例将从执行…

【已解决】 数据库INSERT操作时,Column count doesn’t match value count at row 1

【已解决】数据库INSERT操作时,ColumnColumn count doesn’t match value count at row 1 在开发过程中,我们经常会遇到数据库操作错误,其中之一就是 MySQL 中的 “Column count doesn’t match value count at row1” 错误。这个错误通常发…

管件接头的无序抓取

文章目录 1,目的2,过程3,易混易错点4,代码详解4.1,初始化窗口4.2,创建多视角立体视觉模型。4.3,创建表面匹配模型4.4,多视角立体视觉重建管件堆表面模型4.5,管道接头查找…

移远通信 × 紫光展锐,推动FWA “5G+AI”新体验

6月19日,在2025 MWC上海期间,移远通信宣布,携手紫光展锐,推出面向下一代CPE应用的“5GAI”融合解决方案。目前双方正联合多家CPE厂商开展方案深度调优,以加速5GAI CPE终端的产业化落地进程。 该方案以移远5G模组RG620…

深入理解Grad-CAM:用梯度可视化神经网络的“注意力“

深入理解Grad-CAM:用梯度可视化神经网络的"注意力" 引言 在深度学习的发展过程中,模型的可解释性一直是一个重要的研究方向。尽管现代神经网络在图像识别、自然语言处理等任务上取得了令人瞩目的成果,但它们往往被称为"黑盒…

离线环境jenkins构建前端部署镜像

gitlabjenkins 实现前端项目打包成 docker 镜像;gitlab部署就不赘述了;因部署的gitlab版本的webhooks有问题,无法进行配置,所以文章的构建是手动触发的。并且nodejs部署应该也能跟docker一样直接安装进jenkins的镜像(但是多版本可能就有其他问…

案例:塔能科技×某市智能照明——从传统亮化到智慧光生态的跨越

在城市发展的滚滚浪潮中,市政照明不仅是驱散黑夜的光明使者,更是衡量城市智能化水平的关键标尺。贵州某市的城市照明系统正经历一场意义深远的革新,塔能科技以创新科技为核心驱动力,为这座城市的夜间照明生态注入全新活力。通过智…

LeapMotion-HandPoseRecorder 脚本详解

HandPoseRecorder 脚本详解 这个脚本是一个用于在 Unity 中录制和保存 Leap Motion 手部姿势的工具。下面我将详细解释脚本的各个部分: 核心功能 该脚本的主要作用是: 从 Leap Motion 设备捕获当前手部姿势数据 将姿势数据序列化为可重用的 ScriptableObject 在 Unity 项目…

【Guava】0.做自己的编程语言

【Guava】0.做自己的编程语言 0.前言1.明确你的目标1.2.设计1.3.写一个介绍 2.开始吧! 0.前言 DO WHAT THE F**K YOU WANT TO DO 我相信,网上有许多各式各样的做自己的编程语言教程,but 都是这样 收费 shit 本教程教你真正教你实现一个名叫G…