halcon中的放射变换

news2024/9/20 20:42:09

放射变换原理

怎样计算放射变换

仿射变换affine是透视变换的子集 - 仿射矩阵
在这里插入图片描述
仿射变换矩阵为2*3的矩阵,第三列的元素起着平移的作用,前面两列的数字对角线上是缩放,其余为旋转或者斜切的作用 - 计算仿射矩阵只需要3对不共线的点

定义

指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

平移变换

在这里插入图片描述

缩放变换

在这里插入图片描述

翻转

在这里插入图片描述

斜切变换

在这里插入图片描述

刚体运动

在这里插入图片描述

放射变换流程

要进行仿射变换,必须先获取变换矩阵。要获取变换矩阵,必须先获取特征点坐标、角度等信息,几何匹配和bolb分析是获取特征点的高效方法。
1、通过hom_mat2d_identity(:::HomMat2DIdentity)算子创建一个初始化矩阵 即[1 0 0 0 1 0 0 0 1]。
2、在初始化矩阵的基础上,使用各种变换形式(平移、缩放、旋转)生成仿射变换矩阵。

// 把旋转角度添加到仿射变换矩阵
 hom_mat2d_rotate(HomMat2D, // 输入仿射变换矩阵(等于给了一个原始矩阵位置)
                  Phi, // 输入旋转角度(弧度制)
                  Px,Py, // 变换的参考点(围绕该点进行旋转)
                  HomMat2DRotate) // 输出旋转变换矩阵
 ​
 // 把缩放添加到仿射变换矩阵
 hom_mat2d_scale(HomMat2D,
                 Sx,Sy, // x,y轴缩放比例
                 Px,Py, // 变换的参考点(围绕该点进行缩放)
                 HomMat2DScale) // 输出缩放变换矩阵
     
 // 把平移添加到仿射变换矩阵
 hom_mat2d_translate(HomMat2D,
                     Tx,Ty, // 沿x轴、y轴方向平移的距离
                     HomMat2DTranslate) // 输出平移矩阵
 ​
 // 把斜切添加到仿射变换矩阵
 hom_mat2d_slant(HomMat2D,
                 Theta, // 输入斜切角度(弧度制)
                 Axis, // 输入斜切的坐标轴。取值列表:x,y
                 Px,Py,
                 HomMat2DSlant) // 输出斜切变换矩阵
计算已知点运动后的仿射矩阵

 // 根据两个以上点对计算刚性仿射变换矩阵,支持旋转和平移
 ​
 // 求平移或旋转矩阵
 vector_angle_to_rigid(Px,Py, // 区域变换之前中心点的坐标
                       Phi, // 夹角(极轴水平向右的夹角始边 逆时针为正 顺时针为负)
                       Qx,Qy, // 区域变换之后的坐标
                       Phi1, // 变换之后的角度
                       HomMat2D) // 输出仿射变换矩阵
 ​
 vector_to_rigid(Px,Py, // 输入原始点组的x、y坐标
                 Qx,Qy, // 输入变换后点组的x、y坐标
                 HomMat2D) // 输出仿射变换矩阵
 ​
 // 根据两个以上点对计算相似仿射变换矩阵,支持旋转、平移和缩放
 vector_to_similarity(::Px,Py,Qx,Qy:HomMat2D)
    
 // 根据三个以上点对计算仿射变换矩阵,支持旋转、平移、缩放、斜切
 vector_to_hom_mat2d(::Px,Py,Qx,Qy:HomMat2D)

3、根据生成的变换矩阵执行仿射变换,对图像、区域、轮廓进行仿射变换。

 // 对XLD轮廓进行二维仿射变换,支持缩放,旋转,平移,斜切
 affine_trans_contour_xld(Contours, // 输入XLD轮廓
                          ContoursAffinTrans, // 输出变换的XLD轮廓
                          HomMat2D) // 输入仿射变换矩阵
 ​
 // 对图像轮廓进行二维仿射变换,支持缩放、旋转、平移,斜切
 affine_trans_image(Image, // 输入图像
                    ImageAffinTrans, // 输出变换后的图像
                    HomMat2D,
                    Interpolation, // 插值算法。参数值列表: nearest_neighbor,bilinear,constant,weighted
                    AdaptImageSize) // 结果图像尺寸是否自适应。默认值:false
 ​
 // 对区域进行任意二维仿射变换
 affine_trans_region(Region, // 输入区域
                     RegionAffineTrans, // 输出变换后的区域
                     HomMat2D, // 得到的矩阵变量
                     Interpolate) // 插值算法。默认值:nearest_neighbor。参数值列表:constant,nearest_neighbor
 ​
 // 对XLD多边形进行任意二维仿射变换
 affine_trans_polygon_xld(Polygon, // 输入XLD多边形
                          PolygonsAffinTrans, // 输出变换后的XLD多边形
                          HomMat2D)
 ​
 // 对点进行任意二维仿射变换,支持缩放、旋转、平移、斜切
 affine_trans_point_2d(HomMat2D,
                       Px,Py, // 原始点x或行坐标
                       Qx,Qy) // 变换点x或行坐标
 ​
 // 对像素进行任意二维仿射变换
 affine_trans_pixel(HomMat2D,
                    Row,Col, // 输入像素坐标
                    RowTrans,ColTrans) // 输出的变换像素坐标

