抓边(一)——————————————使用halcon测量助手

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Date:2018.09.09

需求:在一个矩形ROI区域内抓到产品的边缘(为规则的直线);矩形框需人为设定。

  • 相关halcon算子:

1. gen_measure_rectangle2

void GenMeasureRectangle2(const HTuple &row, const HTuple &column, 
  const HTuple &radius, const HTuple &len1, const HTuple &len2,
  const HTuple &width, const HTuple &height, const HTuple &interpolation,
  HTuple *measureHandle);

2. measure_pos

void MeasurePos(const HObject &image, const HTuple &measureHandle, 
  const HTuple &sigma, cosnt HTuple &threshold, const HTuple &transition, const HTuple &select,
  HTuple *rowEdge, HTuple *colEdge, HTuple *amplitude, HTuple *distance);

3.  fit_line_contour_xld

void FitLineContourXld(const HObject &contours, const HTuple &algorithm, 
  const HTuple &maxNumPoints, const HTuple &clippingEndPoints, const HTuple &iterations, const HTuple clippingFactor,
  HTuple *rowBegin, HTuple *colBegin, HTuple *rowEnd, HTuple *colEnd, HTuple *nr, HTuple *nc, HTuple *dist);

 

代码实现:

step1.划定矩形ROI区域,并归一化方向。(以水平边缘线为例

DrawRectangle2(3600, &hv_Row, &hv_Column, &hv_Phi, &hv_Length1, &hv_Length2);
GenRectangle2(&ho_m_region, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2);
SmallestRectangle2(ho_m_region, &hv_row0, &hv_col0, &hv_radius0, &hv_len1, &hv_len2);
hv_phi0 = hv_radius0.TupleDeg();
if (0 != (hv_phi0<0))
{
  hv_phi0 += 180;
}
hv_radius0 = hv_phi0.TupleRad();
hv_phi0 = hv_radius0.TupleDeg();
if (0 != (HTuple("horizontal")==hv_m_direction))
{
  if (0 != (hv_phi0<90))
  {
    hv_phi1 = hv_phi0+90;
  }
  else
  {
    hv_phi1 = hv_phi0-90;
  }
}
hv_radius1 = hv_phi1.TupleRad();

 step2. 生成measureHandle并找到一系列边缘点

for (hv_i=0; hv_i.Continue(end_val28, step_val28); hv_i += step_val28)
{
  hv_row = hv_row0+(((hv_m_step-(2*hv_i))*hv_stepLen)*(hv_radius0.TupleSin()));
  hv_col = hv_col0-(((hv_m_step-(2*hv_i))*hv_stepLen)*(hv_radius0.TupleCos()));
  GenMeasureRectangle2(hv_row, hv_col, hv_radius1, hv_len2, hv_stepLen*0.6, hv_widthImg, 
      hv_heightImg, "nearest_neighbor", &hv_MeasureHandle);
  GenRectangle2(&ho_Rectangle, hv_row, hv_col, hv_radius1, hv_len2, hv_stepLen);
  MeasurePos(ho_m_image, hv_MeasureHandle, hv_m_sigma, hv_m_threshold, hv_m_transition, 
      hv_m_selection, &hv_rowEdge, &hv_colEdge, &hv_Amplitude, &hv_Distance);
  //待添加...

  if (0 != ((hv_Amplitude.TupleLength())>0))
  {
    hv_Indices = 0;
    TupleAbs(hv_Amplitude, &hv_Amplitude);
    TupleMax(hv_Amplitude, &hv_Max);
    TupleFind(hv_Amplitude, hv_Max, &hv_Indices);
    hv_rowsEdge = hv_rowsEdge.TupleConcat(HTuple(hv_rowEdge[HTuple(hv_Indices[0])]));
    hv_colsEdge = hv_colsEdge.TupleConcat(HTuple(hv_colEdge[HTuple(hv_Indices[0])]));
  }
...    
}

 step3. 拟合直线边缘

GenContourPolygonXld(&ho_lineXLD, hv_rowsEdge, hv_colsEdge);
FitLineContourXld(ho_lineXLD, "tukey", -1, 0, 5, 2, &hv_RowBegin, &hv_ColBegin, 
    &hv_RowEnd, &hv_ColEnd, &hv_Nr, &hv_Nc, &hv_Dist);

 OK了。

原文地址:https://www.cnblogs.com/xiawuhao2013/p/9615307.html