锯片检测示例

news2025/1/24 21:27:23

1.锯片检测

1.1 应用示例目的与思路

(1) 提取并筛选锯齿的轮廓;

(2) 对筛选后的锯齿轮廓进行直线拟合;

(3) 统计正常锯齿的角度和缺陷锯齿的个数。

1.2 应用示例相关算子介绍

(1) threshold_sub_pix(Image : Border : Threshold : )

功能:以亚像素精度提取图像中的分割线。

图形输入参数:Image:输入图像;

图形输出参数:Border:提取到的XLD轮廓;

控制输入参数:Threshold:阈值。

(2) segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )

功能:将XLD轮廓分割为线段和圆弧或椭圆弧。

图形输入参数:Contours:输入轮廓;

图形输出参数:ContoursSplit:分割后的轮廓;

控制输入参数1:Mode:轮廓分割模式,Default value: 'lines_circles';

控制输入参数2:SmoothCont:用于平滑轮廓点的个数;

控制输入参数3:MaxLineDist1:轮廓和近似线之间的最大距离(第一次迭代);

控制输入参数4:MaxLineDist2:轮廓和近似线之间的最大距离(第二次迭代)。

(3) union_adjacent_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, Mode : )

功能:合并相邻的轮廓。

图形输入参数:Contours:输入轮廓;

图形输出参数:UnionContours:合并后的轮廓;

控制输入参数1:MaxDistAbs:相邻轮廓端点的最大距离;

控制输入参数2:MaxDistRel:相邻轮廓端点相对于较长轮廓长度的最大距离,Default value: 1.0;

控制输入参数3:Mode:描述轮廓属性处理的模式。

(4) get_contour_global_attrib_xld(Contour : : Name : Attrib)

功能:返回XLD轮廓的全局属性值。

图形输入参数:Contours:输入轮廓;

控制输入参数:Name:属性名;

控制输出参数:Attrib:属性值。

(5) sort_contours_xld(Contours : SortedContours : SortMode, Order, RowOrCol : )

功能:根据轮廓的相对位置对轮廓进行排序。

图形输入参数:Contours:输入轮廓;

图形输出参数:SortedContours:排序后的轮廓;

控制输入参数1:SortMode:排序模式;

控制输入参数2:Order:升序或降序排列;

控制输入参数3:RowOrCol:排序条件。 'row':按行坐标对轮廓进行排序,如果行坐标相同,则按列坐标对轮廓进行排序。

(6) fit_line_contour_xld(Contours : : Algorithm, MaxNumPoints, ClippingEndPoints, Iterations, ClippingFactor : RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)

功能:通过线段近似XLD轮廓(拟合直线)。

图形输入参数:Contours:输入轮廓;

控制输入参数1:Algorithm:直线拟合的算法;

控制输入参数2:MaxNumPoints:用于计算的最大轮廓点数(所有点为-1),

Default value: -1;

控制输入参数3:ClippingEndPoints:拟合要忽略的等高线起点和终点的点数,Default value: 0;

控制输入参数4:Iterations:最大迭代次数;

控制输入参数5:ClippingFactor:用于消除异常值的剪裁因子(典型值:Huber和Drop为1.0,Tukey为2.0),Default value: 2.0;

控制输出参数1:(RowBegin, ColBegin):直线起点坐标;

控制输出参数2:(RowEnd, ColEnd):直线终点坐标;

控制输出参数3:(Nr, Nc):法向量坐标;

控制输出参数4:Dist:原点到直线的距离。

(7) line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi)

功能:计算直线的方向角度。

控制输入参数1:(RowBegin, ColBegin):直线起点坐标;

控制输入参数2:(RowEnd, ColEnd):直线终点坐标;

控制输出参数3:Phi:直线的方向角度。

(8) set_tposition( : : WindowHandle, Row, Column : )

功能:设置文本光标的位置。

控制输入参数1:WindowHandle:窗口句柄;

控制输入参数2:(Row, Column):文本光标的位置。

(9) write_string( : : WindowHandle, String : )

功能:从输出窗口的当前光标位置开始打印文本。

控制输入参数1:WindowHandle:窗口句柄;

控制输入参数2:String:待打印的字符串。

1.3 应用示例示例代码


*读取图片
read_image (Image, './saw_blade.png')
*获取图片的宽和高
get_image_size(Image, Width, Height)
*提取锯片图像的亚像素精度的轮廓
threshold_sub_pix (Image, Border, 128)
*将XLD轮廓分割为线段和圆弧或椭圆弧。
segment_contours_xld (Border, ContoursSplit1, 'lines_circles', 5, 4, 2)
union_adjacent_contours_xld (ContoursSplit1, UnionContours1, 0.1, 0.1, 'attr_keep')
*筛选处锯齿的轮廓
select_shape_xld (UnionContours1, SelectedContours1, 'contlength', 'and', 550, 1000)
*将XLD轮廓分割为线段和圆弧或椭圆弧
segment_contours_xld (SelectedContours1, ContoursSplit2, 'lines_circles', 5, 4, 2)
*去除锯齿间空隙处的圆弧
count_obj (ContoursSplit2, Number1)
gen_empty_obj(ToothSides)
count_circle_arcs:=0

