我们知道,Halcon中的坐标系的原点在左上角,而一般二维平面坐标系的原点在左下角。那么Halcon中坐标系和一般的二维坐标系有什么区别呢?我通过下面这个例子来分析。

  1. gen_image_const (Image, 'byte', , )
  2. dev_set_draw ('margin')
  3.  
  4. *点1
  5. gen_circle (Circle1, 10, 10, )
  6. disp_message (, '(10 ,10)', 'image', , , 'white', 'false')
  7. *点2
  8. gen_circle (Circle2, 100, 200, )
  9. disp_message (, '(100 ,200)', 'image', , , 'white', 'false')
  10. *点3
  11. gen_circle (Circle3, 400, 100, )
  12. disp_message (, '(400 ,100)', 'image', , , 'white', 'false')
  13.  
  14. union2 (Circle1,Circle2, RegionUnion)
  15. union2 (RegionUnion,Circle2, RegionUnion)
  16. union2 (RegionUnion,Circle3, RegionUnion)
  17. gen_contour_region_xld (RegionUnion, Contours, 'border')
  18. write_contour_xld_dxf (Contours,'C:/Users/happy xia/Desktop/XLD的镜像变换/threePoint.dxf')

这三个点在Halcon中的位置如下图:

上面的程序最终生成了一个名为threePoint.dxf的文件。我用文本查看器(notepad++、记事本等)打开查看它的数据:

红框中“10”下面的数据代表点的x值,“20”下面的数据代表点的y值,即截图里有两个点(98.5, 396.5)、(99.5, 396.5),这两个点都是XLD圆上的点,很明显这两个点所在圆的圆心坐标是(100, 400)。但是我们看最开始的那张图,发现只有点(400, 100),并没有点(100, 400)!

根据上面的事实现象,我们不难发现Halcon中的坐标系实际是这样的:

根据导出的dxf文件中的坐标点反推,之前的那张图的点的坐标实际上是这样的:

这两个坐标系的区别如下图。不难看出,它们是上下镜像的关系(只需要用CAD看图软件打开threePoint.dxf文件一看便知)。

上文详细分析了Halcon坐标系的特点,由于有这样的特点,Halcon中的XLD和导出的dxf文件轮廓就存在上下镜像(上下颠倒)的关系,那么我们需要解决的一个问题就是:如何进行XLD的镜像转换?

镜像,对应的单词是“mirror”,我们在Halcon的帮助中搜索与之相关的算子,仅有mirror_imagemirror_region

根据我前面的博客文章,我们知道,如果XLD是闭合的,那么可将XLD转为Region,然后再转回XLD,因此可将Region作为中介,来镜像变换XLD。

方法一:以Region为中介,通过mirror_region算子间接对闭合XLD进行镜像转换。

原XLD如下图所示。

  1. gen_image_const (Image, 'byte', , )
  2. read_contour_xld_dxf (Contours,'unionContour.dxf', [], [], DxfStatus)
  3.  
  4. *方法1:先转换为Region,再镜像Region,最后转回到XLD
  5. gen_region_contour_xld (Contours, Region, 'margin')
  6. mirror_region (Region, RegionMirror, 'row', 6000)
  7. gen_contour_region_xld (RegionMirror, ContoursMirror, 'border')

效果如下:

方法二:由于XLD都是由点组成的,因此可以点对点镜像重绘

  1. gen_image_const (Image, 'byte', , )
  2. read_contour_xld_dxf (Contours,'unionContour.dxf', [], [], DxfStatus)
  3.  
  4. *方法2:点对点镜像重绘
  5. count_obj (Contours, Num)
  6. Step := 5
  7. axisValue := 6000
  8.  
  9. gen_empty_obj (Contour2)
  10. for i := to Num by
  11. select_obj (Contours, Contour, i)
  12. get_contour_xld (Contour, Row, Col)
  13. Row1 := []
  14. Col1 := []
  15. for j := to |Row|- by Step
  16.  
  17. Row1:=[Row1,axisValue - Row[j]]
  18. Col1:=[Col1,Col[j]]
  19.  
  20. endfor
  21.  
  22. test_closed_xld (Contour, IsClosed)
  23. if (IsClosed = )
  24. Row1:=[Row1,axisValue - Row[]]
  25. Col1:=[Col1,Col[]]
  26.  
  27. endif
  28.  
  29. gen_contour_polygon_xld (Contour1, Row1, Col1)
  30. smooth_contours_xld (Contour1, SmoothedContours, )
  31. concat_obj (Contour2, SmoothedContours, Contour2)
  32. endfor

效果如下:

对于方法二程序有疑问的,可以参考我之前写的文章:http://www.cnblogs.com/xh6300/p/7414256.html

上面两种方法有一些小问题,不够完美。方法一主要的局限是只适用于闭合的XLD,方法二对点进行处理的时候,为提高运算速度进行了间隔采样,导致最终得到的XLD轮廓和初始XLD有细微差异。

其实Halcon还提供了一种最佳解决方案,即仿射变换:hom_mat2d_reflect —— 变换后的对象与初始对象相对于两点确定的一条直线彼此对称,其实就是镜像。

