Halcon :畸变矫正与标定(2)

  • 相机标定
  • 1.相机标定是什么
  • 2.怎么使用halcon进行相机内外参标定?
      • (1)搭建硬件
      • 1.**相机连好电脑,用相机厂家软件打开相机,检查一下相机是否正常。**
      • 2.**接下来使用halcon连接相机**
      • (2)开始标定
      • 1.**生成标定板参数文件**
      • 2.**配置标定参数**
      • 3.**开始标定相机**
      • **总结提取标志点失败原因
      • 4.**得到标定参数**
      • (3)使用标定出的数据矫正图像
      • 1**相机畸变矫正**
      • 2**相机坐标系转化成世界坐标系**
  • 终于完事了!

 

  • 博主写作不容易,还是需要您鼓励
  • 万水千山总是情 , 先点个赞行不行
 

如果大家看完这一篇文章后还想深入了解相机标定,可以参看文章《深入理解halcon相机标定》https://blog.csdn.net/cashmood/article/details/105221053

 

相机标定

这几天一直在搞相机的标定。过程中遇到了许许多多的问题,为了让广大自动化行业的小白避免踩坑,用这个帖子总结一下相机的标定。接下来我就给大家介绍一下标定,侧重点在怎么做。

1.相机标定是什么

首先镜头有畸变,也就是说照出的图像与实际不符产生了形变。即使号称无畸变的工业镜头也是有千分之几的畸变率的。上个图告诉大家畸变
在这里插入图片描述
这个图里,第一个图就是我们相机下的真实的形状,后边两个就是照出来有畸变的图片。

其次镜头与相机无论你的机械结构精度多高,也不容易或者说没办法将相机安装的特别正,那相机安装不正也是会导致误差的。大家想知道具体数学模型的话可以搜一下相机标定的理论方面的知识,我侧重怎么做。
标定就是把上述两个东西转化成正常的。

2.怎么使用halcon进行相机内外参标定?

(1)搭建硬件

首先相机连接电脑,打开halcon,连接相机(这里不一定要连接相机,用相机照好的图片也可以)。
这里说一下halcon连接相机,一般的相机都能用halcon连接,做标定很方便。给大家展示一下连接步骤。

1.相机连好电脑,用相机厂家软件打开相机,检查一下相机是否正常。

在这里插入图片描述
1框内是检查相机是否能够索引到,2框是看是否有图像,3框是检查帧率与带宽相机尺寸,4框是检查有无错误信息。
如果正常,用相机厂家软件关闭相机并且断开连接(这很重要,要不halcon连不上相机),记住停止采集不代表断开连接!!!
把相机固定好

2.接下来使用halcon连接相机

在这里插入图片描述
点击助手,点击打开新的ImageAcquisition。
在这里插入图片描述
选择图像获取接口,点击自动检测检测相机类型。后边的文本框里会显示相机类型,我的是千兆网相机,所以显示GigeVision。前边大家用相机厂家的软件打开了相机,那么说明大家都安装了相机厂家halcon连接的sdk,所以接口是可以检测到的,如果没安装相机厂家的软件要安装哦,不然连接不上。有啥不懂留言问我。
在这里插入图片描述
切换资源窗口到连接窗口
1就是咱们安装相机厂家软件之后的相机采集SDK包。
2选择你要连接的设备
3点击连接连接相机(如果有其他程序连着现在的相机,halcon是没办法连接上的,所以上边让大家记得断开连接)
4点击实时,实时显示图像
在这里插入图片描述
连接上相机并实时显示
1图像显示区域
2断开相机连接
3停止实时采集
在这里插入图片描述
进行完上述设置后停止实时采集,关闭ImageAcquisition窗口,不用保存,因为只要我们不关闭halcon这个图像采集ImageAcquisition01都可以在助手里边找到。
在这里插入图片描述

(2)开始标定

1.生成标定板参数文件

这个文件是描述你的标定板尺寸的,有了这个文件,halcon才知道你的标定板是多大的。
怎么生成呢,很简单
为了让大家方便复制,我把代码贴出来:
gen_caltab (7, 7, 0.004, 0.5, ‘C:/Users/Administrator/Desktop/caltab.descr’, ‘C:/Users/Administrator/Desktop/caltab.ps’)
关于gen_caltab 算子详细解释传送门点击即可查看gen_caltab 解释

2.配置标定参数

点击助手,点击打开新的Calibration。
在这里插入图片描述
在安装界面
1标定任务选择全标定,内外参数全部标定。
2.标定板的描述文件选择我们刚刚创建的描述文件。C:/Users/Administrator/Desktop/caltab.descr
厚度的话就填写标定板厚度
3.摄像机参数
选择摄像机模型,我的是面阵相机。镜头是远心镜头就选择远心
4.像元的宽高填写相机的像元尺寸,如果不知道去问相机厂家。焦距填写镜头的焦距。
确保以上内容填写正确!!!!
在这里插入图片描述
我的填写好后:
在这里插入图片描述

