直线、圆、椭圆的相关几何参数测量

文章来源于

https://cloud.tencent.com/developer/article/1474495

==========================================================

MeasureLength2=3时,

代码:

复制代码
  1 *公众号:机器视觉那些事儿
  2 *1. 算法功能:测量钻石边缘的夹角
  3 *2. 算法思路:
  4 *      (1)初始化*             
  5 *读图,提取ROI区域图像*             
  6 *创建测量线模型*             
  7 *设置测量ROI,设置计量模型参考坐标系
  8 *      (2)应用计量对象,得到测量结果
  9 *             *显示初始化
 10 *             *将当前测量对象与计量模型对齐
 11 *             *应用计量对象模型
 12 *             *得到计量结果
 13 *             *计算夹角
 14 *      (3)结果显示
 15 *             *可视化轮廓线
 16 *             *可视化线夹角圆弧
 17 *             *可视化测量区域
 18 * --------------- (1)初始化-----------------------
 19 *---------------显示初始化------------
 20 * 初始化显示参数
 21 dev_update_off ()
 22 dev_close_window ()
 23 read_image (Image, 'diamond/diamond_01')
 24 dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
 25 set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
 26 get_image_size (Image, Width, Height)
 27 *---------------创建测量线模型------------
 28 * 创建计量模型数据结构
 29 create_metrology_model (MetrologyHandle)
 30 *图像大小是预先设置的,以加快第一次调用apply_metrology_modelset_metrology_model_image_size (MetrologyHandle, Width, Height)
 31 * 确定计量线对象的参数
 32 LineRow1 := [155,155]
 33 LineColumn1 := [400,400]
 34 LineRow2 := [290,290]
 35 LineColumn2 := [230,570]
 36 Tolerance := 20
37 * * 增加两个线模型,并设置参数 38 add_metrology_object_line_measure (MetrologyHandle, LineRow1, LineColumn1, LineRow2, LineColumn2, Tolerance, 10, 1, 20, [], [], Index1) 39 *---------------设置测量ROI,设置计量模型参考坐标系------------ 40 * 创建匹配感兴趣区域 41 gen_rectangle1 (Rectangle, LineRow1[0] - 40, LineColumn1[0] - 50, LineRow1[0] + 20, LineColumn1[0] + 50) 42 *更改计量模型的参考坐标系 43 reduce_domain (Image, Rectangle, ImageReduced) 44 threshold (ImageReduced, Region, 128, 255) 45 get_region_points (Region, Rows, Columns) 46 set_metrology_model_param (MetrologyHandle, 'reference_system', [Rows[0],Columns[0],0]) 47 * * 主循环* 48 for I := 1 to 5 by 1 49 *---------------(2)应用计量对象,得到测量结果------------ 50 *读图,提取ROI区域图像 51 read_image (Image, 'diamond/diamond_' + I$'02') 52 * 粗略地分割钻石顶部位置 53 reduce_domain (Image, Rectangle, ImageReduced) 54 threshold (ImageReduced, Region, 128, 255) 55 *将当前测量对象与计量模型对齐 56 *提取钻石顶部区域点坐标 57 get_region_points (Region, Rows, Columns) 58 *将当前测量对象对齐计量模型 59 *在应用apply_metrology_model之前需要调用此算子 60 align_metrology_model (MetrologyHandle, Rows[0], Columns[0], 0) 61 *应用计量对象模型 62 * 定位计量对象的边缘 63 apply_metrology_model (Image, MetrologyHandle) 64 *得到计量结果 65 *获取两条线的始终坐标 66 get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', LineParameter) 67 *计算夹角 68 *计算两条线之间的夹角 69 angle_ll (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], LineParameter[4], LineParameter[5], LineParameter[6], LineParameter[7], Angle) 70 Angle := deg(Angle) 71 * --------------- (3)结果显示----------------------- 72 *可视化轮廓线 73 * 得到结果线轮廓 74 get_metrology_object_result_contour (ResultContour, MetrologyHandle, 'all', 'all', 1.5) 75 *计算线交点 76 intersection_lines (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], LineParameter[4], LineParameter[5], LineParameter[6], LineParameter[7], Row, Column, IsOverlapping1) 77 * 计算两条线的方向 78 line_orientation (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], Orientation1) 79 if (Orientation1 > 0) 80 Orientation1 := Orientation1 - rad(180) 81 endif 82 line_orientation (LineParameter[4], LineParameter[5], LineParameter[6], LineParameter[7], Orientation2) 83 * *可视化线夹角 84 * 可视化两条线之间的角度 85 *生成线之间的夹角圆弧 86 gen_circle_contour_xld (ContCircle, Row, Column, 100, Orientation1, Orientation2, 'positive', 1) 87 *可视化测量区域 88 *获取到测量区域和测量点 89 get_metrology_object_measures (Contour, MetrologyHandle, 'all', 'all', MRow, MColumn) 90 gen_cross_contour_xld (Cross, MRow, MColumn, 6, rad(45)) 91 * 显示所有内容 92 dev_display (Image) 93 dev_set_line_width (1) 94 dev_set_color ('yellow') 95 dev_display (Contour) 96 dev_display (Cross) 97 dev_set_line_width (2) 98 dev_set_color ('green') 99 dev_display (ResultContour) 100 dev_set_color ('blue') 101 dev_display (ContCircle) 102 disp_message (WindowHandle, 'Angle = ' + Angle$'.5' + '°', 'window', 12, 12, 'black', 'true') 103 if (I < 5) 104 disp_continue_message (WindowHandle, 'black', 'true') 105 endif 106 stop () 107 endfor 108 * 释放内存 109 clear_metrology_model (MetrologyHandle)
复制代码

算子学习:

增加直线对象到计量模型中

add_metrology_object_line_measure( : : MetrologyHandle, RowBegin, ColumnBegin, RowEnd, ColumnEnd, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)

MetrologyHandle:计量模型,使用create_metrology_model创建。

RowBegin,ColumnBegin, RowEnd, ColumnEnd:直线的起始和终止坐标

MeasureLength1:垂直于绿色线的黄色辅助线的一般的长度

MeasureLength2:小于MeasureLength1,太小后续会呈现一个个单独的矩形框,见上图3

MeasureSigma:

MeasureThreshold:最小边缘阈值

未完待续

 

posted @   ken0137  阅读(566)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示