HALCON相机标定相机内参相机外参

HALCON相机标定相机内参相机外参HALCON相机标定相机内参相机外参halcon相机标定图文解释,使用halcon标定过程。这几天一直在搞相机的标定。过程中遇到了许许多多的问题,为了让广大自动化行业的小白避免踩坑,用这个帖子总结一下相机的标定。接下来我就给大家介绍一下标定,侧重点在怎么做。1.相机标定是什么首先镜头有畸变,也就是说照出的图像与实际不符产生了形变。即使号称无畸变的工业镜头也是有千分之几的畸变率的。上个图告诉大家畸变这个图里,第一个图就是我们相机下的真实的形状,后边两个就是照出来有畸变的图…

大家好,又见面了,我是你们的朋友全栈君。

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

如果大家看完这一篇文章后还想深入了解相机标定,可以参看文章《深入理解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,已经考虑了相机的畸变。

终于完事了!

希望能够帮到你哦,如果帮到了你记得给我点个赞,在CSDN页面的右上角有个点赞标志。
有什么不懂得评论,我看到第一时间回复。
真心希望帮到大家。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140286.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jenkins自动触发构建_秒级定时触发器

    jenkins自动触发构建_秒级定时触发器前言跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。jenkins的定时任务是用的crontab语法定时构建语法

    2022年7月29日
    10
  • dirsearch讲解_mv命令使用

    dirsearch讲解_mv命令使用dirsearch用法github地址参数选项(机翻)强制:字典设置:常规设置:请求设置:github地址https://github.com/maurosoria/dirsearch参数选项(机翻)强制:Mandatory:-uURL,–url=URL 目标URL-lFILE,–url-list=FILE 目标URL列表文件–stdin TargetURLlistfromSTDIN–cidr=CIDR

    2022年10月5日
    4
  • C++ map用法总结(整理)

    C++ map用法总结(整理)1,map简介map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次; 第二个可能称为该关键字的值(value);map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在…

    2022年7月17日
    20
  • Linux面试题(2020最新版)[通俗易懂]

    Linux面试题(2020最新版)[通俗易懂]文章目录Linux概述什么是LinuxUnix和Linux有什么区别?什么是Linux内核?Linux的基本组件是什么?Linux的体系结构BASH和DOS之间的基本区别是什么?Linux开机启动过程?Linux系统缺省的运行级别?Linux使用的进程间通信方式?Linux有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什…

    2022年4月27日
    37
  • 神经网络——最易懂最清晰的一篇文章「建议收藏」

    神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向–深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术。  本文以一种简单的,循序的方式讲解神经网络。适合对神经网络了解不多的同学。本文对阅读没有一定的前提要求,但是懂一些机器学习基础会更好地帮助理解本文。  神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技…

    2022年4月12日
    36
  • pycharm 2021.4.1 激活码破解方法

    pycharm 2021.4.1 激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号