Halcon中缩放Region或XLD的方法研究
在Halcon中,Region和XLD之间可以彼此转换。但这种转换并不是“无损”的,XLD可以是不闭合的,但是Region一定是闭合的。因此,如果将不闭合的XLD转为Region,然后再转回XLD,那么转换后的XLD和原先的XLD就有了一定的区别。
言归正传,先说说Region的缩放。
一、Region的缩放
Region的缩放很简单,有zoom_region算子,其签名如下,其中ScaleWidth, ScaleHeight是宽、高的缩放比例因子:
zoom_region(Region : RegionZoom : ScaleWidth, ScaleHeight : )
缩放的时候,Row和Column都根据缩放比例因子来放大或缩小。因此缩放后,Region的位置会移位,如果不想让缩放后的Region移位,可以这样:
- set_system ('clip_region', 'false')
- zoom_region (Region, RegionZoom, 0.5, 0.5)
- area_center (Region, Area, Row, Column)
- area_center (RegionZoom, Area1, Row1, Column1)
- move_region (RegionZoom, RegionMoved, Row - Row1, Column - Column1)
需要注意的是,Region缩放后,经常会有一部分跑到画布外面,Halcon默认是将画布外部的Region进行裁切的,如果不想裁切,可以在程序开始加上set_system ('clip_region', 'false'),即不裁切画布外面的部分。
二、XLD的缩放
本文开头分析过,“XLD——Region——XLD”的转换不是无损的,但是如果不介意这一点(或者说影响不大),XLD的缩放就可以通过Region的缩放为中介。
1、使用Region为中介缩放XLD
- gen_image_const (Image, 'byte', , )
- set_system ('clip_region', 'false')
- read_contour_xld_dxf (Contours,'01.dxf', [], [], DxfStatus)
- *转为region
- gen_region_contour_xld (Contours, Region, 'margin')
- *缩放region
- zoom_region (Region, RegionZoom, 0.2, 0.2)
- *转回XLD
- gen_contour_region_xld (RegionZoom, Contours2, 'border')
如果是下面这样的XLD呢?
用上面的方法的话,发现结果完全不对,如下图:
那么应该怎么弄呢?
2、通过缩放XLD中每个点的坐标值来缩放XLD
- gen_image_const (Image, 'byte', , )
- set_system ('clip_region', 'false')
- read_contour_xld_dxf (Contours,'02.dxf', [], [], DxfStatus)
- count_obj (Contours, Num)
- *XLD上点的采样间隔(为了缩短处理时间)
- Step := 10
- *缩放比例
- Scale := 0.3
- gen_empty_obj (Contour2)
- for i := to Num by
- select_obj (Contours, Contour, i)
- get_contour_xld (Contour, Row, Col)
- Row1 := []
- Col1 := []
- for j := to |Row|- by Step
- Row1:=[Row1,Row[j] * Scale]
- Col1:=[Col1,Col[j] * Scale]
- endfor
- *判断轮廓是不是闭合,如果是闭合的,那么使最后一个点与第一个点重合(即让缩放后的XLD也闭合)
- test_closed_xld (Contour, IsClosed)
- if (IsClosed == 1)
- Row1:=[Row1,Row[0] * Scale]
- Col1:=[Col1,Col[0] * Scale]
- endif
- gen_contour_polygon_xld (Contour1, Row1, Col1)
- smooth_contours_xld (Contour1, SmoothedContours, )
- concat_obj (Contour2, SmoothedContours, Contour2)
- endfor
其中:
get_contour_xld (Contour, Row, Col)是得到XLD中的一系列点;
gen_contour_polygon_xld (Contour1, Row1, Col1)是通过一系列点重建XLD。
结果如下:
(读者朋友们如果有不理解的地方或者发现有错误,欢迎跟帖回复。2017年8月22日 深夜)
Halcon中缩放Region或XLD的方法研究的更多相关文章
- PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究
假设要获取$_GET['c']; 首先,先介绍下http_globals; 1.http_globals,定义在php_globals.h中: zval * http_globals[6]; 其中的索 ...
- Halcon中的坐标系特点及XLD的镜像转换
我们知道,Halcon中的坐标系的原点在左上角,而一般二维平面坐标系的原点在左下角.那么Halcon中坐标系和一般的二维坐标系有什么区别呢?我通过下面这个例子来分析. gen_image_const ...
- halcon学习笔记——(11)Image,region,xld初步
一 读取的3种方式: 读取单张的图片: read_image( image,'filename') //image 是输出对象,后面是输入文件的路径和名称 读取多图: 1,申明一个数组,分别保存路径 ...
- HALCON中的算子大全(中英对照)
HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...
- Photoshop和Halcon中的极坐标变换
极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置. 我很早就接触了Photoshop,知道Photosh ...
- region、xld有对应的字符串时,将region、xld按照行或列排序的算法实现
用Halcon解码时,如果一张图里面有多个码,它通常可以把这些码都解出来,并且生成对应的解码结果字符串元组(也就是下面的DecodedDataStrings),如果有多个码,那么该元组就有多个元素. ...
- 【工程应用一】 多目标多角度的快速模板匹配算法(基于NCC,效果无限接近Halcon中........)
愿意写代码的人一般都不太愿意去写文章,因为代码方面的艺术和文字中的美学往往很难兼得,两者都兼得的人通常都已经被西方极乐世界所收罗,我也是只喜欢写代码,让那些字母组成美妙的歌曲,然后自我沉浸在其中自得其 ...
- .Net中的AOP系列之《方法执行前后——边界切面》
返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...
- .NET中Redis安装部署及使用方法简介附->开源Redis操作辅助类
Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. Re ...
随机推荐
- streamsets microservice pipeline 试用
实际上还是一个pipeline,只是添加了一些规则以及内嵌的http server 方便我们对于基于http 或者类似轻量 协议数据的处理 基本环境 使用docker&& docker ...
- php 数据类型转换与比较
<?php define("PI", 3.1415926); echo PI."<br>"; //定义一个常量 define("GR ...
- lnmp -- 解决Warning: scandir() has been disabled for security reasons in…的问题
原因:LNMP 0.9禁用了部分存在危险的PHP函数 LNMP0.9禁用的PHP函数包括:passthru, exec, system, chroot, scandir, chgrp, chown, ...
- macOS --- 配置基于域名的虚拟主机
在终端运行 sudo vi /Applications/XAMPP/xamppfiles/etc/httpd.conf,打开apache配置文件. 在httpd.conf中找到"#Inclu ...
- Linux中epoll+线程池实现高并发
服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理.通常多线程模型下,每个线程 ...
- linux 使用中括号进行条件判断
格式 “#”代表空格,不可缺少 [# param1#op# param2 #] 这种带比较操作符的形式,op左右必须使用空格隔开. 如 [# “3”==”2” #] 这种缺少空格的写法会得到结 ...
- 使用用WCF中的双工(Duplex)模式将广告图片推送到每个Winform客户端机子上
参考资料地址:http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html 代码实现: WCF宿主(服务端) IServices.c ...
- RecordingOptions录制设置选项
1.录制思考时间 2.录制方式 3.自定义证书 4.非资源选项
- Java 迭代器 Iterator
迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行 ...
- mysql统计一个库里面的表的总数
SELECT COUNT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA = 'weixin_platform' weixi ...