A.背景描述:
1.halcon的角度范围0到360; 2.vm的角度范围-180到180。
B.主要难点是:
1.halcon是弧度制,VM是角度制,注意要单位转换为相同的,因为是转为VM的,所以下面都用角度制表达的。
2.因为Halcon是0到360度,所以Halcon只有一个方向;而VM是-180到180,如果画一个直角坐标系,就会发现有两个方向,即0到180 和 0到-180两个方向。所以,需要考虑两个情况,基准值大于等于0 和 基准值小于等于0。
C.方法:
1.基于上面的难点,写了下面的方法,经过旋转产品一圈,测试是OK的。注意测试,要用有意义的测试,即角度一定要这样才可以,比如OCR的识别,或者查找直线的区域。不要用Blob或者查找模版的算子。
2.下面矩形框的基准值,表示的是做基准时的VM角度基准值,注意,我这里基准值和Halcon的基准值正好是反的,注意要把Halcon的角度值取反。
3.矩形框的旋转角度是halcon的旋转角度,
4.方法返回的值就是VM里面矩形框在旋转以后的角度。
5.下面是具体实现的方法:
/// <summary>
/// 求旋转后矩形框的角度
/// </summary>
/// <param name="baseangle">矩形框的基准角度</param>
/// <param name="angle">矩形框的旋转角度</param>
/// <returns></returns>
public double ConvertAngleToMinus180To180(double baseangle,double angle)
{
double a = 0;
if (baseangle>=0) //如果 矩形框的基准角度 大于零
{
if (angle <= (360 -(180- baseangle))) //即假设矩形框的基准角度是60度,则矩形框最多还能120度 负值可以到180
{
a= baseangle - angle;
}
else
{
double a1= (180 - baseangle); //最大的正直
double a2 = angle-(180 + baseangle); //超过负值的部分 这部分要计入正直
a =(a1-a2) +baseangle;
}
}
else if (baseangle < 0) //如果 矩形框的基准角度 小于零 -95
{
if (angle<=(180-Math.Abs(baseangle))) //负值的范围
{
a = baseangle - angle;
}
else
{
double a1 = 180-Math.Abs(baseangle); // 负值方向的值
double a2 = angle - a1; // 80
a= (180-a2);
}
}
return a;
}