分享

halcon二维测量

 行走在理想边缘 2017-02-08
halcon二维测量的基本步骤
1.图片预处理,这里指的是图片的滤波等手段,使要测量的特征凸显化,有效去除噪点干扰等。
2.阈值化,通过阈值化抽取出图像的特征,通常使用灰度阈值化,但halcon中没有特意的将图片转换成灰度图,而是直接调用阈值化处理函数。同时灰度直方图能帮助开发人员快速找到阈值范围。
3.阈值化之后是求解图片的联通区域,一般阈值化之后存在很多连通区域,还要使用select_shape函数根据条件筛选出满足条件的连通区域。也可以自行筛选。
4.之后就是形体的拟合(也称为轮廓处理),这一步更具实际情况和需求,可有可无。
5.获取形体的特征数据,这些数据就是测量数据,包括位置,内拟合矩形、外拟合矩形尺寸,内拟合、外拟合园尺寸等。


在进入正式的二维测量之前,需要有一个ROI,所有的图片处理都在这里完成,ROI的生成有两种基本方案,用户自己选择和使用模板匹配来选择一个区域。这个区域的选择好坏,对处理的难度影响很大。

二维测量的halcon代码:
read_image(Image, 'C:/Users/Public/Documents/MVTec/HALCON-12.0/examples/images/bonds/ball_bond_ccd_03.png')
median_image(Image,ImageMedian, 'circle', 5, 'mirrored')
threshold(ImageMedian,ROI,120,255)
connection(ROI,connRegion)
select_shape(connRegion,selRegion,'area','and',1000,90000)

这段代码简单,目的是利用halcon工具找到预处理滤波器类型和参数,阈值处理参数和形体筛选参数。
以下是对应的c++代码:
void TestProc2d ::proc(HImage & image)
{
                m_display->SetColor( 'red');
                m_display->SetDraw( 'margin');

                 HImage medImage = image .MedianImage('circle',3, 'mirrored');

                 HRegion roiREgion;
                roiREgion.GenRectangle1(m_roi.row1,m_roi.col1,m_roi.row2,m_roi.col2);
                 HImage redMianImage = medImage.ReduceDomain(roiREgion);

                 HRegion thedRangion = redMianImage.Threshold(120,255);
                 HRegion connRegion = thedRangion.Connection();
                 int n = connRegion.CountObj();
                 for(int i = 1; i<=n; i++)
                {
                                 Hlong r1,r2,c1,c2;
                                connRegion[i].SmallestRectangle1(&r1,&c1,&r2,&c2);
                                 qDebug() << 'conn object : ' << r1 << c1 << r2 << c2 << '(' << r2-r1 << ',' << c2-c1 << ')';
                }

                 HRegion selRegion = connRegion.SelectShape('area', 'and',500,900000);
                n = selRegion.CountObj();
                 qDebug() <<'connect count : ' << connRegion.CountObj() << '       sel count : ' << n;
                 for(int i = 1; i<=n; i++)
                {
                                 Hlong r1,r2,c1,c2;
                                selRegion[i].SmallestRectangle1(&r1,&c1,&r2,&c2);
                                m_display->DispRectangle1(r1,c1,r2,c2);
                                 qDebug() << 'select obj : ' << r1 << c1 << r2 << c2 << '(' << r2-r1 << ',' << c2-c1 << ')';
                }
}


二维图像处理的难点:
1.ROI区域的确立,我们的期望是ROI中仅包含我们要测量的对象,仅一个对象,但这很难做到,所以我们力求这个ROI区域越 精确越好。建立这个ROI区域,调试时一般手动绘制确定,实际项目中一般使用模板匹配确定一个大的区域,再通过这个大的区域的相对区域确定最终的ROI。所以寻找测量目标的特征,确定模板区域也无比重要。

2.图片的拍摄质量,这里的拍摄质量不是指的清晰度,而是区分测量对象和非测量对象的难以程度。我们最希望的是在灰度上,被测量对象和非测量对象有明显的差异,易于形体划分,当然颜色也是一个很好的区分对象。为了达到这个目的,我们首先要使用不同的光源、选择不同的角度照射使其凸显,其次可以选择不同的镜头和光圈予以辅助(当然,镜头的核心目的是选择视场)。

3.形体的筛选,通常情况下我们处理后会得到好多对象,从中筛选出测量对象相当关键,这里可能是测量过程中人工智能技术最易介入的地方。通常可以根据面积,外接矩形长宽等特征筛选,选择用哪种方法完全取决于被测对象的特征,希望使用他的唯一性特征来筛选。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多