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

目录

  • 相机标定
    • 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,已经考虑了相机的畸变。

终于完事了!

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

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

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

相关文章

angular change the url , prevent reloading

http://stackoverflow.com/questions/14974271/can-you-change-a-path-without-reloading-the-controller-in-angularjs $location.search({vln: $scope.vln_id}, false);会改变url中 ? 后面的 搜索参数,但是controller不会重新实例化。angular 官方文档…

C#圆形卡尺测量程序基于halcon

废话不多说上源码 觉得帖子有用给点个赞哈 先来个效果图 下边的是源码,自己新建一个文件粘贴进去,包含到您现在的项目 中。这串源码后边是使用方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin…

科维PLC运行时系统ProConOS embedded CLR 2.2 特定应用

ProConOS embedded CLR是新型的开放式标准化PLC运行时系统,符合IEC 61131标准,可执行不同的自动化任务(PLC、PAC、运动控制、CNC、机器人和传感器)。   通过采用国际标准的微软中间语言(依据IEC/ISO 23271标准为MSIL…

set()与get()详细解答(C#)

这几天在搬砖时候用到了set()与get(),同事问了我一些问题,我打算在博客中总结一下。 觉得帮助到了您,帮我点个赞哦。 属性访问器 其实说白了就是操作一个属性,更通俗一点说就是对一个变量的取值与赋值。 先来看get() get 访问…

如何判断一条曲线是否自己相交?

今天看到群里有人在问这个问题,想了一个解决办法。 我们首先作假设,如果一条曲线有交点,那么它就是相交的对吧。可能大家想的都是这样,就开始找各种方法去识别交点。 我们换个角度想一下:是不是我们判断这条曲线是否带…

hdu 5813 Elegant Construction

水题 题意:有n个城市,给你每个城市能到达城市的数量,要你构图,输出有向边,要求无环,输出任意的解 例: Sample Input 332 1 021 143 1 1 0Sample OutputCase #1: Yes21 22 3Case #2: NoCase #3: …

halcon相机标定及图像矫正(代码)

侵删 1 halcon相机标定和图像矫正 对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变,其中径向畸变是由透…

函数参数的传递问题(一级指针和二级指针)

函数参数的传递问题(一级指针和二级指针) [转]原以为自己对指针掌握了,却还是对这个问题不太明白。请教! 程序1: void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void …

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程 Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支持x86、amd64(即x64)和ppc架构&#xf…

CoDeSys的前世今生

工作以及网上看到不少人说,CoDeSys和西门子step7,在德国都属于标准过程,牛逼的小朋友都可以用其编程,不知真假,相信无风不起浪,多少有些依据,看看国內清一色的日系编程…

Eclipse中执行Ant脚本出现Could not find the main class的问题及解

试过了:https://blog.csdn.net/bookroader/article/details/2300337 但是不管用,偶然看到这篇没有直接关系的 https://blog.csdn.net/jiuyueguang/article/details/9350753 联想了一下。项目是JDK1.5,Eclipse是JDK1.8启动,所以在R…

视频通话研究002

还是关于视频质量。经測试,在公网server使用SQCIF(128x98)进行视频通话。2个client都是这个设置,感觉不出马赛克,模糊严重,在一个手机client抓包,例如以下: 第1,2行是client发到server的数据;第…

实力打脸: 量子隐形传输与 “瞬间移动” 毫无关系

有两个团队已经在量子隐形传输研究领域创造了新的传输记录:利用深不可测的量子力学知识将一个粒子的量子态迅速从一个位置迁移到另一个位置的粒子上。其中一个团队采用这种方法,运用一种光学纤维将一个光子的量子态穿越加拿大西南部的一个城市&#xff0…

Android初级教程:使用xml序列器

之前备份短信的时候生成xml都是手动拼写的&#xff0c;有一个问题&#xff1a;当短信里面存在</body>这样的标签的时候&#xff0c;最后结果就不是完整的xml文件&#xff0c;显然出错。但是&#xff0c;今天使用序列化器的方式&#xff0c;就能有效的解决上边遇到的问题。…

KUKA 声明变量时的几点注意

临时变量&#xff1a; 1、src文件中定义的局部变量&#xff0c;该种变量存在于内存中的栈上。子程序调用时&#xff0c;变量在栈上动态生成。调用结束后从栈中自动销毁。 因为存在于栈上的原因&#xff0c;访问该变量需要栈指针&#xff0c;所以该种变量无法在机器人程序运行时…

简单实现

1.创建接口和实现类 &#xff08;模拟实现查询天气&#xff09; 接口&#xff1a; package com.learning.weather;/*** * weather 接口 &#xff1a;实现模拟wsdl*/ public interface WeatherInterface {/*** 查询天气* param name* return*/public String queryWeather(Strin…

有关莫比乌斯反演

对于两个定义域为整数的函数F(x)和f(x); 若有: 然后F(x)可以快速求出&#xff1b; 如何用F求解f呢&#xff1f; 莫比乌斯反演&#xff1a; 对于两个定义域为整数的函数F(x)和f(x); 若有: 则有&#xff1a; 其中μ(x)为莫比乌斯函数&#xff0c;其定义为&#xff1a; 对于&#…

(原创)JS点击事件——Uncaught TypeError: Cannot set property 'onclick' of null

html部分代码&#xff1a; JS部分代码&#xff1a; 需要实现的效果&#xff1a;点击图片&#xff0c;来回相互切换。 我开始的错误做法&#xff1a;代码如上图所示&#xff08;逻辑上看起来是没有错误的&#xff09; 尝试过程&#xff1a;把JS代码放在</body>闭合标签之前…

事务传播机制/数据库异常解析——2016-8-13分享总结

一. 事务的传播机制&#xff0f;required 跟 required new 的使用与区别 基础回顾 1.1 事务的隔离级别&#xff1a; ISOLATION_READ_UNCOMMITTED&#xff08;读未提交&#xff09; ISOLATION_READ_COMMITTED&#xff08;读已提交&#xff09; ISOLATION_REPEATABLE_READ&#x…

20155307 2016-2017 《Java程序设计》第三次实验报告

&#xff08;一&#xff09;敏捷开发与XP 敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。“敏捷流程”是一系列价值观和方法论的集合。从2001年开始&#xff0c;一些软件界的专家开始倡导“敏捷”的价值观和流程&#xff0c;他们肯定了流行做法的价值&#xff0c;但是强…