三种方式实现显示模板轮廓

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/machaoyu86/article/details/51194161


三种方式实现显示模板轮廓

第一种方法:用 vector_angle_to_rigid算子计算仿射变换矩阵,然后对模板轮廓进行变换。在实际当中,进行仿射变换最经常、最简单的方法是使用算子vector_angle_to_rigid。

第二种方法:定义仿射变换矩阵,然后逐个添加要进行的变换项,然后对模板轮廓进行变换。

第三种方法:调用HDevelop封装的函数dev_display_shape_matching_results.这种方法比较简洁,在应用中,需要显示模板轮廓,推荐这种方式。这种方式显示的图形不具备历史记录属性,是一次性的。


一个例子:



*开启异常处理
dev_set_check('give_error')
*错误代码,非0表示异常,0表示ok
ErrorCode:=0
try
    *设置填充模式
    dev_set_draw('margin')
    read_image(Image,'D:/halcon学习/image/连接件图像/连接件/Image/1-1.bmp')
    *绘制模板区域
*     draw_region(Region,3600)
    threshold(Image,Region,0,200)
    *减少定义域
    reduce_domain(Image, Region, ImageReduced1)
    *创建模板
    create_shape_model (ImageReduced1, 'auto', 0, rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID1)
   *保存模板.保存后清除模板。模板句柄大于-1时是有效的
   if(ModelID1>-1)
       *保存模板
       write_shape_model (ModelID1, 'D:/halcon学习/model/shape.shm')
       *清除模板
       clear_shape_model(ModelID1)
       *使模板句柄无效
        ModelID1:=-1
   endif
   *读取模板
   read_shape_model('D:/halcon学习/model/shape.shm',ModelID2)
   *用采集助手读取图像文件夹,并插入代码
    * Code generated by Image Acquisition 01
    list_files ('D:/halcon学习/image/连接件图像/连接件/Image', ['files','follow_links'],\
    ImageFiles)
    tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm\
                         |pbm|xwd|ima)$','ignore_case'], ImageFiles)
    *遍历文件夹中的图像循环
    for Index := 0 to |ImageFiles| - 1 by 1
        try
           ***读取图像
           read_image (Image, ImageFiles[Index])
           * Do something
           ***模板匹配
           
            find_shape_model (Image, ModelID2, 0, rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score1)
           ***通过任意匹配结果元组的元素个数判断是否匹配成功,大于0表示匹配成功,小于1表示匹配失败
           if(|Row|<1)
               *匹配失败,继续执行循环
               continue
           endif
           
           *获取模板轮廓
           get_shape_model_contours(ModelContours, ModelID2, 1)
           
           
           
           
           ************第一种方法
           *默认模板中心在(0,0),角度是0°,作为原始信息。以定位到的中心和角度作为实际点信息
           *用vector_angle_to_rigid计算仿射变换矩阵
           vector_angle_to_rigid(0,0,0,Row, Column, Angle, HomMat2D1)
           *对模板轮廓进行仿射变换
           affine_trans_contour_xld(ModelContours, ContoursAffinTrans, HomMat2D1)
           *显示图像
           dev_display(Image)
           *显示模板轮廓
           dev_display(ContoursAffinTrans)
           
           
           
           ************第二种方法
           *产生仿射变换矩阵
           hom_mat2d_identity(HomMat2D2)
           *把旋转角度添加到仿射变换矩阵
           hom_mat2d_rotate(HomMat2D2,Angle,0,0,HomMat2D2)
           *把平移量添加到防射变换矩阵
           hom_mat2d_translate(HomMat2D2,Row,Column,HomMat2D2)
           *对模板轮廓进行仿射变换
           affine_trans_contour_xld(ModelContours,ContoursAffinTrans2,HomMat2D2)
           * *显示图像
           dev_display(Image)
           *显示模板轮廓
           dev_display(ContoursAffinTrans2)
           
           
           *************第三种方法
           dev_display(Image)
           dev_display_shape_matching_results(ModelID2, 'red', Row, Column, Angle, 1, 1, 0)
           
           
           
           
        *异常捕获  
        catch(Exception1)
            *继续执行循环
            continue
        endtry
    endfor
   
   
catch(Exception)
    *获取错误代码
    ErrorCode:=Exception[0]
endtry






展开阅读全文

没有更多推荐了,返回首页