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,一经查实,立即删除!

相关文章

jQuery2

一、层次选择器 1、后代选择器$("div p"):div中所有的p标签元素 2、自带选择器$("div>p"):div中的子代是p的第一层元素 3、兄弟选择器$("divp")和div是兄弟的p标签 4、相邻兄弟选择器$("div~p")与div相邻的p标签 二、jQ…

HTTP协议详解(转载)

http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html 转载于:https://www.cnblogs.com/youmei11/p/8608007.html

bzoj1016 [JSOI2008]最小生成树计数

1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6032 Solved: 2452[Submit][Status][Discuss]Description 现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。&…

http请求概述

当浏览器输入网址后 浏览器首先向DNS域名解析服务器发送请求。DNS反解析:根据浏览器请求地址中的域名,到DNS服务器中找到对应的服务器外网IP地址通过找到外网IP,向对应的服务器发请求(首先访问服务器的WEB站点管理工具&#xff1a…

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

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

剑指Offer-数组中重复的数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的…

CSS2--字体样式

## CSS2 字体样式 ##### font-family 字体族 - 规定元素的字体系列 - 把多个字体作为一个"回退"系统保存.保证浏览器的支持 - Microsoft YaHei, tahoma, arial, Hiragino Sans GB, sans-serif ##### font 字体类型 - 衬线字体(serif):在字的笔划开始及结束…

虚拟机中访问连接在物理机上的摄像机(使用桥接)

最近在使用摄像机SDK做开发,开发好之后物理机上没有环境,所以弄了个虚拟机进行测试,就如何在虚拟机中连接摄像机做下记录。 步骤 1.物理机上对虚拟机的适配器和摄像机的适配器设置为相同网段并进行桥接(注意与摄像机网…

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

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

grep 正则匹配

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

解决bash: mysql: command not found 的方法

rootDB-02 ~]# MySQL -u root-bash: mysql: command not found 原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文…

C#调用 Halcon引擎执行代码

Halcon引擎可以直接执行halcon代码,把halcon程序当做C#的一个方法来调用,这样可以减轻C#这边的程序负担,而且可以避免内在泄露等bug的出现。还有一种好处是方便调试视觉代码,你只需要启动halcon&#xff0c…

面试时如何优雅地自我介绍?

阅读本文大概需要 3.4 分钟。 1.题记 有读者提问:如何在面试当中做一个最好的自我介绍? 结合了一下自己面试以及面试别人(模拟面试)的一些经验,简单总结了几点,供大家参考。 2.为什么要自我介绍 在面试官要…

Cache的一些总结

输出缓存 这是最简单的缓存类型,它保存发送到客户端的页面副本,当下一个客户端发送相同的页面请求时,此页面不会重新生成(在缓存有限期内),而是从缓存中获取该页面;当然由于缓存过期或被回收&am…

thinkphp5.0学习(九):TP5.0视图和模板

原文地址:http://blog.csdn.net/fight_tianer/article/details/78602711 一、视图 1.加载页面 1.继承系统控制器类return $this->fetch(参数1,参数2,参数3,参数4);参数1(字符串):模板渲染参数…

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

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

Node.js Up and Runing 学习日记(八)

目录 连接池基于一个简单的Socker.io服务器连接池 生产环境通常由多种资源组成: web服务器,缓存服务器和数据库服务器. 数据库服务器通常部署在web服务器之外的独立机器上,这使得面向公众的网站不必重新配置和修改复杂的数据库群就可以垂直增长了. 基于 为每一个请求创建一个甚…

036有效的数独

1 #include "000库函数.h"2 3 //一看&#xff0c;没想出什么好法子&#xff0c;就遍历了4 //最重要的是如何比较小九宫格的数据5 //44ms6 class Solution {7 public:8 bool isValidSudoku(vector<vector<char>>& board) {9 for (int i …

WinAPI——Windows 消息

消息值 注释 WM_NULL$0000 WM_CREATE$0001 WM_DESTROY$0002 WM_MOVE$0003 WM_SIZE$0005 WM_ACTIVATE$0006 WM_SETFOCUS$0007 WM_KILLFOCUS$0008 WM_ENABLE$000A WM_SETREDRAW$000B WM_SETTEXT$000C WM_GETTEXT$000D WM_GETTEXTLENGTH$000E WM_PAINT$000F WM_CLOSE$0010 WM_QUER…

AciveMQ小结|最后有视频

1 JMS 在介绍ActiveMQ之前&#xff0c;首先简要介绍一下JMS规范。 1.1 JMS的基本构件 1&#xff0e;1&#xff0e;1 连接工厂 连接工厂是客户用来创建连接的对象&#xff0c;例如ActiveMQ提供的ActiveMQConnectionFactory。 1&#xff0e;1&#xff0e;2 连接 JMS Connection封…