1. 程式人生 > 其它 >halcon-fit_line_contour_xld擬合直線

halcon-fit_line_contour_xld擬合直線

 

 

 

在HDevelop中

dev_close_window ()
read_image (Image, 'D:/bb/tu/7.jpg')
rgb1_to_gray (Image, GrayImage)

edges_sub_pix (GrayImage, Edges, 'canny', 1, 5, 10)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
*分割xld輪廓

select_shape_xld (ContoursSplit, SelectedXLD, 'contlength', 'and
', 25, 26) get_contour_global_attrib_xld (SelectedXLD, 'cont_approx', Attrib) gen_empty_obj (Lines) if(Attrib=-1) *判斷xld是否適合擬合成直線 fit_line_contour_xld (SelectedXLD, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) *對XLD輪廓做近似直線計算--擬合直線--獲得直線資料 *引數1:輸入輪廓 *引數2:形成線的演算法
* regression:迴歸,標準的最小二乘法擬合 * huber:加權的最小二乘法擬合,異常值的影響被減小基於Huber方法 * tukey:加權的最小二乘法擬合,異常值的影響被減小基於Tukey方法(系統推薦方法) * gauss:加權的最小二乘法擬合,異常值的影響被減小基於最逼近線上的所有其輪廓點的平均值和距離標準方差 * drop:加權的最小二乘法擬合,異常值的影響被消除 *引數7:RowBegin返回線段起點的行座標 *引數8:ColBegin返回線段起點的列座標 *引數9:RowEnd返回線段終點的行座標
*引數10:ColEnd返回線段終點的列座標 gen_contour_polygon_xld (Contour, [RowBegin,RowEnd], [ColBegin,ColEnd]) *根據擬合後得到的資料建立區域 endif get_image_size (GrayImage, Width, Height) dev_open_window(10,10,Width, Height,'black',WindowHandle) dev_display(SelectedXLD) dev_open_window(10,10,Width, Height,'black',WindowHandle1) dev_display(Contour)

 

 


在QtCreator中

  HObject  ho_Image, ho_GrayImage, ho_Edges, ho_ContoursSplit;
  HObject  ho_SelectedXLD, ho_Lines, ho_Contour;
  HTuple  hv_Attrib, hv_RowBegin, hv_ColBegin, hv_RowEnd;
  HTuple  hv_ColEnd, hv_Nr, hv_Nc, hv_Dist, hv_Width, hv_Height;
  HTuple  hv_WindowHandle, hv_WindowHandle1;
  ReadImage(&ho_Image, "D:/bb/tu/7.jpg");
  Rgb1ToGray(ho_Image, &ho_GrayImage);

  EdgesSubPix(ho_GrayImage, &ho_Edges, "canny", 1, 5, 10);
  SegmentContoursXld(ho_Edges, &ho_ContoursSplit, "lines_circles", 5, 4, 2);
  //分割xld輪廓

  SelectShapeXld(ho_ContoursSplit, &ho_SelectedXLD, "contlength", "and", 25, 26);
  GetContourGlobalAttribXld(ho_SelectedXLD, "cont_approx", &hv_Attrib);
  GenEmptyObj(&ho_Lines);

  if (0 != (hv_Attrib==-1))
  {
    //判斷xld是否適合擬合成直線
    FitLineContourXld(ho_SelectedXLD, "tukey", -1, 0, 5, 2, &hv_RowBegin, &hv_ColBegin, 
        &hv_RowEnd, &hv_ColEnd, &hv_Nr, &hv_Nc, &hv_Dist);
    //對XLD輪廓做近似直線計算--擬合直線--獲得直線資料
    //引數1:輸入輪廓
    //引數2:形成線的演算法
    //     regression:迴歸,標準的最小二乘法擬合
    //     huber:加權的最小二乘法擬合,異常值的影響被減小基於Huber方法
    //     tukey:加權的最小二乘法擬合,異常值的影響被減小基於Tukey方法(系統推薦方法)
    //     gauss:加權的最小二乘法擬合,異常值的影響被減小基於最逼近線上的所有其輪廓點的平均值和距離標準方差
    //     drop:加權的最小二乘法擬合,異常值的影響被消除
    //引數7:RowBegin返回線段起點的行座標
    //引數8:ColBegin返回線段起點的列座標
    //引數9:RowEnd返回線段終點的行座標
    //引數10:ColEnd返回線段終點的列座標

    GenContourPolygonXld(&ho_Contour, hv_RowBegin.TupleConcat(hv_RowEnd), hv_ColBegin.TupleConcat(hv_ColEnd));
    //根據擬合後得到的資料建立區域


  }

  GetImageSize(ho_GrayImage, &hv_Width, &hv_Height);
  SetWindowAttr("background_color","black");
  OpenWindow(10,10,hv_Width,hv_Height,0,"visible","",&hv_WindowHandle);
  HDevWindowStack::Push(hv_WindowHandle);
  if (HDevWindowStack::IsOpen())
    DispObj(ho_SelectedXLD, HDevWindowStack::GetActive());

  SetWindowAttr("background_color","black");
  OpenWindow(10,10,hv_Width,hv_Height,0,"visible","",&hv_WindowHandle1);
  HDevWindowStack::Push(hv_WindowHandle1);
  if (HDevWindowStack::IsOpen())
    DispObj(ho_Contour, HDevWindowStack::GetActive());