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

1、 Halcon相机标定和图像矫正
    对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变,其中径向畸变是由透镜造成的,切向畸变是由成像仪与相机透镜的不平行造成的。
    针孔模型是理想透镜的成像模型,但是实际中相机的透镜不可能是理想的模型,透镜形状的非理想特征造成像点会沿径向发生畸变。一个像点沿径向内缩叫负畸变,或桶形畸变沿径向外延叫正畸变,或枕形畸变。这种崎变相对于光轴严格对称的,也是畸变的主要分量。

相机标定模型公式,

其中,(X,Y,Z)为世界坐标系中的实际点坐标,(u,v)为图像坐标系统的像素坐标,A为相机内参,f像素单元的焦距,c图像像素中心点。

1.1 halcon相机标定
1.1.1标定助手及相机参数设置
打开halcon标定助手,加载标定板文件,选择相机类型,设置相机参数,然后加载相机采集的标定图像,如下图所示,图像中全部标定点能够检测出,即采集的相机已经设置好,然后生成代码。

图4 halcon标定助手

标定板生成:
标定板文件的生成分为.descr和.cpd的文件,不同格式文件需使用不同函数进行生成。如,
*生成的是27*31,标定点直径0.0075mm的.cpd标定板(精度高标定板)
create_caltab (27, 31, 0.0075, [13, 6, 6, 20, 20], [15, 6, 24, 6, 24], 'light_on_dark', 'D:/calplate.cpd', 'caltab.ps')
*生成的是7*7,标定点之间距离0.1m,直径0.5的.descr标定板
gen_caltab( 7, 7, 0.1, 0.5, 'D:/caltab.descr', 'caltab.ps')
加载标定图像:

图5加载标定图像

如图5所示,加载标定图像后,状态为确定时,表示标定图像可用于进行标定,然后通过标定助手直接生成标定代码即可。
   如图6所示,加载标定图像后,状态为检测出品质问题,此原因大多是照片质量问题,例如光照、对焦、曝光等,需按照halcon标定注意事项的内容拍摄照片。一般照片检测出品质问题也可以进行相机标定。
加载标定板图像会出现“标志点提取失败”,出现此原因的需要根据标定界面下的状态栏查找halcon错误信息,例”inconsistent....(image mirrored? )”,则需要查找相应原因(实际标定板(透明)与标定板文件图片的可能有镜像区别,将实际标定板翻转即可,多试)。此不可进行相机标定。

图6 相机标定问题

相机初始参数设置:
例如,
*(f, k, cell width, cell height, cx, cy, width, height)k为畸变系数
StartParameters := [0.029,0,4.3e-006,4.3e-006,2592,1728,5184,3456]
*(f, k1, k2, k3, p1, p2, cell width, cell height, cx, cy, width, height)k1,k2,k3径向畸变, p1,p2为切向畸变
StartParameters:=[0.029,0,0,0,0,0,4.3e-006,4.3e-006,2592,1728,5184,3456]
其中,相机初始参数根据相机模型的不同而不同,若相机模型为area(division),则相机参数为7个,若area(多项式),则相机参数12个。

1.1.2 标定程序

利用标定助手生成代码,然后执行结果,分析其正确性,若需要将其生成为C/C++程序,可通过halcon界面的‘文件’项‘导出’成.cpp文件。

图7 halcon生成C程序

Halcon标定程序

*Calibration 01: Code generated by Calibration 01*读入某个文件夹下的所有标定图像list_files ('D:/halconvc/img', ['files','follow_links'], ImageFiles)tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)*初始标定参数设置及定义标定板文件TmpCtrl_ReferenceIndex := 0TmpCtrl_PlateDescription := 'D:/calib/calplate.cpd'StartParameters := [0.029,0,0,0,0,0,4.3e-006,4.3e-006,2592,1728,5184,3456]TmpCtrl_FindCalObjParNames := 'sigma'TmpCtrl_FindCalObjParValues := 1
* Calibration 01: Create calibration model for managing calibration datacreate_calib_data ('calibration_object', 1, 1, CalibHandle)set_calib_data_cam_param(CalibHandle,0,'area_scan_polynomial', StartParameters)set_calib_data_calib_object (CalibHandle, 0, TmpCtrl_PlateDescription)* Calibration 01: Collect mark positions and estimated poses for all platesgen_empty_obj (Images)for Index := 0 to |ImageFiles|-1 by 1    read_image (Image, ImageFiles[Index])    concat_obj(Images,Image,Images)*提取图像Images中标定板上的圆形标志来确定标定板的有效区域    find_calib_object (Image, CalibHandle, 0, 0, Index, TmpCtrl_FindCalObjParNames, TmpCtrl_FindCalObjParValues)endfor* Calibration 01: Perform the actual calibrationcalibrate_cameras (CalibHandle, TmpCtrl_Errors)get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParam)
  *将内外参保存到磁盘write_cam_par(CameraParam,'D:/halconvc/campar.dat')get_calib_data (CalibHandle, 'calib_obj_pose', [0, TmpCtrl_ReferenceIndex], 'pose', CameraPose)set_origin_pose (CameraPose, 0, 0, 0.01, CameraPose)write_pose(CameraPose,'D:/halconvc/campos.dat')stop()
*另外读取内外参文件的函数read_cam_par ('D:/halconvc/campar.dat', CameraParam)read_pose ('D:/halconvc/campos.dat', CameraPose)

1.2图像矫正
Halcon中图像矫正,接上述程序,以下介绍两种方法。
①使用内外参,即相机内参和位姿

