使用Halcon变换与校正图像

使用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.rhkb.cn/news/391773.html

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

相关文章

Chainlit快速实现AI对话应用的界面定制化教程

前言 本文主要讲解如何自定义chainlit实现的网页界面的中的一些可以自定修改的样式的实现教程。比如修改自己的logo网站图标或者主题等 翻译 chainlit 默认网页界面显示的是英文,如果我们想显示为其他语言可以进行以下操作。 翻译文件位于项目根目录下的.chainli…

正点原子imx6ull-mini-Linux驱动之Linux I2C 驱动实验(21)

I2C 是很常用的一个串行通信接口,用于连接各种外设、传感器等器件,在裸机篇已经对 I.MX6U 的 I2C 接口做了详细的讲解。本章我们来学习一下如何在 Linux 下开发 I2C 接口器件 驱动,重点是学习 Linux 下的 I2C 驱动框架,按照指定的…

python中类class的魔法方法

开始介绍之前,我们先看下之前文章我们介绍过的内置类merryview的一些方法,如下图所示: 有很多双下划线开始和结束的method,这么多method是做啥子用的呢? 其实这些方法就是我们常说的魔法方法,也是python中的…

力扣——3143.正方形中的最多点数

题目: 自己的题解(史): PS:自己看了好几遍才看懂题目,然后想看题解,但是又看到了“标签”是 于是靠着自己效率极低的写了出来。 思路:二分 首先利用map,将每个坐标和标…

Es6常用的一些数组处理方法

在平时的开发中,我们很多时候用到数组结构数据,那么如何高效处理数组是可以提高开发效率的,现在越来越多人使用es6,那么它的很多方法简化了我们对数据的操作,比如以前数组循环用for循环写比较多的代码,现在…

20 注意力机制—注意力机制在seq2seq

1.使用注意力机制的seq2seq 注意力机制在 NLP 中的应用,也是最早的工作之一动机 在机器翻译的时候,每个生成的词可能相关于源句子中不同的词在语言翻译的时候,中文和英文之间的翻译可能会存在倒装,但是可能在西方语言之间,相同意思的句子中的词的位置可能近似地是对应的,…

Linux命令用法

文章目录 前言一、Linux基础命令1. Linux目录结构2. Linux命令入门3. 目录切换相关命令(cd、pwd)4. 相对路径、绝对路径和特殊路径符5. 创建目录命令((mkdir)6. 文件操作命令part1(touch、cat、more)7. 文件操作命令pa…

端侧模型与端到端模型,两者是一个东西吗

端侧模型 专为在端侧设备上运行而设计的人工智能模型,它们通常具有较小的模型参数量,以适应端侧设备的计算能力和内存限制。端侧模型可以快速响应,保护用户隐私,并且无需依赖云端算力,因此在消费电子产业中具有重要的…

学习记录——day25 多线程编程 临界资源 临界区 竞态 线程的同步互斥机制(用于解决竟态)

目录 ​编辑 一、多进程与多线程对比 二、 临界资源 临界区 竞态 例1:临界资源 实现 输入输出 例2:对临界资源 进行 减减 例子3:临界资源抢占使用 三、线程的同步互斥机制(用于解决竟态) 3.1基本概念 3.2线…

C# 实现改造 GooFlow 流程图插件与数据库应用的结合

目录 关于 GooFlow 功能需求 范例运行环境 设计数据表 流程项目表 流程项目节点明细表 流程项目节点审批人表 人员信息表 示例代码 流程图主功能 设置审批人信息 运行结果演示 总结 关于 GooFlow GooFlow 一个基于 Jquery/FontAwesome 的流程图/架构图画图插件&…

Spring File Storage(文件的对象存储)框架基本使用指南

概述 本文仅作为快速入门,深入学习及使用详见官网 云存储 在开发过程当中,会使用到存文档、图片、视频、音频等等,这些都会涉及存储的问题,文件可以直接存服务器,但需要考虑带宽和存储空间,另外一种方式…

漏洞挖掘 | src中一次证书站有趣的SQL注入

一、确定站点 按照以前文章中提到的寻找可进站测试的思路,找到了某证书站的一处站点,通告栏中写明了初始密码的结构,因此我们可通过信息搜集进入该站点(可以考虑去搜集比较老的学号,因为这样的账号要么被冻结,要么就是…

AMD Product Specifications - AMD 产品规格汇总

AMD Product Specifications - AMD 产品规格汇总 1. Desktop, Laptop and Workstation Processor Specifications (台式处理器、笔记本电脑处理器和工作站处理器规格)2. Server Processor Specifications (服务器处理器规格)3. Embedded Processor Specifications (嵌入式处理器…

土耳其射击运动员尤素夫迪凯克在巴黎奥运会上成为互联网热门人物

这名51岁的男子以自己的方式获得了第二名,这对他的祖国来说是一个历史性的时刻。 这位冷静沉着的土耳其手枪射击运动员周二在 2024 年巴黎奥运会上获得银牌,在网上吸引了众多粉丝。 尤素夫迪克与他的搭档塞夫瓦尔伊莱达塔尔汉在混合团体 10 米气手枪比赛中获得第二…

jupyter notebook安装

1.安装 pip install notebook 2.显示配置文件: jupyter notebook --generate-config 3.修改代码路径: 编辑配置文件C:\Users\a\.jupyterjupyter_notebook_config.py 4.运行 jupyter notebook 会自动弹出http://localhost:8888/tree

QT 笔记

HTTPS SSL配置 下载配置 子父对象 QTimer *timer new QTimer; // QTimer inherits QObject timer->inherits("QTimer"); // returns true timer->inherits("QObject"); // returns true timer->inherits("QAbst…

保形分位数回归(CQR)

目录 简介1 介绍提纲式总结 分位数回归从数据中估计分位数 3 共性预测4 保形分位数回归(CQR)两个定理 6 实验7 结论 简介 保形预测是一种构造在有限样本中获得有效覆盖的预测区间的技术,无需进行分布假设。尽管有这种吸引力,但现有的保形方法可能是不必…

【文心智能体】梗图七夕版,一分钟让你看懂如何优化prompt,以及解析低代码工作流编排实现过程和零代码结合插件实现过程,依然是干货满满,进来康康吧

目录 背景什么是梗图梗图概念梗图结构 低代码开发最小运行单元大模型链提示词模板文心模板输出效果 测试工具链HTTP请求工具 梗图工具链全流程 梗图优化Prompt提示词优化后梗图结构提示词前后对比优化前效果优化后效果API接口BOS图片水印 梗图插件格式说明构思插件清单文件定义…

HTML-07.表格标签

一、要制作的表格如下 二、代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格标签<…

数据结构——双链表详解(超详细)

前言&#xff1a; 小编在之前已经写过单链表的创建了&#xff0c;接下来要开始双链表的讲解了&#xff0c;双链表比单链表要复杂一些&#xff0c;不过确实要比单链表更好进行实现&#xff01;下面紧跟小编的步伐&#xff0c;开启今天的双链表之旅&#xff01; 目录 1.概念和结构…