3.开始标定相机

接下来切换到标定栏,
1图像源选择图相采集助手
2点击这个显示图相采集助手按钮显示图像采集窗口
3点击连接连接相机,点击实时显示图像
4点击图像采集助手里的参数,调整焦距,调整光源,让成像质量好一点。(不过曝、标定片黑色圆点与白色背景对比度大于100、对焦清晰)
在这里插入图片描述
完成调整后,关闭图像采集助手的实时显示。关闭图像采集助手窗口。
1点击采集按钮采集标定板图像
2删除标志点提取失败的图像
3图像数量为3框不提示图像数量太少为止
4可以识别的标定板图像要把相机视野覆盖完全,哪里没有覆盖到可以点击show查看。
5点击这个按钮就可以出来标定数据了,但是如果有标志点提取失败的图像,或者图像数量太少,或者视野没有完全覆盖到,那么这个标定按钮会不可用,处理以上问题即可解决。

在这里插入图片描述
提取标志点成功图片,有各个标志点与xyz坐标轴
在这里插入图片描述
提取标志点失败图片,没有各个标志点与xyz坐标轴
在这里插入图片描述

**总结提取标志点失败原因

1、打光不均,有的地方亮有的地方暗
2、标定板的对比度不好,提取不出来标志点
3、标定文件读取错误,标定板的参数相差太大
4、对焦不清晰

4.得到标定参数

点击标定按钮,自动切换到结果界面。
在这里插入图片描述
1相机内参
2相机外参
在这里插入图片描述
1点击代码生成
2选择标定数据
3点击插入代码
在这里插入图片描述
生成的代码
CameraParameters为相机内参
CameraPose为相机外参
在这里插入图片描述

(3)使用标定出的数据矫正图像

1相机畸变矫正

CameraParameters := [0.00367057,-809.403,2.20647e-006,2.2e-006,1136.84,1064.02,2592,1944]
CameraPose := [0.0290517,-0.0118443,0.242762,0.3944,0.507229,287.921,0]
CamParVirtualFixed:=CameraParameters
read_image (Image, ImageFiles[Index])
gen_radial_distortion_map(MapFixed,CameraParameters,CamParVirtualFixed,'bilinear')
map_image(Image,MapFixed,ImageRectifiedFixed)

ImageRectifiedFixed就是进行了畸变矫正的图像

2相机坐标系转化成世界坐标系

一、像素点相机坐标转化成世界坐标系坐标

CameraParameters := [0.00367057,-809.403,2.20647e-006,2.2e-006,1136.84,1064.02,2592,1944]
CameraPose := [0.0290517,-0.0118443,0.242762,0.3944,0.507229,287.921,0]
read_image (Image, ImageFiles[Index])
image_points_to_world_plane (CameraParameters, CameraPose, TmpCtrl_ImageRows, TmpCtrl_ImageColumns, 'mm', TmpCtrl_WorldX, TmpCtrl_WorldY)

二、图片相机坐标转化成世界坐标系

CameraParameters := [0.00367057,-809.403,2.20647e-006,2.2e-006,1136.84,1064.02,2592,1944]
CameraPose := [0.0290517,-0.0118443,0.242762,0.3944,0.507229,287.921,0]
read_image (Image, ImageFiles[Index])
get_image_size (Image, Width, Height)
相机视野宽度
TmpCtrl_RectificationWidth := 79
转换成米单位
TmpCtrl_RectificationWidth := TmpCtrl_RectificationWidth / 1000.0
生成转换矩阵
gen_image_to_world_plane_map (TmpObj_RectificationMap, CameraParameters, CameraPose, Width, Height, Width, Height, TmpCtrl_RectificationWidth / Width, 'bilinear')
转换
map_image (Image, TmpObj_RectificationMap, TmpObj_RectifiedImage)

注意:像素转世界坐标系不用先进行畸变矫正,因为我们看到在转换成世界坐标系时候用到了CameraParameters,已经考虑了相机的畸变。

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

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

相关文章

Halcon:二维仿射变换实例探究

二维仿射变换,顾名思义就是在二维平面内,对对象进行平移、旋转、缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的)。 Halcon中进行仿射变换的常见步骤如下: ① 通过hom_mat2d_identity算子…

Halcon:手眼标定——眼在手外与眼在手上

为什么需要九点标定? 为了得到机械和相机的关系,就好比人的手和眼的关系。我们用手将一个物体放到空间的一个位置,用眼看到这个物体,这也存在两个坐标系,一个是手所在的运动空间的坐标系,一个是视网膜上成像…

grep 正则匹配

