背景
再编写瑕疵检测的程序的时候,经常需要判断,是否存在瑕疵。这里我踩了几个“深坑”这里分享一下。
踩坑记录
判断是否有瑕疵需要从两个角度分析。
第一,瑕疵个数是0。如果个数是0那么必然没有瑕疵。
第二,瑕疵个数不为0,但是面积都是0。
第二种情况是如何出现的呢?
一般是我们调用了算子 difference:
difference (Region1, Region2, RegionDifference)
Region1 和 Region2 他们中存在完全相同的区域,如果相减就会得到面积为0的区域!
第一个坑
/// <summary>
/// 判断区域是否为空
/// </summary>
/// <returns></returns>
bool RegionIsEmpty(HObject region)
{
HTuple area;
HOperatorSet.AreaCenter(region, out area, out _, out _);
if (area.Length == 0) return true;
else return false;
}
你觉得这样可以了吗? 答案是不行的,应为 也有可能area.Length > 0 , 但是每个area都是0的情况。这样也是不存在瑕疵的。
第二个坑
bool RegionIsEmpty(HObject region)
{
HTuple area;
HOperatorSet.AreaCenter(region, out area, out _, out _);
if (area.Length == 0 || area == 0) return true;
else return false;
}
那这样总没有问题的了吧? 还是存在问题。 如果area是一个数组,且第一个元素为0,其他元素不为0的时候。也是返回true的。
这是因为,当difference相减时,一般得到是一群区域,如果此时数组的一个元素是0,那么 area == 0 就会为真(这样比较只看第一个元素,不看后面的。)
看看,我调试的截图:
填坑
bool RegionIsEmpty(HObject region)
{
HTuple area;
HOperatorSet.AreaCenter(region, out area, out _, out _);
if (area.Length == 0)
{
return true;
}
else
{
//循环area,只要有一个不为0,就说明有瑕疵返回false
for (int i = 0; i < area.Length; i++)
{
if(area[i] != 0) { return false; }
}
return true;
}
}
这是完整的写法!
调试小剧场
因为这个问题,我调试的差点怀疑人生,从9点调试到11点。找不到问题都睡不着觉。
过程是这样的,我一开始直接用halcon的IDE调试,直接是把RegionDifference这个区域显示出来。所以halcon的IDE调试是可以检测到瑕疵。
然后到了C#这边,我用的是halcon引擎,得到RegionDifference这个结果,然后用 RegionIsEmpty 这个函数判断是否有瑕疵,有才显示,没有不显示。
而这次,刚好出现了“数组的一个元素是0”这种情况。所以C#显示这边没有瑕疵显示。
当前我使用的是halcon引擎,我想这不都是同一个算子吗?怎么halcon IED和我调用halcon引擎得到不一样的结果呢?我一度怀疑是halcon引擎bug!
还好最后发现是我的bug,halcon引擎没bug,太好了!!halcon引擎值得信赖~~~~