1 halcon相机标定和图像矫正
    对于相机采集的图片,会由于相机本身和透镜的影响产生形变,通常需要对相机进行标定,获取相机的内参或内外参,然后矫正其畸变。相机畸变主要分为径向畸变和切向畸变,其中径向畸变是由透镜造成的,切向畸变是由成像仪与相机透镜的不平行造成的。(更多技术分享,请关注微信公众号:善眸科技;更多技术交流请加入qq机器视觉联盟群1020941040)。
    针孔模型是理想透镜的成像模型,但是实际中相机的透镜不可能是理想的模型,透镜形状的非理想特征造成像点会沿径向发生畸变。一个像点沿径向内缩叫负畸变,或桶形畸变沿径向外延叫正畸变,或枕形畸变。这种崎变相对于光轴严格对称的,也是畸变的主要分量。

相机标定模型公式,

其中,(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.ihalcon.com/read-9967.html

太初有道,道与 神同在,道就是 神。这道太初与神同在。万物是藉着他造的;凡被造的,没有一样不是藉着他造的。生命在他里头,这生命就是人的光。(约翰福音 1:1,3-4 和合本)

halcon相机标定及畸变矫正相关推荐

  1. 相机标定之畸变矫正与反畸变计算

    相机标定之畸变矫正与反畸变计算 相机标定问题已经是比较成熟的问题,OpenCV中提供了比较全面的标定.矫正等函数接口.但是如果我想通过一张矫正好的图像,想获得原始的畸变图,却没有比较好的方法,这里讨论 ...

  2. 机器视觉-相机标定及畸变矫正

    摘要:本文首先介绍了针孔相机模型(线性模型),然后推导四个坐标轴变换的关系,引出R.T.K.D中包含相机的5个内参,6个外参.然后介绍相机畸变的原因以及畸变模型(非线性模型),引出相机的5个畸变参数. ...

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

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

  4. 深入理解halcon相机标定

    目录 相机标定简介 深度说明 1.相机标定参数介绍 2.标定板详细介绍 问题1:halcon是否只能使用halcon专用的标定板? 问题2:halcon标定板如何生成? 问题3:halcon标定板如何 ...

  5. halcon相机标定

    一.相机标定的目的: 1.摄像头拍出来的原始图片是存在畸变的,我们需要通过标定来矫正这种畸变. 2.相机坐标系 到 世界坐标系 的转化,需要知道图片上像素点的距离转化到实际中代表多长. 3.标定分为内 ...

  6. 【CV】鱼眼相机模型与畸变矫正(Fisheye Camera Model Calibration)

    文章目录 鱼眼镜头 鱼眼名称的由来 鱼眼镜头的实现 鱼眼相机的成像模型 鱼眼图像的矫正 Ref 鱼眼镜头 鱼眼镜头长这样 #鱼眼镜头成像样张 拍出来的照片长这样 鱼眼名称的由来 之所以叫鱼眼,是因为仿 ...

  7. python 正方形去畸变_opencv 角点检测+相机标定+去畸变+重投影误差计算

    https://blog.csdn.net/u010128736/article/details/52875137 https://blog.csdn.net/h532600610/article/d ...

  8. Halcon 单目标定,畸变矫正,图像坐标系转世界坐标系

    代码为Halcon代码,只有代码以及解释,默认已经理解世界坐标系(WCS)到相机坐标系(CCS)到图像坐标系(ICS)到像素坐标系(PCS)转换 *********************1. 标定内 ...

  9. halcon相机标定助手_halcon相机标定和图像矫正

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

最新文章

  1. 新技术:如何用VR训练机器人?
  2. 腾讯集团与光大集团签署战略合作 共建金融科技创新实验室
  3. 【Http专题】Https
  4. linux下更新硬盘FW,Intel SSD硬盘 FW 更新方法
  5. 新一轮电信业改革的两条路
  6. 【NLP】关于Transformer的常见问题及解答
  7. diff算法_详解 React 16 的 Diff 策略
  8. HDU_3786 找出直系亲属- softbar
  9. spring扫描linux上问题,Spring MVC 自动扫描注解失效原因
  10. 语音识别基本原理介绍------dnn-hmm续
  11. Cocos2d-x 引擎概要
  12. Mac上最好的白噪音软件:Noizio for Mac
  13. 神经网络 激励函数
  14. Qt 小例子学习9 - 代码编辑器
  15. 诺基亚安卓手机_宁可不做手机?也不用安卓系统!诺基亚:真香啊
  16. C++几个常用的排序
  17. 如何修改QT项目的项目名称?
  18. 微信公众号推文各标签含义
  19. 黑鲨helo支持html吗,黑鲨2和黑鲨helo区别买哪个好
  20. 大数据_03【大数据基础知识】

热门文章

  1. 2021年JAVA面试~光头佳的论述
  2. JavaSE 接口与内部类
  3. 在 HTML5 中捕获音频和视频
  4. 什么是后端?后台?别傻傻的分不清
  5. 马士兵python_马士兵:python学习(一)
  6. ROS中的TF坐标变换工具及实现、Rviz查看(十四)C++、python
  7. SHA256sum系列命令检测文件完整性
  8. java饲养员喂动物_体现JAVA中的面向对象思想,接口(抽象类)的用处 :饲养员给动物喂食物...
  9. Codeforces Round #143 (Div. 2) C. To Add or Not to Add 胡搞
  10. 三谈 钉钉、企微、飞书 的不同:优势即劣势