*  goal: rectify images*  first determine parameters such that the entire image content is visible*  -> transform image boundary into world plane, determine smallest*     rectangle around it*当设备固定后,位资是唯一的select_obj(images,image,1)get_image_pointer1(Image, Pointer, Type, Width, Height)gen_rectangle1 (ImageRect, 0, 0, Height-1, Width-1)gen_contour_region_xld (ImageRect, ImageBorder, 'border')contour_to_world_plane_xld(ImageBorder, ImageBorderWCS, CameraParam,CameraPose, 1)smallest_rectangle1_xld (ImageBorderWCS, MinY, MinX, MaxY, MaxX)set_origin_pose(CameraPose, MinX, MinY, 0.01, PoseForEntireImage)image_points_to_world_plane(CameraParam,PoseForEntireImage,[Height/2, Height/2, Height/2+1], [Width/2, Width/2+1, Width/2], 1, WorldPixelX, WorldPixelY)distance_pp(WorldPixelY[0], WorldPixelX[0], WorldPixelY[1], WorldPixelX[1],            WorldLength1)distance_pp(WorldPixelY[0], WorldPixelX[0], WorldPixelY[2], WorldPixelX[2],            WorldLength2)ScaleForSimilarPixelSize := (WorldLength1+WorldLength2)/2*  -> determine output image size such that entire input image fits into itExtentX := MaxX-MinXExtentY := MaxY-MinYWidthRectifiedImage := ExtentX/ScaleForSimilarPixelSizeHeightRectifiedImage := ExtentY/ScaleForSimilarPixelSize*  create mapping with the determined parachuangjia*创建一个投射图,其描述图像平面与坐标轴系统中平面Z为零之间的映射gen_image_to_world_plane_map(Map, CameraParam, PoseForEntireImage, Width, Height, WidthRectifiedImage, HeightRectifiedImage, \                             ScaleForSimilarPixelSize, 'bilinear')clear_calib_data (CalibHandle)
* Map the imagesfor I :=  1 to |ImageFiles| by 1  select_obj (Images, Img, I)  map_image (Img, Map, ImageMapped)  write_image (ImageMapped, 'jpg', 0, 'D:/halconvc/picture/'+I)Endfor

②仅使用内参

read_image (Image,'D:/halconvc/img/IMG_00.JPG')read_cam_par('D:/halconvc/campar.dat',CameraParam)CarParamVirtualFixed:=CameraParam*对于area(diversion)相机模型(7个参数)change_radial_distortion_cam_par('adaptive',CameraParam,0,CarParamVirtualFixed)*对于area(多项式)相机模型(12个参数)change_radial_distortion_cam_par('adaptive',CameraParam,[0,0,0,0,0],CarParamVirtualFixed)
*上述相机模型选一种后进行下面的map_image*创建一个投射图,其描述图像与其相应正在改变的径向畸变,而对于12个参数的畸变包括径向和切向畸变gen_radial_distortion_map(Map,CameraParam,CarParamVirtualFixed,'bilinear')map_image(Image,Map,ImageMapped)

总结:

可以先使用标定助手获取标定参数

在标定助手的安装页面,注意标定板的描述文件,投影模型参数的设置

在标定页面先选择一幅图设为参考位姿,之后点击标定

标定完之后获得相机内参,图片矫正程序方法

* Calibration 01: Code generated by Calibration 01CameraParameters := ['area_scan_division',0.0186441,-520.011,8.35005e-006,8.3e-006,246.657,254.674,640,480]CameraPose := [0.00994196,-0.00291689,0.290462,358.424,32.411,91.0749,0]stop ()*获取径向畸变矫正的外参change_radial_distortion_cam_par ('adaptive', CameraParameters, 0, CamParamOut) read_image (CalibDistorted03, 'C:/Users/Public/Documents/MVTec/HALCON-13.0/examples/images/scratch/scratch_perspective.png')*第一种方法使用map_image()进行畸变矫正gen_radial_distortion_map (Map, CameraParameters, CamParamOut, 'bilinear')map_image (CalibDistorted03, Map, ImageMapped)*第二种方法使用change_radial_distortion_image进行径向畸变矫正change_radial_distortion_image (CalibDistorted03,CalibDistorted03 , ImageRectified, CameraParameters, CamParamOut)

此种只进行畸变矫正,并不进行图像的由于高度差造成的3D方向的位姿矫正。若要进行3D方向的矫正可以参考范例
image_to_world_plane.hdev
畸变矫正范例为:
change_radial_distortion_image.hdev
change_radial_distortion_points.hdev

 

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

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

相关文章

conda install 出错

在下载包时出现下面的错误&#xff1a; userdeMBP:pytorch user$ conda install -n deeplearning matplotlib Solving environment: failedCondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/osx-64/repodata.json.bz2> Elapsed…

算法入门经典 第三章

scanf 遇到tab或空格或换行符停下来1.例题2-1 7744问题 从数本身看 从个位数的数字看#include <iostream>#include<math.h>using namespace std; int main(){ for(int a1;a<9;a) { for(int b1;b<9;b) { int n1100*a11*b;//floor x 等于1的区间为[1,2),florr(…

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

相机标定1.相机标定是什么2.怎么使用halcon进行相机内外参标定&#xff1f; &#xff08;1&#xff09;搭建硬件1.**相机连好电脑&#xff0c;用相机厂家软件打开相机&#xff0c;检查一下相机是否正常。**2.**接下来使用halcon连接相机**&#xff08;2&#xff09;开始标定1.*…

jQuery2

一、层次选择器 1、后代选择器$("div p"):div中所有的p标签元素 2、自带选择器$("div>p")&#xff1a;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 现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树&#xff0c;而希望知道这个图中有多少个不同的最小生成树。&…

http请求概述

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

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

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

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

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

CSS2--字体样式

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

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

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

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

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

grep 正则匹配

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

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

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

C#调用 Halcon引擎执行代码

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

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

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

Cache的一些总结

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

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

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

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

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

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

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