方法三:使用hom_mat2d_reflect 直接进行镜像的仿射变换

  1. gen_image_const (Image, 'byte', , )
  2. read_contour_xld_dxf (Contours,'unionContour.dxf', [], [], DxfStatus)
  3.  
  4. *方法3:使用仿射变换镜像
  5. hom_mat2d_identity (HomMat2DIdentity)
  6. hom_mat2d_reflect (HomMat2DIdentity, 3000, 0, 3000, 100, HomMat2DReflect)
  7. affine_trans_contour_xld (Contours, ContoursAffinTrans, HomMat2DReflect)

效果如下:

Halcon中的坐标系特点及XLD的镜像转换的更多相关文章

  1. Halcon中缩放Region或XLD的方法研究

    在Halcon中,Region和XLD之间可以彼此转换.但这种转换并不是“无损”的,XLD可以是不闭合的,但是Region一定是闭合的.因此,如果将不闭合的XLD转为Region,然后再转回XLD,那 ...

  2. Photoshop和Halcon中的极坐标变换

    极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置. 我很早就接触了Photoshop,知道Photosh ...

  3. HALCON中的算子大全(中英对照)

    HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...

  4. cocos2d-x 中的坐标系

    cocos2d-x 中的坐标系是笛卡尔坐标系,向右为 x 轴正方向,向上为 y 轴正方向,以像素为单位 原点在屏幕左下角的坐标系叫世界坐标系,是整个游戏中的根基,直接添加到场景中的节点,设置的位置都是 ...

  5. ArcGIS中的坐标系定义与转换 (转载)

    原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...

  6. ArcGIS中的坐标系:基本概念和常用操作(一)

    本文呢是主要是借鉴李郎平李大大的博士论文和百度百科,里面还有一点点我自己的理解,希望能帮助自己加深对于坐标系的认识. 李大大的博客:http://blog.sciencenet.cn/u/Brume ...

  7. HTML中的坐标系及其在MouseEvent和元素Box中的应用

    HTML中的坐标系及其在MouseEvent和元素中的应用 HTML有四个坐标系统: Screen, Page,Client和offset, 用于描述DOM元素的Box尺寸和MouseEvent中的位 ...

  8. c# winform 中的坐标系

    从数学角度讲,Point是一个二维矢量,包含两个公共整型属性,属性用大写X和Y(c#中公共属性一般约定以大写字母开头).当坐标不是整数值是float时,用PointF代替Point使用. 常用的Siz ...

  9. 4.three.js中的坐标系

    Three.js中的坐标系 three.js中坐标系使用的是左手坐标系 左手坐标系和右手坐标系的对比: 当然three.js中使用的是右手坐标系 three.js中的旋转的定义 但是three.js中 ...

随机推荐

  1. 基于Html5的爱情主题网站–表白神器

    介绍 一个基于基于Html5的爱情主题,文字采用打字机效果,逐字打印,并带有键盘敲击声音.在chrome,safari,firefox,IE10下都有效,chrome下效果最佳.要注意的是safari ...

  2. 比较两个array或者object是否深度相等

    function objectEquals(object1: Object, object2: Object): boolean { for (let propName in object1) { i ...

  3. WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit)

    Windows Community Toolkit 再次更新到 5.0.以前可以在 WPF 中使用有限的 UWP 控件,而现在有了 WindowsXamlHost,则可以使用更多 UWP 原生控件了. ...

  4. CH1809 匹配统计

    题意 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了"字符串A从任意位置开始的后缀子串"与"字符串B"匹配 ...

  5. spring与hibernate注解及XML方式集成

    spring与hibernate注解及XML方式集成 Hibernate Xml方式 该种方式需要在sessionFactory中引入对应的hbm.xml文件,样例如下: <!-- spring ...

  6. 黄聪:WordPress 多站点建站教程(一):怎样开启WordPress多站点功能,实现手机移动端主题开发,与主站用户数据共享

    为了开发手机移动端的wordpress,需要使用Wordpress的多站点功能. 1.打开WordPress根目录下的wp-config.php文件, 在文件的任何位置加上以下内容: define(' ...

  7. 黄聪:自定义WordPress前台、后台顶部菜单栏管理工具条的技巧

    使用WordPress开发网站项目,很多时候都需要对进行后台定制,今天倡萌主要分享下自定义顶部管理工具条的使用技巧. 注:如无特殊说明,请将下面的代码添加到主题的 functions.php  或者插 ...

  8. TF54000: 由于服务器时钟设置可能不正确,无法更新数据解决方案(补充)

    此问题出现的原因: 服务器时间比本地时间大.由于TFS源代码的Source Control会根据签入时间做判断.如果后续签入的时间小于变更集的最新版本的时间,就会报错误“TF54000”,并拒绝签入. ...

  9. bzoj 4069~4071 APIO2015

    T1 从高到底按位确定答案 A=1时f[i]表示前i个数合法的划分至少需要分出几段,时间复杂度$O(n^2log(ans))$ A>1时f[i][j]表示前i个数划分为j段是否可能合法,转移显然 ...

  10. CentOS防火墙中端口的开启和关闭

    1.开启端口(以80端口为例) 方法一: /sbin/iptables -I INPUT -p tcp --dport -j ACCEPT 写入修改 /etc/init.d/iptables save ...