\{0,n\}:至多n次 \{\ 匹配/etc/passwd文件中数字出现只是数字1次到3次 匹配/etc/grub2.cfg文件以一个空格开头匹配一个字符的文件的所有行 显示以LISTEN结尾的行 显示匹配右边以LISTEN结尾匹配一个或者多个空格的所有输出 分组及引用:讲一个或者多个字符…

C#中调用halcon引擎来执行hdev程序

调用halcon引擎有两个直接的好处: 避免C# 与halcon代码混编时可能产生的内存泄露问题 修改halcon程序时不用重新编译C# 勇哥写了一个示例,详细的应用感受和缺点限制勇哥会持续做相关的总结给大家分享。 对于halcon17来说,要运行下面的程序…

ASP.NET Core部署到Linux服务器(CentOS7 x64)

前言 本文主要讲解如何一步步将ASP.NET Core网站发布到Linux服务器,文中会讲解具体步骤及需要避免的各种问题。 目录 一、环境介绍 二、创建及发布ASP.NET Core网站项目 三、服务器软件安装(.NET Core SDK) 四、在服务器上部署ASP.NET Core网…

Python3.5以上版本lxml导入etree报错Unresolved reference

Web抓取Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中 获取数据同时保持它的结构是有用的。web站点不总是以容易处理的格式, 如 csv 或者 json 提供它们的数据。 这正是web抓取出场的时机。Web抓取是使用计算机程序将web页面数据…

其它综合-CentOS7 忘记root密码

CentOS7 忘记root密码 长时间不用的 CentOS 机器再次开机的时候忽然忘记了密码,总不能就重装一台吧,还有好多服务在机器上,于是决定重置root的密码。   如果是已经开启的机器,需要进行关闭,重新启动。在启动选择内核…

spring boot高性能实现二维码扫码登录(中)——Redis版

前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降。好吧,现在回归传统方式:前端ajax每隔1秒或2秒发一次请求,去…

C# :socket 通讯基础使用实例

们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议&#xff0…

PHP + NGINX 控制视频文件播放,并防止文件下载

最简单的方法是使用NGINX的 internal 功能 server { listen 80; server_name www.xxx.com;  location / { index index.php index.html index.htm; root /xxx; if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s$…

C#:委托基础与事件

通过以下思维导图,学习委托的基本概念,后面着重讲解委托的运用,希望通过最简单的方式收获更多的知识。 1.委托的各种写法 1、委托 委托名new 委托(会调用的方法名); 委托名(参数); 2、委托 委托名 会调用…

Django基本命令

Django基本命令 1.创建一个Django 项目 django_admin.py startproject mysite当前目录下会生成mysite的工程,目录结构如下: manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。settings.py ---- 包含了项目的默认…

reactor模式:多线程的reactor模式

上文说到单线程的reactor模式 reactor模式:单线程的reactor模式 单线程的reactor模式并没有解决IO和CPU处理速度不匹配问题,所以多线程的reactor模式引入线程池的概念,把耗时的IO操作交由线程池处理,处理完了之后再同步到selecti…

Elasticsearch实战篇——Spring Boot整合ElasticSearch

2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来探讨Spring Boot整合ElasticSearch的问题。 本文主要讲以下内容…

Python: pip升级报错了:You are using pip version 10.0.1, however version 20.3.3 is available.

1,Python使用命令:python -m pip install --upgrade pip升级pip的时候报了下面这个错 2,换了个命令: python -m pip install --upgrade pip -i https://pypi.douban.com/simple 更新成功了,但又报了一个新的错误: AttributeError:…

新手上路之Hibernate:第一个Hibernate例子

一、Hibernate概述 (一)什么是Hibernate? Hibernate核心内容是ORM(关系对象模型)。可以将对象自动的生成数据库中的信息,使得开发更加的面向对象。这样作为程序员就可以使用面向对象的思想来操作数据库&…

模板标签及模板的继承与引用

1.常用的模板标签 - 作用是什么:提供各种逻辑 view.py: def index(request):#模板标签 --常用标签 总结:语法 {% tag %} {% endtag %} {% tag 参数 参数 %} 示例 展示页index.html,包含for标签,if标签,url标签 {% extends teacher…

Golang实现一个密码生成器

小地鼠防止有人偷他的果实,在家里上了一把锁。这个锁怎么来的呢?请往下看。。 package mainimport ("flag""fmt""math/rand""time" )var (length intcharset string )const (NUmStr "0123456789"C…

C# WPF:初识布局容器

StackPanel堆叠布局 StackPanel是简单布局方式之一&#xff0c;可以很方便的进行纵向布局和横向布局 StackPanel默认是纵向布局的 <Window x:Class"WpfApplication1.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" …

Kibana源码分析--Hapijs路由设置理解笔记

【ES6解构赋值】&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment 【Joi APi】&#xff1a;https://github.com/hapijs/joi/blob/v13.1.2/API.md 转载于:https://www.cnblogs.com/lishidefengchen/p/866874…