halcon二维测量

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

你可能感兴趣的:(机器智能)