for index1 :=1 to Number1 by 1
    select_obj (ContoursSplit2, SelectedContour1, index1)
    get_contour_global_attrib_xld (SelectedContour1, 'cont_approx', Attrib)
    if(Attrib==-1)  //线段:Attrib=-1;
        concat_obj (ToothSides, SelectedContour1, ToothSides)
    elseif(Attrib==1) //圆弧:Attrib=1
        count_circle_arcs:=count_circle_arcs+1
    endif  
endfor

sort_contours_xld (ToothSides, ToothSidesSorted, 'upper_left', 'true', 'column')
union_adjacent_contours_xld (ToothSidesSorted, UnionContours2, 0.1, 0.1, 'attr_keep')
length_xld (UnionContours2, Length)
*筛选处锯齿的轮廓
select_shape_xld (UnionContours2, SelectedContours2, 'contlength', 'and', 40, 1000)
count_obj (SelectedContours2, Number2)
Saw_Angle_Tuple:=[]

for index2:=1 to Number2 by 1
    select_obj (SelectedContours2, SelectedContour2, index2)
    segment_contours_xld (SelectedContour2, ContoursSplit3, 'lines_circles', 5, 4, 2)
    fit_line_contour_xld (ContoursSplit3, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
    line_orientation (RowBegin, ColBegin, RowEnd, ColEnd, Phi)
    tuple_deg (Phi, Deg)
    for i := 0 to |Deg|-2 by 1
        if(Deg[i]<0 and Deg[i+1]>0)
            Saw_Angle:= 180.0+Deg[i]-Deg[i+1]
            Saw_Angle_Tuple:=[Saw_Angle_Tuple,Saw_Angle]
        endif     
    endfor     
endfor

tuple_min (Saw_Angle_Tuple, Min_Saw_Angle)
tuple_max (Saw_Angle_Tuple, Max_Saw_Angle)
*关闭窗口
dev_close_window ()
*打开指定窗口的大小
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_display (SelectedContours2)
*字符的显示
set_tposition (WindowHandle, 10, 5)  //设置文本1光标的位置
write_string (WindowHandle, ['锯齿形状缺陷的个数:',count_circle_arcs*2,'个'])
set_tposition (WindowHandle, 30, 5)  //设置文本2光标的位置
write_string (WindowHandle, ['正常锯齿角度的最小值:',Min_Saw_Angle,'°'])
set_tposition (WindowHandle, 50, 5)  //设置文本3光标的位置
write_string (WindowHandle, ['正常锯齿角度的最大值:', Max_Saw_Angle,'°'])

结果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/998361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应用开发平台集成工作流系列之10——流程建模功能环节业务逻辑处理的设计与实现

背景 基于工作流的表单流转&#xff0c;在某些特定的环节&#xff0c;需要执行一些业务逻辑处理。例如动态分配节点处理人、发送邮件或短信给待办用户、统计流程处理时长判断是否超时&#xff0c;以及业务层面数据处理&#xff08;例如&#xff0c;在请假流程中将部门领导审批…

Unity之Android项目的打包

一 Unity里面配置Android运行环境 1.1 首先unity需要集成android编译环境&#xff0c;点击FIle->Build Settings 1.2 没是否有Android模块&#xff0c;没的话先下载Android模块 1.3 按下面的操作&#xff0c;下载Android支持&#xff0c;SDK&#xff0c;NDK&#xff0c;和J…

15 - 多线程调优(上):哪些操作导致了上下文切换?

1、初识上下文切换 我们首先得明白&#xff0c;上下文切换到底是什么。 其实在单个处理器的时期&#xff0c;操作系统就能处理多线程并发任务。处理器给每个线程分配 CPU 时间片&#xff08;Time Slice&#xff09;&#xff0c;线程在分配获得的时间片内执行任务。 CPU 时间…

【图解RabbitMQ-6】说说交换机在RabbitMQ中的四种类型以及使用场景

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

自然语言处理: 第十二章LoRA解读

论文地址:[2106.09685] LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org) 理论基础 自从GPT-3.5问世以来&#xff0c;整个AI界基本都走向了大模型时代&#xff0c;而这种拥有数亿参数的大模型对于普通玩家来说作全量微调基本是不可能的事。从而微软公司提出了…

指令延迟隐藏

一、指令延迟隐藏 1. 延迟和延迟隐藏 指令延迟指计算指令从调度到指令完成所需的时钟周期如果在每个时钟周期都有就绪的线程束可以被执行&#xff0c;此时GPU处于满符合状态指令延迟被GPU满负荷计算状态所掩盖的现象称为延迟隐藏延迟隐藏对GPU编程开发很重要&#xff0c;GPU设…

BeanFactory 和 FactoryBean傻傻分不清楚

&#x1f935;‍♂️ 个人主页&#xff1a;香菜的个人主页&#xff0c;加 ischongxin &#xff0c;备注csdn ✍&#x1f3fb;作者简介&#xff1a;csdn 认证博客专家&#xff0c;游戏开发领域优质创作者,华为云享专家&#xff0c;2021年度华为云年度十佳博主 &#x1f40b; 希望…

