Halcon学习笔记2

模板匹配+测量模型

cpp 复制代码
*模板匹配+测量模型
*===========模板匹配================
*获取窗口句柄
dev_get_window (WindowHandle)
*创建窗口句柄
*dev_open_window (0, 0, 512, 512, 'black', WindowHandle1)
read_image (Image, '1.jpg')
rgb1_to_gray (Image, GrayImage)
*形状模型路径
shapePath:='shape.xyz'

*判断模型是否存在
file_exists (shapePath, FileExists)
if (FileExists)
    *读取形状模型
    read_shape_model (shapePath, ModelID)
    
else
    *文件不存在,创建模型(难)
    
    *创建ROI
    
     stop ()
    draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
    gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
    reduce_domain (GrayImage, Rectangle, ImageReduced)
    crop_domain (ImageReduced, ImagePart)
    *注意:最后的模型ID要保持一致
     create_shape_model (ImagePart, 'auto', 0, 6.28, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
    *存储形状模型
     write_shape_model (ModelID, shapePath)
     
endif
*========测量模型==========================================
metPath:='met.ccb'
file_exists (metPath, FileExists1)

if (FileExists1)
    *读取测量模型
    read_metrology_model (metPath, MetrologyHandle)
else
    *1.创建测量模型
    create_metrology_model (MetrologyHandle)
     *通过代码获取图像的宽高
    *read_image (Image, '1.jpg')
    *get_image_size (Image, Width, Height)
    *set_metrology_model_image_size (MetrologyHandle, Width, Height)
   
    *2.设置图像模型的图像大小(可选,使用会提高模型性能)
    set_metrology_model_image_size (MetrologyHandle, 1920, 1080)
    *3.创建测量模型的ROI(多个)
    *左侧直线0
    stop ()
    draw_line (WindowHandle, Row11, Column11, Row2, Column2)
    gen_region_line (RegionLines, Row11, Column11, Row2, Column2)
    add_metrology_object_line_measure (MetrologyHandle, Row11, Column11, Row2, Column2, 20, 5, 1, 30, [], [], Index)
    *右侧直线1
    draw_line (WindowHandle, Row12, Column12, Row21, Column21)
    gen_region_line (RegionLines1, Row12, Column12, Row21, Column21)
    add_metrology_object_line_measure (MetrologyHandle, Row12, Column12, Row21, Column21, 20, 5, 1, 30, [], [], Index1)
    *圆2
    draw_circle (WindowHandle, Row3, Column3, Radius)
    gen_circle (Circle, Row3, Column3, Radius)
    add_metrology_object_circle_measure (MetrologyHandle, Row3, Column3, Radius, 20, 5, 1, 30, [], [], Index2)
      
    write_metrology_model (MetrologyHandle, metPath)
    
endif

*4.修改模型/对象参数(选做)
    read_image (Image2, '1.jpg')
    rgb1_to_gray (Image2, GrayImage2)
    find_shape_model (GrayImage2, ModelID, 0, rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row4, Column4, Angle1, Score1)
    set_metrology_model_param (MetrologyHandle, 'reference_system', [Row4, Column4, Angle1])
    *set_metrology_object_param (ModelID, 'all', 'num_instances', 1)
*========循环遍历图片================================
*显示模板匹配的轮廓(contours)
get_shape_model_contours (ModelContours, ModelID, 1)
*加粗轮廓
dev_set_line_width (5)
*设置颜色
*只能设置一个颜色
*dev_set_color
*设置多个颜色3,6,12
dev_set_colored (12)

for i := 1 to 4 by 1
    imgName:=i+'.jpg'
    read_image (Image1, imgName)
    rgb1_to_gray (Image1, GrayImage1)
    find_shape_model (GrayImage1, ModelID,0, rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Score)
    
    *显示形状模型匹配的轮廓(别记:C#无法使用)
    *dev_display_shape_matching_results (ModelID, 'red', Row1, Column1, Angle, 1, 1, 0)
    *仿射变换实现形状模型匹配轮廓的展示
    *创建一个齐次矩阵
    hom_mat2d_identity (HomMat2DIdentity)
    *在齐次矩阵上创建平移矩阵
    hom_mat2d_translate (HomMat2DIdentity,Row1, Column1,  HomMat2DTranslate)
    *在平移矩阵的基础上创建旋转矩阵
    hom_mat2d_rotate (HomMat2DTranslate, Angle, Row1, Column1, HomMat2DRotate)
    *在旋转矩阵基础上创建缩放矩阵
    *hom_mat2d_scale (HomMat2DRotate, 2, 2, Row1, Column1, HomMat2DScale)
    *应用矩阵到xxx上
    *轮廓
    affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DRotate)
    *图像
    *affine_trans_image
    *多边形
    *affine_trans_polygon_xld
    *区域
    *affine_trans_region
    *======测量模型的5-7步=================================
    *5.模板匹配对齐
    *先模板匹配再对齐
    align_metrology_model (MetrologyHandle,Row1, Column1, Angle)  
    *6应用模型
    apply_metrology_model (GrayImage1, MetrologyHandle)
    *7获得结果
    
    *ROI真实轮廓
    get_metrology_object_result_contour (LLine, MetrologyHandle, 0, 'all', 1.5)
    get_metrology_object_result_contour (RLine, MetrologyHandle, 1, 'all', 1.5)
    get_metrology_object_result_contour (Yuan, MetrologyHandle, 2, 'all', 1.5)
    *获取真实参数
    get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', LLineP)
    get_metrology_object_result (MetrologyHandle, 1, 'all', 'result_type', 'all_param', RLineP)
    get_metrology_object_result (MetrologyHandle, 2, 'all', 'result_type', 'all_param', YuanLineP)
    
    *8.根据参数计算结果
    *angle_ll线和线的夹角
    *angle_lx线和水平线的夹角
    *distance_pp点和点的距离
    *distance_pl点到线的距离
    *distance_ss线段到线段的距离
    distance_pl (LLineP[0],LLineP[1], RLineP[0], RLineP[1],RLineP[2], RLineP[3], Distance)
    
    
    
    *循环前给个提示
    if (i<4)
    disp_continue_message (WindowHandle, 'black', 'true')
    endif
    *显示当前第几张
    dev_disp_text ('当前第'+i+'张,还剩'+(4-i)+'张', 'window',0, 0, 'black', [], [])
    stop ()
    
endfor

*释放形状模型
clear_shape_model (ModelID)
*释放测量模型
clear_metrology_model (MetrologyHandle)
相关推荐
彭军辉1 小时前
生命体AI和数字生命有什么区别
人工智能
Rauser Mack1 小时前
AI大模型测评:GPT-5.5翻车、Claude封神——大模型选型的真相
人工智能·gpt·prompt
2601_961946081 小时前
AI API 网关实战:从单 Key 管理到企业级多租户架构
大数据·人工智能·金融·架构·api·个人开发
AI-好学者1 小时前
GraphRAG与混合检索架构
人工智能·知识图谱
YUS云生2 小时前
Python学习笔记·第31天:FastAPI入门——路由、路径参数、查询参数与请求体
笔记·python·学习
智写-AI2 小时前
真实有效的免费降英文AI工具服务商
人工智能·python
大鹏的NLP博客2 小时前
深度学习模型部署一致性验证规范
人工智能·深度学习
土星云SaturnCloud2 小时前
边缘计算驱动绿氢生产过程智能寻优:电解槽级实时优化技术解析
服务器·人工智能·ai·边缘计算