• halconfit_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])
        *根据拟合后得到的数据创建直线xld
        
          
    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));
        //根据拟合后得到的数据创建直线xld
    
    
      }
    
      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());

  • 相关阅读:
    Vue中data数据,使用v-model属性绑定第三方插件(例如Jquery的日期插件)无法自动更新
    Mybatis的XML文件调用静态方法
    将博客搬至CSDN
    深入理解Java:类加载机制及反射
    JDBC中Statement与PreparedStatement的区别
    响应实体类
    MD5加密
    idea的注入和自动编译配置
    mybatis三剑客之插件---MyBatis plugins
    通过git从码云克隆项目到本地
  • 原文地址:https://www.cnblogs.com/liming19680104/p/16009654.html
Copyright © 2020-2023  润新知