sort_contours_xld算子的几种排序方式研究
算子sort_contours_xld算子有5种排序方式,即:
'upper_left':
The position is determined by the upper left corner of the surrounding rectangle.
'upper_right':
The position is determined by the upper right corner of the surrounding rectangle.
'lower_left':
The position is determined by the lower left corner of the surrounding rectangle.
'lower_right':
The position is determined by the lower right corner of the surrounding rectangle.
'character':
The position is determined by the upper left corner of the surrounding rectangle. In contrast to 'upper_left', the contours are also sorted according to the remaining coordinate, if they overlap in the direction of the coordinate which is specified by the parameter RowOrCol.
其中'character'排序方式不太好理解,不过从英文说明可知,它跟'upper_left'排序方式很像,我想一般来说,前面的四种排序方式一般够用了。
以'upper_left'排序方式为例,它的英文说明的翻译是:位置由环绕矩形的左上角决定。
于是我猜测它的意思是这样的:对于一组xld来说,画出每一个xld的最小平行矩形(gen_rectangle1),然后根据这些矩形的左上角坐标来对这些xld进行排序。
先看算子签名:
sort_contours_xld(Contours : SortedContours : SortMode, Order, RowOrCol : )
Order可以取'true'或者'false','true'是升序排列,'false'是降序排列。
RowOrCol 可以取'row'或者'column'。
下面以如下方式排列试试:(根据最小外接矩形的左上角的行坐标来升序排列)
sort_contours_xld (SelectedXLD, SortedContours, 'upper_left', 'true', 'row')

read_image (Image, 'C:/Users/happy xia/Desktop/dynPic.png')
threshold_sub_pix (Image, Border, )
select_shape_xld (Border, SelectedXLD, 'contlength', 'and', , )
sort_contours_xld (SelectedXLD, SortedContours, 'upper_left', 'true', 'row')
dev_set_draw ('margin')
dev_display (Image)
count_obj (SortedContours, Number)
gen_empty_obj (EmptyObject)
*注释:这里Number =
for Index := to Number by
select_obj (SortedContours, ObjectSelected, Index)
smallest_rectangle1_xld (ObjectSelected, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
concat_obj (EmptyObject, ObjectSelected, EmptyObject)
endfor dev_display (Image)
select_obj (SortedContours, ObjectSelected1, )
sort_contours_xld (SelectedXLD, SortedContours2, 'upper_left', 'false', 'row')
select_obj (SortedContours2, ObjectSelected2, Number - 11 + 1)
程序中变量ObjectSelected出现的顺序依次如下:(可以观察ObjectSelected的外接矩形的row坐标,看是否符合之前总结的规律)

对于排序后的xld元组SortedContours,我们可以发现它的升序排列第11项和降序排列第(29-11+1)项是同一个对象,都是字母W。

有一个问题值得讨论一下:'upper_right', 'true', 'row'和'upper_left', 'true', 'row'有何区别?
我反复试了一下,结论是:没有区别。因为根据行(row)排列时,矩形的左上角和右上角的row值是一样的。
如果是根据row升序排列,如果row一样,那么再根据column升序排列;如果是根据row降序排列,如果row一样,那么再根据column降序排列。
至于其他几种排序方式,规律是一样的,无需赘言。
不知道看到这里的网友们懂了没有,反正我自己是搞懂了,要想彻底搞懂,很简单,用我提供的图和程序,反复变换排序的方式,跑一跑程序便知。
sort_contours_xld算子的几种排序方式研究的更多相关文章
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
- TreeSet的两种排序方式,含Comparable、Comparator
1.排序的引入 由于TreeSet可以实现对元素按照某种规则进行排序,例如下面的例子 public class TreeSetDemo { public static void main(String ...
- [Java]HashMap的两种排序方式
先将 Map 中的 key 和 value 全部取出来封装成 JavaBea 数组,再将这个数组排序,排序完成后,重新写回 Map 中,写回时采用 LinkedHashMap 可以保证迭代的顺序. 下 ...
- HashMap的两种排序方式
Map<String, Integer> map = new HashMap<String, Integer>();map.put("d", 2);map. ...
- 几种排序方式的java实现(02:希尔排序,归并排序,堆排序)
代码(部分为别人代码): 1.希尔排序(ShellSort) /* * 希尔排序:先取一个小于n的整数d1作为第一个增量, * 把文件的全部记录分成(n除以d1)个组.所有距离为d1的倍数的记录放在同 ...
- 几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)
以下为集中排序的java代码实现(部分是在引用别人代码): 插入排序(InsertSort): //代码原理 public static void iSort(int[] a){ for(int i ...
- java学习-排序及加密签名时数据排序方式
排序有两种 1. 类实现comparable接口调用List.sort(null)或Collections.sort(List<T>)方法进行排序 jdk内置的基本类型包装类等都实现了Co ...
- Java基础-数组常见排序方式
Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...
- c# list排序的三种实现方式
用了一段时间的gridview,对gridview实现的排序功能比较好奇,而且利用C#自带的排序方法只能对某一个字段进行排序,今天demo了一下,总结了三种对list排序的方法,并实现动态传递字段名对 ...
随机推荐
- BZOJ3732: Network(Kruskal重构树)
题意 Link 给出一张$n$个点的无向图,每次询问两点之间边权最大值最小的路径 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ S ...
- 实例化Bean的方法(基于xml配置)-http://blog.csdn.net/shymi1991/article/details/48153293
实例化Bean的方法(基于xml配置) 标签: spring framework 2015-09-01 13:43 918人阅读 评论(0) 收藏 举报 分类: Spring FrameWork(7 ...
- streamsets Processors 说明
Processors 表示对于一种数据操作处理,在pipeline中可以应用多个Processors, 同时根据不同的执行模式,可以分为独立模式的,集群模式.边缘模式(agent),以及 帮助测试的测 ...
- 使用bit管理npm包
npm 包给共享,团队写作有好多问题需要解决,类似的解决方案有lerna yarn 使用monorepo,bit 官方有相关的比较 以下只说明如何进行简单的项目使用 网站 https://bitsrc ...
- C#模板引擎 DotLiquid
DotLiquid 是一个简单.快速和安全的模板引擎,移植自 Ruby 的 Liquid 标签. 示例模板: <p>{{ user.name }} has to do:</p> ...
- docker 数据卷 ---- 基础篇
用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作.容器中管理数据主要有两种方式:数据 ...
- linux之 CentOS/RHEL/Scientific Linux 6 & 7上安装Telnet
声明: 在安装和使用Telnet之前,需要记住以下几点. 在公网(WAN)中使用Telnet是非常不好的想法.它会以明文的格式传输登入数据.每个人都可以看到明文.如果你还是需要Telnet,强烈建议你 ...
- Mysql向存储过程中传递中文参数变成乱码的解决方案
今天做程序需要用到一个存储过程,然后用php程序调用. 存储过程如下: delimiter $$ CREATE PROCEDURE disagree_upgrade_detail(a int,b t ...
- jeecg中的树形控件demo
1.comboTree控件 1.页面方法: <t:comboTree url="jeecgFormDemoController.do?getComboTreeData" va ...
- SQL中減少日志文件大小
SQL中減少日志文件大小 编写人:CC阿爸 2014-6-14 在日常SQL数据库的操作中,常常会出现SQL日志文件超大,大小都超过正常MDF数据库文件,作为一般用户来讲,LDF太大,只会影响服务 ...