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)
相关推荐
Setsuna_F_Seiei3 小时前
前端的 AI 学习之路 02 之 Provider 与 Structured Output - 规范化模型输入输出
人工智能·agent·ai编程
JavaPub-rodert3 小时前
王仕宇RAG 实战教程(二):从 0 搭建一个可运行的 RAG 知识库——Embedding、Qdrant 与问答实战
人工智能·embedding
Setsuna_F_Seiei3 小时前
前端的 AI 学习之路 01 之 Agent API 调用 - 和 Agent 的基础对话
前端·人工智能·ai编程
kkkkkkkkkk_Z3 小时前
学嵌入式和C语言编程数据结构|学习日记Day22:栈,二叉树,哈希存储
c语言·数据结构·学习
咔咔学姐kk4 小时前
小白程序员必收藏:轻松入门AI Agent开发,大厂校招新风口!
人工智能·深度学习·ai·程序员·大模型·就业·大模型学习
2601_967097224 小时前
园区巡检机器人推荐:4项评估维度与主流产品横评
大数据·人工智能·信息可视化
Wang's Blog4 小时前
PostgreSQL笔记60: 权限与角色管理——从层级体系到最佳实践
数据库·笔记·postgresql
stuartevil4 小时前
零基础怎么用AI文生漫剧做出一条完整视频
人工智能·音视频
极客猴子5 小时前
能提取抖音视频文案的APP推荐:短视频文案工具合集
人工智能·智能手机·音视频·语音识别
sel_95 小时前
【强化学习】Hands-on Modern RL项目实践|OPD 算法完整解析
人工智能·深度学习·算法·机器学习·语言模型