应用案例
程序所用图片如下
在这里插入图片描述
完整代码

*获得窗口句柄
dev_get_window (WindowHandle)
*读取图片
read_image (Image, './affine.jpg')
*阈值处理
threshold (Image, Region, 0, 200)
*圆形开运算
opening_circle (Region, Region, 1.5) // 去毛刺
*连通区域处理
connection (Region, ConnectedRegions)
*选择给定形状的区域
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*得到变换的中心点
area_center (SelectedRegions, _, Row, Column) // 提取当前区域中心及面积
*定义区域填充模式 fill为填充,margin为边缘绘制
dev_set_draw ('margin')

*hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量
dev_display (Image)
** 在选择区域中心绘制十字叉
*创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0])
hom_mat2d_identity (HomMat2DIdentity) 
*生成放射变换矩阵:平移
hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)
*进行放射变换
affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')

*hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值
dev_display (Image)
** 创建一个沿着区域中心选择的矩阵
** Halcon中逆时针选择为正,正时针为负
hom_mat2d_rotate (HomMat2DIdentity, rad(90), Row, Column, HomMat2DRotate)
affine_trans_region (Region, RegionAffineTrans1, HomMat2DRotate, 'nearest_neighbor')

*hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
hom_mat2d_scale (HomMat2DIdentity, 4.0, 4.0, Row, Column, HomMat2DScale)
affine_trans_region (Region, RegionAffineTrans3, HomMat2DScale, 'nearest_neighbor')

平移运行结果
在这里插入图片描述
旋转运行结果
在这里插入图片描述
缩放运行结果
在这里插入图片描述
有时候,并不需要创建初始化矩阵也可以执行仿射变换,可以使用vector_angle_to_rigid算子生成放射变换矩阵。

vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
程序所用图片如下
在这里插入图片描述
扣出图片中的车牌对进行旋转纠正,运行代码如下

* 1、把图像加载到Halcon中
read_image (Image, '3.jpg')
* 2、把图像灰度化处理
rgb1_to_gray (Image, GrayImage)
decompose3 (Image, RImage, GImage, BImage)
trans_from_rgb (RImage, GImage, BImage, HImage, SImage, VImage, 'hsv')
* 3、二值化【作用是什么?】[粗略筛选目标区域]【0~255】
threshold (GrayImage, Region, 0, 80)
* 4、区域砍断【作用什么?】【把需求的区域独立为一个单独区域方便后提取】
connection (Region, ConnectedRegions)
* 5、区域特征筛选区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 350000, 355000)
* 填充区域孔洞
fill_up (SelectedRegions, RegionFillUp)
** 把找到车牌区域转换为矩形2
shape_trans (RegionFillUp, RegionTrans, 'rectangle2')
** 增加精度图,做图像腐蚀处理
* erosion_circle (RegionTrans, RegionErosion, 17)
erosion_rectangle1 (RegionTrans, RegionErosion, 35, 35)
* 6、把该区域图像进行锁定
reduce_domain (GrayImage, RegionErosion, ImageReduced)
* 7、抠出锁定图像
crop_domain (ImageReduced, ImagePart)
********************** 图像扶正操作**************************
** 仿射变换
get_domain (ImagePart, ImagePartRegion)
** 提取区域中心
area_center (ImagePartRegion, _, Row, Column)
** 提取区域角度(phi)【弧度值】
orientation_region (ImagePartRegion, Phi)
** 根据中心坐标及区域弧度值创建仿射变换矩阵
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
** 仿射变换图像
affine_trans_image (ImagePart, ImageAffineTrans, HomMat2D, 'constant', 'false')

运行结果
在这里插入图片描述

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

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

相关文章

ozon买家网址是什么,跨境电商ozon买家网址

在网购的世界里,每一个平台都像是一座宝藏岛,等待着我们去探索、去发现。而提到跨境电商,不得不提的一个名字就是Ozon,它对于许多跨境购物爱好者来说,简直就是打开国际购物大门的金钥匙。那么,今天咱们就来…

米客方德SD NAND 掉电测试

SD NAND 异常上下电测试的作用 SD NAND 异常上下电测试是一项关键的测试步骤,对确保SD NAND在不同电源条件下的稳定性和可靠性至关重要。 通过模拟正常和异常电源情况,测试可以验证设备的电源管理功能、检测潜在错误和异常行为,并评估设备在…

巨人网络参展云栖大会,两款“游戏+AI”自研大模型应用首发

9月19日,2024云栖大会在杭州开幕,巨人网络携多项“游戏AI”新成果首次参展,两款自研大模型GiantGPT、BaiLing-TTS应用首发,巨人摹境、AI数字人等AI新技术亮相,全方位展示其作为中国“游戏AI”先行者在人工智能领域的前…

SAP付款和银行通信 预付款管理 集成场景

