hom_mat2d_to_affine_par 的c#实现
hom_mat2d_to_affine_par 的c#实现
背景:为课室贡献一个通用函数,实现halcon算子的同等效果,查询csdn未果,deepseek二哥与chtgpt大哥给不了最终程序,在大哥与二哥帮助下,最终实现同等效果。
踩坑:1、缩放在x、y方向只输出正值,为负值时的翻转与对称的成像需要通过剪切值的正反去修正;
2、矩阵获得的变换过程对求解公式有影响,此处矩阵获得方式与halcon二维仿射变换矩阵获得方式一致(变换顺序:平移→旋转→剪切→缩放)

///
/// 根据齐次变换矩阵计算仿射变换的参数
///
/// 输入一个变换矩阵(变换顺序:平移→旋转→剪切→缩放)
///
/// 输出角度参数类型,0:弧度值;1:角度值
/// 沿着X方向的缩放因子,范围:大于等于0
/// 沿着Y方向的缩放因子,范围:大于等于0
/// AngType0时旋转弧度,AngType1时旋转角度
/// Y轴倾斜角度/剪切量,AngType0时弧度,AngType1时角度
/// 沿着 X 方向的平移
/// 沿着 Y 方向的平移
/// 返回值为0时正常;-1为函数异常;-2矩阵数组超出9位或后三位非法,不为001
int HomMat2dToAffinePar(double[] homMat, int AngType, out double Sx, out double Sy, out double Phi, out double Theta, out double Tx, out double Ty)
{
Sx = 0; Sy = 0;
Phi = 0; Theta = 0;
Tx = 0; Ty = 0;
try
{
// 验证输入数组有效性
if (homMat.Length != 9 || homMat[6] != 0 || homMat[7] != 0 || homMat[8] != 1)
{
return -2;
}
// 提取平移参数
Tx = homMat[2];
Ty = homMat[5];
// 提取线性变换部分double a = homMat[0];double b = homMat[1];double c = homMat[3];double d = homMat[4];// 计算X轴缩放和旋转角度Sx = Math.Sqrt(a * a + c * c);if (Sx < 1e-10){ return -1; }// 计算旋转角度Phi = Math.Atan2(c, a); // 弧度// 计算Y轴缩放double cosPhi = Math.Cos(Phi);double sinPhi = Math.Sin(Phi);Sy = Math.Sqrt(Math.Pow((b * cosPhi + d * sinPhi), 2) + Math.Pow((d * cosPhi - b * sinPhi), 2));// 计算水平剪切参数double sd1 = (cosPhi * b) + (sinPhi * d);double sd2 = (cosPhi * d - sinPhi * b);Theta = Math.Atan(sd1 / sd2);// 根据缩放只输出正值对水平剪切的影响,修改剪切值if (sd2 <= 0){Theta = sd1 <= 0 ? (Math.PI + Theta) : (-1 * (Math.PI + Theta));}else{Theta = (Theta * -1);}// 将弧度标准化到[-π, π]范围if (Phi > Math.PI){Phi -= (2 * Math.PI);}else if (Phi < -Math.PI){Phi += (2 * Math.PI);}if (Theta > Math.PI){Theta -= (2 * Math.PI);}else if (Theta < -Math.PI){Theta += (2 * Math.PI);}// 将弧度转为角度if (AngType == 1){Phi = Phi * (180 / Math.PI);Theta = Theta * (180 / Math.PI);}return 0;}catch (Exception e){return -1;}}
使用演示:在任意函数中实现
double[] g_CalibBYto6AxisHomMat3Test = { 0.99950, 0.000441, -160.94621, 0.00135, -1.000664, 110.402229, 0, 0, 1 };double Sx = 0;double Sy = 0;double Rot = 0;double Theta = 0;double Tx = 0;double Ty = 0;HomMat2dToAffinePar(g_CalibBYto6AxisHomMat3Test, 0, out Sx, out Sy, out Rot, out Theta, out Tx, out Ty);
测试结果:halcon算子hom_mat2d_to_affine_par与c#函数对比一致



相关文章:
hom_mat2d_to_affine_par 的c#实现
hom_mat2d_to_affine_par 的c#实现 背景:为课室贡献一个通用函数,实现halcon算子的同等效果,查询csdn未果,deepseek二哥与chtgpt大哥给不了最终程序,在大哥与二哥帮助下,最终实现同等效果。 踩坑…...
相机几何与标定:从三维世界到二维图像的映射
本系列课程将带领读者开启一场独特的三维视觉工程之旅。我们不再止步于教科书式的公式推导,而是聚焦于如何将抽象的数学原理转化为可落地的工程实践。通过解剖相机的光学特性、构建成像数学模型、解析坐标系转换链条,直至亲手实现参数标定代码࿰…...
GPTQ - 生成式预训练 Transformer 的精确训练后压缩
GPTQ - 生成式预训练 Transformer 的精确训练后压缩 flyfish 曾经是 https://github.com/AutoGPTQ/AutoGPTQ 现在是https://github.com/ModelCloud/GPTQModel 对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式预训练Tr…...
【Python项目】基于深度学习的电影评论情感分析系统
【Python项目】基于深度学习的电影评论情感分析系统 技术简介:采用Python技术、Flask框架、MySQL数据库、Word2Vec模型等实现。 系统简介:该系统基于深度学习技术,特别是Word2Vec模型,用于分析电影评论的情感倾向。系统分为前台…...
Redis特性总结
一、速度快 正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了 Redis 如此之快,可以…...
深入理解PHP的内存管理与优化技巧
深入理解PHP的内存管理与优化技巧 PHP作为一种广泛使用的服务器端脚本语言,其内存管理机制对于应用程序的性能和稳定性至关重要。本文将深入探讨PHP的内存管理机制,并提供一些优化技巧,帮助开发者更好地理解和优化PHP应用程序的内存使用。 …...
java常见的几种并发安全问题及解决方案
项目场景: 并发的应用场景,在开发过程会经常遇到。 例如:服务应用启动后,需要简单统计接口的总访问量;实时更新订单状态,成交总额。 问题描述: 比如统计接口访问次数,如下的实现&a…...
介绍一下安装时情况 kubernetes 集群
1.安装命令执行完毕 最开始告诉我们应用的版本 v1.29.14前置检测下载镜像写入证书因为当前我们所有的 kubernetes 集群的组件之间的联通 都是基于HTTPS协议实现的 补充知识点:BS架构,即Browser/Server(浏览器/服务器)架构模式&a…...
Dify部署踩坑指南(Windows+Mac)
组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本,nginx端口不要直接修改docker-compose.yaml !!!!!!! 1、更换镜像版本 这个文件是由.env自动生成的,在.env配置 …...
安科瑞新能源充电桩解决方案:驱动绿色未来,赋能智慧能源
安科瑞顾强 引言 在“双碳”目标与新能源汽车产业高速发展的双重驱动下,充电基础设施正成为能源转型的核心环节。安科瑞电气股份有限公司凭借在电力监控与能效管理领域20余年的技术积淀,推出新一代新能源充电桩解决方案,以智能化、高兼容性…...
深入剖析Java代理模式:静态代理与动态代理的实战应用
代理模式是Java开发中最重要的设计模式之一,广泛应用于性能监控、访问控制、日志记录等场景。本文将带你全面掌握代理模式的实现原理,并通过3种不同的代码实现方式,彻底理解这一核心设计模式的应用技巧。 一、代理模式的核心价值 代理模式(Proxy Pattern)通过创建代理对…...
JVM与性能调优详解
以下是关于 JVM与性能调优 的详细解析,结合理论、实践及常见问题,分多个维度展开: 一、JVM性能调优的核心目标 性能调优的核心目标是通过优化内存管理、垃圾回收(GC)策略和线程管理,实现以下平衡ÿ…...
【嵌入式通信协议】串口的详细介绍
以下是对嵌入式STM单片机通信串口的详细介绍 一、STM32串口通信基础 STM32的串口模块称为USART(Universal Synchronous/Asynchronous Receiver/Transmitter),支持同步和异步通信;而UART(Universal Asynchronous Receiver/Transmitter)仅支持异步通信。STM32F103C8T6包含…...
乐鑫打造全球首款 PSA Certified Level 2 RISC-V 芯片
乐鑫科技 (688018.SH) 荣幸宣布 ESP32-C6 于 2025 年 2 月 20 日获得 PSA Certified Level 2 认证。这一重要突破使 ESP32-C6 成为全球首款基于 RISC-V 架构获此认证的芯片,体现了乐鑫致力于为全球客户提供安全可靠、性能卓越的物联网解决方案的坚定承诺。 PSA 安全…...
Go学习笔记:基础语法3
1. 常量 Go语言中的常量使用关键字const定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。 由于编译时的限…...
虚拟卡 WildCard (野卡) 保姆级开卡教程
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学,要了解不同平台(Grok、Talkatone 等)的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时,一般都需要使…...
机试准备第10天
首先学习二分搜索法。使用二分查找需要先排序。第一题是查找,现学现卖。 //二分查找 #include <stdio.h> #include <vector> #include <algorithm> using namespace std; int main(){int n;scanf("%d", &n);vector<int> a(n…...
Apache ECharts介绍(基于JavaScript开发的开源数据可视化库,用于创建交互式图表)
文章目录 Apache ECharts 介绍功能概览多种图表类型- **基础类型**:折线图、柱状图、饼图、散点图。- **高级类型**:雷达图、热力图、桑基图、K线图。- **地理可视化**:支持地图(如中国、世界)和地理坐标系。- **3D支持…...
最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)
前期所需: 1.apache-tomcat-10.1.18-windows-x64(tomcat 10.1.8版本或者差不多新的版本都可以) 2.IntelliJ idea 24年版本 或更高版本 3.已经配置好MAVEN了(一定先配置MAVEN再搞TOMCAT会事半功倍很多) 如果有没配置…...
Linux - 进程通信
一、管道 管道是一种进程间通信(IPC)机制,用于在进程之间传递数据。它的本质是操作系统内核维护的一个内存缓冲区,配合文件描述符进行数据的读写。尽管管道的核心是内存缓冲区,但操作系统通过对管道的实现,…...
SFT别急着接RL!你的多模态大模型可能一直在“带伤训练”
PRISM团队 投稿量子位 | 公众号 QbitAISFT之后,直接上强化学习就够了吗?小心,你做的可能不是“训练”,而是“还债”。在多模态大模型(MLLM)的后训练中,行业内长期遵循着一个看似天经地义的范式&…...
当Agent开始自我调试、自我迭代——斯坦福CRFM最新实验揭示:自主进化阈值将在18个月内被突破
更多请点击: https://intelliparadigm.com 第一章:当Agent开始自我调试、自我迭代——斯坦福CRFM最新实验揭示:自主进化阈值将在18个月内被突破 核心突破:从工具调用到元认知闭环 斯坦福CRFM团队在2024年Q2发布的《Self-Improvi…...
美国不断自我革新的历史,为这个国家面对充满巨大机遇却又充满不确定性的未来提供了引人深思的经验教训
https://www.mckinsey.com/mgi/our-research/At-250-sustaining-Americas-competitive-edge 美国不断自我革新的历史,为这个国家面对充满巨大机遇却又充满不确定性的未来提供了引人深思的经验教训 这一切始于一场惊天动地的反抗行动。 1776年7月,来自13…...
用ZYNQ和LWIP搞定8路ADS8681数据采集:从Vivado Block Design到上位机TCP通信的完整流程
ZYNQ与LWIP构建的8通道高速数据采集系统实战指南 在工业自动化、测试测量和科研领域,多通道高精度数据采集系统正变得越来越重要。本文将详细介绍如何利用Xilinx ZYNQ SoC和LWIP协议栈,构建一个支持8路ADS8681同步采集的实时数据传输系统。不同于简单的代…...
ncmdumpGUI:3分钟掌握网易云音乐ncm格式转换的终极方案
ncmdumpGUI:3分钟掌握网易云音乐ncm格式转换的终极方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐下载了心爱的歌曲&a…...
从零打造会“看”的电子眼:Teensy与OLED的嵌入式图形与传感器实践
1. 项目概述:打造一个会“看”的电子生命体几年前,我第一次在创客社区看到“Uncanny Eyes”项目时就被深深吸引了。一个微小的OLED屏幕,在代码驱动下,竟然能呈现出如此逼真、灵动的眼球运动,那种介于生命与机械之间的诡…...
Git安全增强实战:使用Ante实现策略即代码的版本控制防护
1. 项目概述:一个为开发者打造的“代码保险箱”如果你和我一样,在职业生涯中经历过几次“代码灾难”——比如不小心git push -f覆盖了同事的提交,或者手滑rm -rf删除了一个正在开发中的功能分支——那你一定会对“代码安全”这四个字有切肤之…...
从零部署开源语音助手:OpenClaw项目实战与二次开发指南
1. 项目概述:从开源代码到可用的语音助手看到leilei926524-tech/openclaw-voice-assistant这个项目标题,我的第一反应是:又一个基于开源代码的语音助手项目。在GitHub上,类似的项目多如牛毛,但真正能让一个普通开发者&…...
Arm Neoverse CMN-700性能监控与优化实践
1. Arm Neoverse CMN-700性能监控体系解析在现代多核处理器架构中,性能监控单元(PMU)如同系统的"听诊器",能够实时捕捉微架构层面的各种行为指标。Arm Neoverse CMN-700作为面向基础设施级应用的互联架构,其PMU设计尤其强调对Mesh网…...
Proof Engine:简化零知识证明开发,降低区块链应用门槛
1. 项目概述:Proof Engine,一个为现代开发者设计的证明引擎如果你和我一样,在构建需要复杂逻辑验证、状态证明或零知识证明(ZKP)相关应用时,常常感到头疼——工具链复杂、学习曲线陡峭、不同框架间的兼容性…...
