查看 orientation_region(Regions : : :Phi) 算子的帮助文档可以发现,这个算子是基于 elliptic_axis(Regions : : :Ra, Rb, Phi) 算子的。那这个orientation_region算子具体含义是什么?这个Phi值是怎么得到的呢?

首先我们分析一下这个elliptic_axis(Regions : : :Ra, Rb, Phi) 算子。这个算子作用是得到和输入区域具有相同方向(same orientation)、同侧关系(same side relation)的椭圆。这个椭圆可以通过计算输入区域的几何矩(如果不懂什么是图像的几何矩,可以点击这里。知道几何矩想知道怎么得到椭圆,可以查看这个算子的帮助文档,里面有具体的公式)得到。这个椭圆的长、短轴半径以及方向分别保存在Ra、Rb和Phi上。下图是任意区域得到的这个“同等”椭圆。注意这个红色的水平线是有方向的,蓝色的线没有。所以elliptic_axis算子的方向取值为:-90<Phi<=90(顺时针为负,逆时针为正,例如下图中的Phi为正)。

Halcon学习(5.1):orientation_region算子分析

现在简单的看一下长方形的“同等”椭圆。原图如下:

Halcon学习(5.1):orientation_region算子分析

代码如下(如果有些算子不是很清楚,可以查看帮助文档,或者翻看我以前博客中Halcon学习的代码,都有涉及到并注释了):

dev_close_window ()
read_image(Image,'E:/HalconCodeing/image/jvxing.jpg')
dev_open_window(0,0,-1,-1,'white',WindowHandle)
dev_display(Image)
threshold (Image, Regions, 222, 254)
dev_set_line_width (3)
dev_set_color('black')
dev_set_draw('margin')
opening_rectangle1(Regions,OpRegions,10,8)
dev_clear_window()
dev_display(OpRegions)
dev_set_color('red')
*生成“同等”椭圆
elliptic_axis(OpRegions,Ra,Rb,Phi)
area_center(OpRegions,_,Row,Column)
*画椭圆
gen_ellipse(Ellipses,Row,Column,Phi,Ra,Rb)
dev_display(Ellipses)

效果图:

Halcon学习(5.1):orientation_region算子分析

可以查看控制变量窗口,Phi的值很小,椭圆的长轴几乎和水平轴平行(椭圆的长轴方向大致可以确定输入区域的方向)。

Halcon学习(5.1):orientation_region算子分析

现在我们来分析orientation_region(Regions : : :Phi)算子。从它的帮助文档我们可以知道,它是得到输入区域的方向,同时它是基于elliptic_axis算子的,那它们有什么区别吗?两个算子得到的方向有什么关系吗?先说区别:

第一,orientation_region算子涉及到区域图形的重心,但是这个算子参数中并没有给出重心的坐标,同时帮助文档中也没有告诉我们怎么求重心坐标。在查看其它资料时发现,也可以通过区域的几何矩得到,即:得到区域的0阶和1阶矩就能算出区域的重心。注意,由于并不确定Halcon是否是采用几何矩计算区域重心的,同时也不知道Halcon那个算子是采用这种方法得到重心的,所以我在后面的实验分析中,是采用area_center得到坐标作为重心进行实验的。

第二,同时也设计到重心到区域轮廓距离最长的点。看帮助文档的时候,让我很是迷惑,这个轮廓是指什么的轮廓?是这个输入区域的轮廓?还是elliptic_axis算子计算出“同等”椭圆的轮廓?通过后面的大量实验,虽然不是100%肯定,应该是输入区域的重心到输入区域的轮廓距离最长的点。

第三,由于多了这个距离最长的点,现在不光是椭圆的长轴和水平有夹角的问题,长轴也有方向了,而这个点的方向决定了长轴的方向。同时帮助文档也提到,当这个点的纵坐标小于重心的纵坐标时,Phi的值要加上180度,也就是一个π。算子orientation_region(Regions : : :Phi)中的Phi的取值为:-180<=Phi<180。为了方便理解,大致表示如下:

Halcon学习(5.1):orientation_region算子分析

 

Halcon学习(5.1):orientation_region算子分析

 

注意:椭圆的长轴方向并不能精确确定输入区域的方向(通过输入区域几何矩得到Phi值),不过可以作为参考方向。

现在我们通过算子orientation_region得到的方向oPhi和elliptic_axis算子得到的方向ePhi去仿射变换原图,看看它们具体变化效果及它们的关系。代码如下:

dev_close_window ()
dev_open_window (0, 0, 800, 580, 'white', WindowID)
dev_set_line_width (3)
dev_set_color ('black')
dev_set_draw('margin')
draw_region (Region, WindowID)
dev_set_color('green')
elliptic_axis (Region, Ra, Rb, ePhi)
area_center (Region, _, Row, Column)
gen_ellipse (Ellipse, Row, Column, ePhi, Ra, Rb)
dev_display (Ellipse)

vector_angle_to_rigid (Row, Column, ePhi, Row, Column, 0, HomMat2D)
dev_set_color('black')
*为了方便对比,将采用ePhi得到的区域向右平移300个像素
hom_mat2d_translate(HomMat2D,0,320,HomMat2D)
affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'false')
dev_display(RegionAffineTrans)
dev_set_color('green')
elliptic_axis(RegionAffineTrans,Ra2,Rb2,ePhi2)
area_center (RegionAffineTrans, _, Row2, Column2)
gen_ellipse (Ellipse1, Row2, Column2, ePhi2, Ra2, Rb2)
dev_display (Ellipse1)


orientation_region(Region,oPhi)
vector_angle_to_rigid (Row, Column, oPhi, Row, Column, 0, HomMat2D2)
*为了方便对比,将采用oPhi得到的区域向下平移200个像素
hom_mat2d_translate(HomMat2D2,200,0,HomMat2D2)
dev_set_color('black')
affine_trans_region (Region, RegionAffineTrans2, HomMat2D2, 'false')
dev_display(RegionAffineTrans2)
dev_set_color('green')
elliptic_axis(RegionAffineTrans2,Ra3,Rb3,ePhi3)
orientation_region(RegionAffineTrans2,oPhi1)
area_center (RegionAffineTrans2, _, Row3, Column3)
gen_ellipse (Ellipse2, Row3, Column3, ePhi3, Ra3, Rb3)
dev_display (Ellipse2)

两种典型的情况如下:

第一种情况:

Halcon学习(5.1):orientation_region算子分析

第二种情况如下:

Halcon学习(5.1):orientation_region算子分析

尝试了多次,还是没有发现ePhi和oPhi的关系。它们有如下情况:ePhi和oPhi的值相同;ePhi和oPhi的值的绝对值相加等于π。结合了那个最远距离的点还是不知道什么情况下它们会相同,什么情况下它们值的绝对值相加等于π。可能是我分析的方向有问题,不过算子的分析就先到这里了,后续的学习中看看能找到问题的根源。

相关文章: