使用Halcon变换与校正图像

news2024/9/29 21:22:27

使用Halcon变换与校正图像

文章目录

  • 使用Halcon变换与校正图像
    • 1. 二维图像的平移、旋转和缩放
      • 1.图像的平移
      • 2.图像的旋转
      • 3.图像的缩放
      • 2. 图像的仿射变换
      • 3. 投影变换
      • 4 实例:透视形变图像校正

由于相机拍摄的时候可能存在角度偏差,因此实际获得的画面可能会与想象中有所差异。例如采集连续目标时,可能每幅图中目标区域的位置和角度都不一样;又或者目标对象是一块矩形区域,而在采集到的图像中,这一块可能变成了梯形或扭曲的四边形。
因此,接下来要做的第一件事,就是把这块区域进行一些调整,使之恢复成原本的矩形区域。
本节就以解决图像形状失真问题为目的,介绍Halcon中的图像二维变换方法。

1. 二维图像的平移、旋转和缩放

为了校正图像在拍摄中的失真问题,可以对图像进行一些简单的几何变换,如平移、缩放和旋
转等,这些是图形学中的基本几何变换。
一个点P。的位置可以用3个坐标表示(xp,Pp2,),这3个坐标也可以看成一个3D向量。

1.图像的平移

如果将这个点移动(x,y)个向量,相当于在p坐标的左边乘以一个平移矩阵T。设平移后的
点为p,如公式所示。
在这里插入图片描述

2.图像的旋转

如果将这个点在二维平面上绕坐标原点旋转角度y,相当于在p坐标的左边乘以一个旋转矩阵
R。设旋转后的点为pr,如公式所示。
在这里插入图片描述

3.图像的缩放

假设这个点在二维平面上,沿x轴方向放大s倍,沿y轴方向放大s倍,那么变化后的该点
的坐标记为p,如公式所示。
在这里插入图片描述

2. 图像的仿射变换

把平移、旋转和缩放结合起来,可以在Halcon中使用仿射变换的相关算子。一个仿射变换矩阵包括平移向量和旋转向量。
1.仿射变换矩阵
在仿射变换前,先确定仿射变换矩阵,步骤如下。
(1)使用hom_mat2d_identity(HomMat2DIdentity)创建一个空的仿射变换矩阵。
(2)指定变换的参数,这里可以指定平移、缩放、旋转参数,举例如下。
设置平移矩阵,向x轴正方向平移30个像素,向y轴正方向平移30个像素:hom_mat2d
translate (HomMat2DIdentity, 30, 30, HomMat2DTranslate).
设置旋转矩阵,以点(P2,P,)为参考点,旋转角度phi:hom mat2d rotate (HomMat2DIdentity
rad(phi),Px,Py, HomMat2DRotate)。
设置缩放矩阵,以点(PP,)为参考点,放大2倍:hom_mat2d_scale(HomMat2DRotate,2,2,
Px,Py,HomMat2DScale)。
2.应用仿射变换矩阵
仿射变换矩阵可以应用于像素点(Pixel)、二维点(Point)、图像(Image)、区域(Region)及XLD轮廓等对象。下面分别举例。
(1)应用于像素点:使用affine_trans_pixel算子。
(2)应用于二维点:使用affine_transpoint2d算子。
(3)应用于图像:使用affine_trans _image算子。
(4)应用于区域:使用affine_trans region算子。
(5)应用于XLD轮廓:使用affine_trans_contour_xld算子。

3. 投影变换

上文介绍的仿射变换其实是投影变换的一个特殊例子,其特殊性在于变换后图像的形状仍然维持原状。投影变换包括的情况很多,有可能变换前后图像的形状发生了很大的改变,如对边不再平行,或者发生了透视畸变等,这时可以使用投影变换使其恢复原状。其步骤与仿射变换类似,首先计算投影变换矩阵,然后计算投影变换参数,最后将投影变换矩阵映射到对象上。
要计算投影变换矩阵,应找出投影区域的特征点的位置及其投影后的位置,通过hom_vector to proj_hom_mat2d算子进行换算,就可以根据已知的投影对应的点的值计算投影变换矩阵。然后使用projective_trans_image对图像进行投射变换,就能得到投影后的图像了。下面用一个实例进行介绍。

4 实例:透视形变图像校正