HTTPS双向认证

双向认证&#xff0c;指的是客户端和服务器端都需要验证对方的身份&#xff0c;在建立HTTPS连接的过程中&#xff0c;握手的流程相对于单向认证多了几步。 单向认证的过程&#xff0c;客户端从服务器端下载服务器端公钥证书进行验证&#xff0c;然后建立安全通信通道。 双向通信…

java的数据类型与变量(超详细每个都有小结论,习题巩固)

【本文章的目标】 1.字面常量 2.数据类型 3.变量 文章最后有习题等来帮助巩固&#xff0c;加深印象&#xff0c;相信看完这篇文章&#xff0c;大家会有收获 1.字面常量 在上节课HelloWorld程序中&#xff0c;System.Out,println(Hello World"); 语句&#xff0c;不论…

算法[动态规划]---买卖股票最佳时机

1、题目&#xff1a; 给你一个整数数组 prices&#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候最多只能持一股股票。你也可以先购买&#xff0c;然后在同一天出售。 返回你能获得的最大利润 。 2…

PLSQL

文章目录 基本pl/sql语法流程控制条件判断&#xff08;两种&#xff09;循环结构&#xff08;三种&#xff09;goto&#xff0c;exit关键字 游标的使用异常的处理存储过程&#xff08;无返回值&#xff09;&#xff0c;存储函数&#xff08;有返回值&#xff09;触发器 命令行窗…

苹果手机远程控制安卓手机,为什么不能发起控制?

这位用户想要用iOS设备远程控制安卓设备&#xff0c;在被控端安装好AirDroid之后&#xff0c;就在控制端的苹果手机上也安装了AirDroid&#xff0c;然而打开控制端的软件&#xff0c;却没有在手机界面上看到【远程控制】按钮&#xff0c;于是提出了以上疑问。 解答 想要让iOS设…

A,B,C , D, E类地址的划分及子网划分汇总的详解

一、 A类地址 &#xff08;1&#xff09;A类地址第1字节为网络地址&#xff0c;其它3个字节为主机地址。它的第1个字节的第一位固定为0. &#xff08;2&#xff09;A类地址范围&#xff1a;1.0.0.1—126.255.255.254 &#xff08;3&#xff09;A类地址中的私有地址和保留地…

苹果电脑快捷键集合

苹果电脑Windows系统下的ALT键是组合键。苹果电脑键盘左下角的Fnoption是Windows的alt键。同时按下两个键是ALT键的功能。在非组合状态下&#xff0c;单独按Option键。 补充&#xff1a; 1. 按controlalt&#xff08;选项&#xff09;delete 启动任务管理器。 2. Option-Del…

nrf52832 使用ADC点LED

#define SAMPLES_IN_BUFFER 5 volatile uint8_t state 1;/*** brief UART events handler.*/void saadc_callback(nrf_drv_saadc_evt_t const * p_event) { // }//saadc的初始化 void saadc_init(void) {ret_code_t err_code;nrf_saadc_channel_config_t channel_config NR…

C#,数值计算——柯西微分(Cauchy deviates)的计算方法与源代码

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Cauchy deviates /// </summary> public class Cauchydev : Ran { private double mu { get; set; } private double sig { get; set; } public…

C++ -- 学习系列 static 关键字的使用

static 是 C 中常用的关键字&#xff0c;被 static 修饰的变量只会在 静态存储区&#xff08;常量数据也存放在这里&#xff09; 被分配一次内存&#xff0c;生命周期与整个程序一样&#xff0c;随着程序的消亡而消亡。 一 static 有以下几种用法&#xff1a; 1. 在文件中定义…

管理类联考——数学——汇总篇——知识点突破——应用题——交叉比例法/杠杆原理

读书笔记 甲有&#xff1a;x个a&#xff0c;乙有&#xff1a;y个b&#xff0c;甲乙的平均值为c&#xff0c;根据总数相等&#xff0c;得&#xff1a;axbyc(xy)&#xff0c;即ax-cxcy-by&#xff0c;则 x y c − b a − c \frac{x}{y}\frac{c-b}{a-c} yx​a−cc−b​ &#…

【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

文章目录 1. 前言2. initState函数分析3. 初始化props3.1 规范化数据3.2 initProps函数分析3.3 validateProp函数分析3.4 getPropDefaultValue函数分析3.5 assertProp函数分析 4. 初始化methods5. 初始化data6. 初始化computed6.1 回顾用法6.2 initComputed函数分析6.3 defineC…

rv1126之isp黑电平(BLC)校准!

前言&#xff1a; 大家好&#xff0c;今天我们继续来讲解isp第二期内容&#xff0c;这期内容主要分三个部分&#xff1a; 1、tunning的工作流程 2、利用RKISP2.x_Tuner来创建tunning工程&#xff0c;并连接上rv1126开发板进行抓图 3、BLC(黑电平校准)的原理和校准方法以及实战…