集成场景 用途 面向预付款管理的 SAP S/4HANA Cloud 提供与供给系统和转发系统的连接,以便输入和输出付款交易数据,作为其核心功能的一部分。 有关高级付款管理与外部供给系统和转发系统之间的通信的详细信息,请参阅文件处理器。 可以将预…

python基础(1)pyenv安装和对Django使用

pyenv安装 pyenv主要针对类 Unix 系统(如 Linux、macOS)用户,pyenv-win 是专为 Windows 开发的 pyenv 版本,允许您在不使用 WSL 的情况下管理多个 Python 版本和虚拟环境。 建议Git Bash: Powershell或Git Bash&…

如何使用ssm实现企业文档管理系统+vue

TOC ssm648企业文档管理系统vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。…

宠物空气净化器真的有必要买吗?哪款真的能吸毛?

这不是准备国庆小长假要来了吗,想带我家猫回家。但是我前一个月才告诉我妈我养了一只猫,她听到我养了猫之后,本来是没有任何波澜的,直到听到我说要把猫带回老家,还要和她一趟车回家的时候,她就开始骂我没良…

1.熟悉接口测试(Postman工具)

一、接口及其类型 API,应用编程接口,简称接口 通过接口,可以让程序和程序之间,能够互相交互。 接口分为两大类: 1)基于TCP全双工(适用于postman) 2)基于HTTP半双工 二、…

Flutter局域网广播(UDP通信)与TCP通信

前言 现在有一个需求,手机和ESP32通过WIFI进行通信。流程如下: 手机创建TCP服务器手机向192.168.0.255的1002端口广播自己的ip地址以及TCP服务器的端口号ESP32监听到1002的广播内容后,连接手机的TCP服务器。最后就是ESP32硬件和TCP服务器进…

C++速通LeetCode中等第2题-最长连续序列

方法一&#xff0c;排序后遍历&#xff0c;后减前1&#xff0c;计数&#xff0c; 相等跳过&#xff0c;后减前&#xff01;1就保存。 class Solution { public:int longestConsecutive(vector<int>& nums) {vector<int> ans;int count 1;sort(nums.begin(),n…

GPT代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

收集松果-第15届蓝桥省赛Scratch中级组真题第4题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第189讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

我的AI工具箱Tauri版-FunAsr音频转文本

本教程基于自研的AI工具箱Tauri版进行FunAsr音频转文本服务。 FunAsr音频转文本服务 是自研AI工具箱Tauri版中的一个高效模块&#xff0c;专为将音频或视频中的语音内容自动转化为文本或字幕而设计。用户只需简单配置输入、输出路径&#xff0c;即可通过FunAsr工具快速批量处理…

教你把PDF电子画册加背景音乐

​如何让您的PDF电子画册更具吸引力&#xff0c;让人一眼就能爱上它呢&#xff1f;答案就是为画册添加背景音乐&#xff01;添加背景音乐的PDF电子画册相较于普通画册&#xff0c;更能吸引读者的注意力&#xff0c;提升阅读体验。那么&#xff0c;如何为PDF电子画册添加背景音乐…

杭电OJ1009——猫鼠交换问题

杭电的OJ居然通不过<bits/stdc.h>这个头文件&#xff0c;需要小心 提供一个翻译版本 这里给两个版本 简单贪心拿下 //#include<bits/stdc.h> #include<iostream> #include<algorithm> using namespace std; struct Node{double j,f,p;//p是单价 }a[…

29. 查看threejs自带几何体顶点

查看three.js自带几何体顶点结构&#xff0c;基类(父类)BufferGeometry three.js提供的矩形平面PlaneGeometry、长方体BoxGeometry、球体SphereGeometry等各种形状的几何体&#xff0c;他们都有一个共同的父类BufferGeometry。这意味着这些几何体有哪些属性或方法&#xff0c;…

Java进阶之集合框架(Set)

【基本内容】 二、Set接口(接上一章) Set是Java集合框架中不允许有重复元素的无序集合&#xff0c;其典型的实现类是HashSet&#xff0c;它完全是遵循Set接口特性规范实现的&#xff0c;无序且不允许元素重复&#xff1b;而Set接口下的实现类还有LinkedHashSet和TreeSort&#…

Submariner 部署全过程

Submariner 部署全过程 部署集群配置 broker 集群&#xff1a; pod-cidr&#xff1a;11.244.0.0/16 service-cidr 11.96.0.0/12 broker 172.100.0.109 node 172.100.0.108 集群 1&#xff08; pve3 &#xff09;&#xff1a; pod-cidr&#xff1a;10.244.0.0/16 service-…

nodejs 011: nodejs事件驱动编程 EventEmitter 与 IPC

在 Node.js 和许多 JavaScript 环境中&#xff0c;EventEmitter 是一个非常重要的类&#xff0c;用于处理事件驱动编程。EventEmitter 是一个能够发射&#xff08;emit&#xff09;和监听&#xff08;on&#xff09;事件的对象。它常用于创建和处理事件机制&#xff0c;使得程序…