透视形变图像校正步骤如下。
(1)读取图像,并对图像进行简单的处理,分割出目标形变区域。
(2)获取形变区域的轮廓,并计算出顶点坐标信息。
(3)利用上一步得出的坐标信息,计算投影变换矩阵。
(4)进行投影变换。
透视形变图像校正结果如图所示。
在这里插入图片描述实现代码参考如下:

*关闭当前显示窗口,清空屏幕
dev_close_window ()
*读取测试图像
read _image (Image _display, 'data/display.jpg')
*将图像转化为灰度图像
rgbl_to_gray (Image _display, GrayImage)
*获取图像的尺寸
get_image_size (Image_display, imagewidth, imageHeight)
*新建显示窗口,适应图像尺寸
dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandlel)
dev_display (GrayImage)
*初始化角点坐标
XCoordCorners := []
YCoordCorners := []
*阈值处理,提取较暗的区域
threshold(GrayImage,DarkRegion,0,
*分离不相连的区域
connection (DarkRegion, ConnectedRegions)
*选择面积最大的暗色区域,即屏幕区域
select_shape_std (ConnectedRegions, displayRegion, 'max_area', 70)
*裁剪屏幕区域
reduce_domain (GrayImage, displayRegion, displayImage)
*创建边缘轮廓
gen_contour_region_xld (displayRegion, Contours, 'border')
*将轮廓分割为边
segment_contours_xld (Contours, ContoursSplit, 'lines', 5, 4, 2)
*获取边的数量
count_obj (ContoursSplit, Number)
*存储每条边的起点位置
for index:=1 to Number by 1
select obj(ContoursSplit, Objectcurrent, index)
*拟合每条边
fit_line_contour_xld (0bjectcurrent, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, NI, Nc, Dist)
*存储每条边的顶点x坐标
tuple_concat (XCoordCorners, RowBegin, XCoordCorners)
*存储每条边的顶点y坐标
tuple_concat (YCoordCorners, ColBegin, YCoordCorners)
endfor
*投影变换,为4个特征点与校正后的坐标建立关联
XOff:= 100
YOff:= 100*imageHeight/imagewidth
hom_vector_to_proj_hom_mat2d (XCoordCorners, YCoordCorners, [1,1,1,1], [YOff,YOff, imageHeight-YOff,imageHeight-YOff], 
[xoff,imagewidth-xOff, imagewidth-XOff,XOff],[1,1,1,1], 'normalized dlt', HomMat2D)
*投影变换
projective_trans_image (Image _display, Image rectified, HomMat2D, 'bilinear', 'false','false')
*显示校正结果
dev_display (Image _rectified)

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

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

相关文章

(C23/C++23) 语句末尾的标签

文章目录 🔖前言🏷️ref🏷️标号 🔖兼容🏷️23标准前🏷️23标准后🏷️原因 🔖未兼容🔖END🌟关注我 🔖前言 🏷️ref C23提案复合语句末…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 两数之和绝对值最小(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

基于机器学习和深度学习的时间序列分析和预测(Python)

时间序列数据与其它数据不同主要是因为时间序列数据在时间维度上存在依赖关系,这说明在时间序列数据当中过去的历史数据当中隐藏着一些时间序列数据固有的特性,例如,周期性、趋势性、不规则性等。时间序列预测便是通过不同的方法来捕捉这种规…

【抽象工厂模式】从理论到实战:构建可扩展的软件家族(设计模式系列)

文章目录 Java设计模式系列:抽象工厂模式详解1. 引言抽象工厂模式概述为何选择抽象工厂模式 2. 基础知识回顾Java基础概念复习面向对象编程原则设计模式的原则和目的 3. 抽象工厂模式的定义定义与解释模式的目的与其他工厂模式的区别 4. 抽象工厂模式的结构抽象产品…

【Android】数据持久化——数据存储

持久化技术简介 在你打开完成了一份PPT之后关闭程序,再次打开肯定是希望之前的内容还存在在电脑上,一打开PPT,之前的内容就自动出现了。数据持久化就是将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下…

React 学习——别名路径配置(可以使用@代表src),引用文件时使用;联想路径提示

一.别名路径配置 1、安装craco (npm i -D craco/craco);安装成功的截图如下: 2、在项目的根目录下创建一个 名为 craco.config.js 文件;(必须是根目录下,名称必须和我这个一样)&…

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇:实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇:实用指南与案…

嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)

树莓派性能非常强悍,但是对于某些复杂的项目来说,会出现心有余而口不足的情况,为了解决这类问题,可以在树莓派上使用扩展板,我们介绍几款常见的扩展板,不仅可以扩展到树莓派,其他单片机或嵌入式…

Vue3 列表自动滚动播放(表头固定、列表内容自动滚动播放)+ vue3-seamless-scroll - 附完整示例

vue3-seamless-scroll:Vue3.0 无缝滚动组件,支持Vite2.0,支持服务端打包 目前组件支持上下左右无缝滚动,单步滚动,并且支持复杂图标的无缝滚动,目前组件支持平台与Vue3.0支持平台一致。 目录 效果 一、介绍…

安装vscode -- linux

前言 相信很多人在刚开始使用linux时,不知道怎么安装vscode来辅助我们编程,那么我将在此记录我所用的安装vscode的方法。 安装方法 方法一:snap 第一步:检查软件更新状况 sudo apt update在终端输入上述命令,会提…

大模型学习笔记 - LLM 之RLHF人类对齐的简单总结

LLM - RLHF人类对齐的简单总结 LLM-人类对齐 1. RLHF(Reinforcement Learning from Human Feedback, RLHF),基于人类反馈的强化学习2 奖励模型训练3 强化学习训练 3.1 PPO介绍3.2 进阶的RLHF的介绍 3.2.1. 过程监督奖励模型3.2.2. 基于AI反馈的强化学习3.2.3. 非强化学习的对齐…

卷积神经网络 - 基本卷积函数的变体篇

序言 在深度学习和卷积神经网络( CNN \text{CNN} CNN)的广阔领域中,基本卷积函数是构建网络结构的基础,它们通过滑动窗口的方式对输入数据进行特征提取。然而,随着应用场景和数据复杂性的增加,单一的卷积方…

苹果Vision Pro生态发展:现状、挑战与未来展望

苹果公司以其创新技术和强大的生态系统闻名于世。在最近的财报会议上,CEO蒂姆库克分享了Vision Pro平台的最新进展,引发了业界的广泛关注。本文将深入探讨Vision Pro生态的现状、面临的挑战以及与其他XR平台的对比分析。 一、Vision Pro生态现状 据库克介绍,Vision Pro平台…

爬1688商品---(测试版)

半成品. from DrissionPage import ChromiumPage import time from selenium import webdriver urlhttps://p4psearch.1688.com/hamlet.html?scene6&cositebaidujj_pz&locationre&trackid885662561117990122602pageChromiumPage()page.get(url)def key_wof():inde…

C++ QT开发 学习笔记(3)

C QT开发 学习笔记(3) - WPS项目 标准对话框 对话框类说明静态函数函数说明QFileDialog文件对话框getOpenFileName()选择打开一个文件getOpenFileNames()选择打开多个文件getSaveFileName()选择保存一个文件getExistingDirectory()选择一个己有的目录getOpenFileUrl()选择打幵…

荒原之梦考研:考研二战会很难吗?

考研二战是不是很难,其实很大程度上取决于我们自己,我们能否认清自己的优势,能否指定和执行合理的计划,有没有强大的心理支撑等,都是决定考研二战能否成功,或者能否比较轻松的成功的关键。 在本文中&#…

HCIP重修总笔记(中)

第八节 BGP基础 一、BGP产生背景 BGPBorder Gateway Protocol,边界网关协议)是一种用于自治系统间的动态路出协议,是一种外部网关协议。 自治系统AS:一组同一个管理机构进行管理,对外呈现统一选路策略的路由器的集合。 自治系统编号: …

浅谈基础的图算法——强联通分量算法(c++)

文章目录 强联通分量SCC概念例子有向图的DFS树代码例题讲解[POI2008] BLO-Blockade题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路AC代码 【模板】割点(割顶)题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示…

数据结构实验报告-顺序表

桂 林 理 工 大 学 实 验 报 告 一、实验名称 实验1 顺序表 二、实验内容: 1.将书中介绍的顺序表的基本算法(如初始化、求长度、插人、删除、输出等)汇总在一起,用一个完整的程序实现顺序表的基本运算,并且编写顺序表的判空、判满等基…

最常见的AI大模型总结

前言:大模型可以根据其主要的应领域和功能,可以分类为“文生文”(Text-to-Text)、“文生图”(Text-to-Image)和“文生视频”(Text-to-Video),都是基于自然语言处理&#…