2018年认证杯SPSSPRO杯数学建模C题(第二阶段)机械零件加工过程中的位置识别全过程文档及程序

2018年认证杯SPSSPRO杯数学建模

基于轮廓提取与图像配准的零件定位问题研究

C题 机械零件加工过程中的位置识别

原题再现:

  在工业制造自动生产线中,在装夹、包装等工序中需要根据图像处理利用计算机自动智能识别零件位置,并由机械手将零件自动搬运到特定位置。某零件轮廓如图 1 所示,图2 表示零件搬运前后的位置示意图。
  第二阶段问题:
  3. 题目给出了未经轮廓提取的原始零件图像数据 (附件 DATA3),请采用或自主设计合适的轮廓提取算法,验证前两问中建立的优化模型是否同样适用。
  4. 问题 1 至问题 3 讨论的是零件放置于平面的情况。假设零件放置在不平整的表面上,请建立有效的数学模型,识别不同零件的位置 (开放性问题,自主设计)。

在这里插入图片描述
在这里插入图片描述

整体求解过程概述(摘要)

  在本文中,我们主要对工业生产中零件的轮廓提取和当零件放置于不平整的表面上时的定位问题进行了研究。
  本文的主要创新点:首先我们研究了提取零件轮廓的算法,提出了通过 Canny 和watershed 算法相结合的适用范围较广并且效果相对较好的轮廓提取算法,在三维情况下,我们通过将基准图片与实际的图片进行配准,并通过基准坐标获取实际坐标的方式,在兼顾效率的同时实现了三维空间较好的定位算法。以下是我们主要完成的工作:
  对于轮廓提取问题,需要考虑零件的内部轮廓是否对结果有影响,如果没有影响,使用 watershed 算法对零件的外部轮廓进行提取;当存在影响时,则采取改进的 Canny算法同时对内部和外部轮廓进行提取;两种方法各有利弊,watershed 提取的轮廓信息不全,适用领域有限,而 Canny 算法提取的零件边缘往往有较多的噪声,我们将二者相结合从而实现适用范围更广,效果更好的算法。当轮廓提取完成后,通过寻找关键点的方式可以计算出零件的坐标,以题目中给出的四个齿轮中最大的一个为例,由于其本身存在的对称性,我们提取其几何中心,内部的长方形与其外轮廓一侧的两个交点作为其坐标,当移动该齿轮时,只需要将这三个点的位置放到目标位置上即可完成操作,最终得到的结果为(342, 159), (350, 126), (496.5, 232.0)。
  当零件放置于不平整的表面时,仅通过一张图片很难得到想要的信息,所以要解决这个问题,需要至少两张图片,通过 SURF 算法对这两张图片进行图像配准,并且计算出两张图片中零件的变换矩阵,假设对于机械臂所到达的每一个位置,我们有其基准的位置坐标,通过这些基准坐标,加上通过变换所得到的基准图像中的关键点的坐标最终得到目标零件的坐标信息。我们的结果具有较好的泛化能力,不仅能处理不考虑高度的二维坐标,对于三维坐标也同样适用。
  在对模型进行介绍和求解之后,我们对其进行了评价,分析了其优缺点,并对潜在的应用场景进行了探讨。

问题分析:

  本阶段的题目主要分为两个大问题以及四个子问题,首先是在假设平面平整的前提下,为所的零件俯视图像中零件的识别与轮廓的提取算法的设计,这其中需要预先对图像进行预处理以保证轮廓算法的高效与精准;其次是考虑更为复杂的情况,即平明不平整的前提下,建立数学模型识别不同零件的位置,在识别位置之前首先要考虑三维空间转二维空间物体发生的形变并对这种形变进行转换与处理。
  问题三的具体分析
  问题三给出了一个未经轮廓提取的原始零件图像数据,经过图像查看为四个齿轮的图像。与第一阶段的问题一和二中的正方形与三个异构圆孔明显不同,虽然齿轮整体是一个对称的零件,但是由于其边缘呈现锯齿形状,在零件抓取与定位的过程中对齿轮的边缘细节的提取要求较高。
  首先,需要对图像进行预处理,将彩色的图像数据降低维度,进而对图像进行灰度及二值换处理。并且需要对图像进行滤波、去噪等预处理,以便后期高效的处理。
  其次,可根据分水岭算法及形态学等对预处理过的图像进行齿轮外轮廓的提取,因仅提取齿轮的外轮廓,则可进行多种处理。其中需注意,因左、上、右三个齿轮咬合较为紧密,在数据分割时难免会造成咬合部分轮廓的缺失,若发生此类情况,需根据齿轮的特性进行整个齿轮外径轮廓的补全。
  最后,因仅根据外形轮廓无法支持对定位的要求,还需要得到内径及孔洞的轮廓数据信息,可根据 Canny 算法对整体的所有齿轮的所有孔洞及内外径进行整体的轮廓提取,并且将整体轮廓与上一步的加强外径轮廓进行融合,将得到非常明显且精准的平面内多零件的整体清晰轮廓图像数据。
在这里插入图片描述
  问题四的具体分析
  问题四的情况则更为复杂,因前三个问题均发生在平整平面内,即仅 x 与 y的坐标发生位移,即仅在二维坐标内发生位移。但如整体的情况为非平整平面,则零件会在 z 轴也发生位移,即零件会在三维空间内发生位移及旋转。虽然零件在三维空间内发生了旋转,但从摄像机的俯视角度,仅能看到二维形状发生的形变,这将为计算位移与旋转角度带来极大的困难。
在这里插入图片描述
  因此,将采用对空间及尺寸变换不敏感的算法,如 surf 算法对基准图像与现有零件放置图像进行图像配准,通过两个图像特征值的配准的过程求得三维空间内的转换矩阵,由矩阵数据可求得两个零件在三维空间内的相对位移。最终零件当前的位置可由基准位置的坐标及相对位移求得。

模型假设:

  假设 1:附件提供的零件位置数据在可靠条件下获得,光照稳定、无明显抖动,摄像机摄像效果良好;
  假设 2:零件的结构标准,即在单一齿轮中锯齿结构相同;
  假设 3:多个零件在平台上的摆放并没有重叠;
  假设 4:针对问题三情况,物体摆放平整,且图像数据均为俯视图。
  假设 5:针对问题四情况,物体虽然放置在不平整的平面,会发声一定的倾斜,但非进行视角转换,并未进行轴旋转类空间形变。并且有基准位置的图片库。

论文缩略图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

clear all;
clear
clc;
%读进图像
[filename, pathname] = uigetfile({'*.jpg'; '*.bmp'; '*.gif'}, '选择图片');
%没有图像
if filename == 0return;
end
imgsrc = imread([pathname, filename]);
[y, x, dim] = size(imgsrc);
%转换为灰度图
if dim>1imgsrc = rgb2gray(imgsrc);
end
for i = 1:10imgsrc = medfilt2(imgsrc);
end
sigma = 1;
gausFilter = fspecial('gaussian', [3,3], sigma);
img= imfilter(imgsrc, gausFilter, 'replicate');
zz = double(img);
%----------------------------------------------------------
%自己的边缘检测函数?
[m theta sector canny1 canny2 bin] = canny1step(img, 22);
[msrc thetasrc sectorsrc c1src c2src binsrc] = canny1step(imgsrc, 22);
%Matlab 自带的边缘检测?
ed = edge(img, 'canny', 0.5); 
[xx, yy] = meshgrid(1:x, 1:y);
m = uint8(m);
figure(1)imshow(m)imwrite(m, '无二值化.jpg')
m = imbinarize(m);
for i = 1:2m = medfilt2(m);
end
figure(2)imshow(m);imwrite(m, '二值化.jpg')save image.mat
function [ m, theta, sector, canny1, canny2, bin] = canny1step( src, 
lowTh)
%canny 函数第一步,求去 x,y 方向的偏导,模板如下:
% Gx
% 1 -1
% 1 -1
% Gy
% -1 -1
% 1 1
%------------------------------------
% 输入:
% src:图像,如果不是灰度图转成灰度图
% lowTh:低阈值
% 输出:
% m: 两个偏导的平方差,反映了边缘的强度
% theta:反映了边缘的方向
% sector:将方向分为 3 个区域,具体如下
% 2 1 0
% 3 X 3
% 0 1 2
% canny1:非极大值
% canny2:双阈值抑制
% bin : 二值化
%---------------------------------------
[Ay Ax dim ] = size(src);
%转换为灰度图
if dim>1src = rgb2gray(src);
end
src = double(src);
m = zeros(Ay, Ax); 
theta = zeros(Ay, Ax);
sector = zeros(Ay, Ax);
canny1 = zeros(Ay, Ax);%非极大值抑制
canny2 = zeros(Ay, Ax);%双阈值检测和连接
bin = zeros(Ay, Ax);
for y = 1:(Ay-1)for x = 1:(Ax-1)gx = src(y, x) + src(y+1, x) - src(y, x+1) - src(y+1, x+1);gy = -src(y, x) + src(y+1, x) - src(y, x+1) + src(y+1, x+1);m(y,x) = (gx^2+gy^2)^0.5 ;%--------------------------------theta(y,x) = atand(gx/gy) ;
tem = theta(y,x);%--------------------------------if (tem<67.5)&&(tem>22.5)sector(y,x) = 0; elseif (tem<22.5)&&(tem>-22.5)sector(y,x) = 3; elseif (tem<-22.5)&&(tem>-67.5)sector(y,x) = 2; elsesector(y,x) = 1; end%-------------------------------- end 
end
%-------------------------
%非极大值抑制
%------> x
% 2 1 0
% 3 X 3
%y 0 1 2
for y = 2:(Ay-1)for x = 2:(Ax-1) if 0 == sector(y,x) %右上 - 左下if ( m(y,x)>m(y-1,x+1) )&&( m(y,x)>m(y+1,x-1) )canny1(y,x) = m(y,x);elsecanny1(y,x) = 0;endelseif 1 == sector(y,x) %竖直方向if ( m(y,x)>m(y-1,x) )&&( m(y,x)>m(y+1,x) )canny1(y,x) = m(y,x);elsecanny1(y,x) = 0;endelseif 2 == sector(y,x) %左上 - 右下if ( m(y,x)>m(y-1,x-1) )&&( m(y,x)>m(y+1,x+1) )canny1(y,x) = m(y,x);elsecanny1(y,x) = 0;end
elseif 3 == sector(y,x) %横方向if ( m(y,x)>m(y,x+1) )&&( m(y,x)>m(y,x-1) )canny1(y,x) = m(y,x);elsecanny1(y,x) = 0;endend end%end for x
end%end for y
%---------------------------------
%双阈值检测
ratio = 2;
for y = 2:(Ay-1)for x = 2:(Ax-1) if canny1(y,x)<lowTh %低阈值处理canny2(y,x) = 0;bin(y,x) = 0;continue;elseif canny1(y,x)>ratio*lowTh %高阈值处理canny2(y,x) = canny1(y,x);bin(y,x) = 1;continue;else %介于之间的看其 8 领域有没有高于高阈值的,有则可以
为边缘tem =[canny1(y-1,x-1), canny1(y-1,x), canny1(y-1,x+1);canny1(y,x-1), canny1(y,x), 
canny1(y,x+1);canny1(y+1,x-1), canny1(y+1,x), 
canny1(y+1,x+1)];temMax = max(tem);if temMax(1) > ratio*lowThcanny2(y,x) = temMax(1);bin(y,x) = 1;continue;elsecanny2(y,x) = 0;bin(y,x) = 0;
continue;endendend%end for x
end%end for y
end%end of function
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

本文会给大家介绍如何在WordPress上安装一个插件&#xff0c;实现将notion上写的文章自动同步到WordPress上&#xff0c;从而提高写作效率&#xff0c;接下来请跟随我的脚步一起来操作吧&#xff01; 一、插件安装 在WordPress后台添加新插件页面中搜索“notion”&#xff0c;…

小程序样例1:简单待办列表

基本功能&#xff1a; 显示所有待办列表&#xff08;点击不同的文本进行显示&#xff09; 没完成的待办 已完成的待办 新建待办test 清除待办foo 代码js文件&#xff1a; //index.js //获取应用实例 const app getApp(); Page({data: {todo: ,todos: [{"id": 1474…

【动态规划】【C++算法】741摘樱桃

作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 LeetCode741 摘樱桃 给你一个 n x n 的网格 grid &#xff0c;代表一块樱桃地&#xff0c;每个格子由以下三种数字的一种来表示&#xff1a; 0 表示这个格子是空的&#xff0c;所以你可以穿过它。 1 表…

【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?

状态模式是什么&#xff1f; 状态模式&#xff0c;也被称作状态对象模式&#xff0c;是一种行为设计模式。 当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了…

Spring Boot程序的打包与运行:构建高效部署流程

引言 在现代应用开发中&#xff0c;高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架&#xff0c;提供了方便的打包工具和内嵌式的Web服务器&#xff0c;使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…

MyBatisPlus学习笔记三-核心功能

接上篇&#xff1a; MyBatisPlus学习笔记二-CSDN博客 1、核心功能-IService开发基础业务接口 1.1、介绍 1.2、引用依赖 1.3、配置文件 1.4、用例-新增 1.5、用例-删除 1.6、用例-根据id查询 1.7、用例-根据ids查询 2、核心功能-IService开发复杂业务接口 2.1、实例-更新 3、…

【C语言】编译和链接深度剖析

文章目录 &#x1f4dd;前言&#x1f320; 翻译环境和运行环境&#x1f309;翻译环境 &#x1f320;预处理&#xff08;预编译&#xff09;&#x1f309;编译 &#x1f320;词法分析&#x1f320;语法分析 &#x1f309;语义分析&#x1f320;汇编 &#x1f309; 链接&#x1f…

KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)

文章目录 1、登录kubesphere平台2、redis部署分析3、redis容器启动代码4、kubesphere平台部署redis4.1、创建redis配置集4.2、创建redis工作负载4.3、创建redis服务 5、测试连接redis 在kubesphere平台上部署redis应用都是基于redis镜像进行部署的&#xff0c;所以所有的部署操…

[AI]文心一言出圈的同时,国外的ChatGPT-4.5最新资讯

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

Spring Cloud 微服务中 gateway 网关如何设置健康检测端点

主要是为了让 k8s 识别到网关项目已经就绪&#xff0c;但是又不想在里面通过 Controller 实现。因为在 Controller 中这样做并不是最佳实践&#xff0c;因为 Gateway 的设计初衷是专注于路由和过滤&#xff0c;而不是业务逻辑的处理。 在 Gateway 中配置健康检查端点可以通过以…

从零开始配置vim(Windows版)

事情是这样的&#xff0c;之前linux下vim用习惯了...然后就给自己win下vscode也装了个vim插件&#xff0c;用下来还是感觉不顺手&#xff0c;并且处理太多文本时有明显卡顿&#xff0c;于是乎自己配了下win版的vim。 不过好像也并不是从零开始的...初始基础版的.vimrc有copy他们…

多行SQL转成单行SQL

如下图所示 将以上多行SQL转成单行SQL 正则表达式如下 (?s)$[^a-zA-Z()0-9]*结果如下 灵活使用,也未必只能使用Sublime Text 提供了一个在线工具

【手撕C语言 第五集】分支和循环(下)

for循环 我们已经知道了while循环&#xff0c;但是我们为什么还要一个for循环呢&#xff1f; 首先来看看for循环的语法&#xff1a; 表达式1 表达式1为初始化部分&#xff0c;用于初始化循环变量的。 表达式2 表达式2为条件判断部分&#xff0c;用于判断循环时候终止。 表达式…

Kafka集群与可靠性

Kafka集群与可靠性 1.Kafka集群搭建实战 使用两台Linux服务器&#xff1a;一台192.168.182.137 一台192.168.182.138 安装kafka首先&#xff0c;我们需要配置java环境变量&#xff08;这里就略过了&#xff09; mkdir /opt/kafka #上传压缩包kafka_2.13-3.3.1.tgz并解压 ta…

006.Oracle事务处理

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

STM32407用汇顶的GT911触摸芯片调试实盘

这个配置很关键 代码 #include "stm32f4xx.h" #include "GT9147.h" #include "Touch.h" #include "C_Touch_I2C.h" #include "usart.h" #include "delay.h" #include "LCD.h" #incl…

旅游项目day03

1. 前端整合后端发短信接口 2. 注册功能 后端提供注册接口&#xff0c;接受前端传入的参数&#xff0c;创建新的用户对象&#xff0c;保存到数据库。 接口设计&#xff1a; 实现步骤&#xff1a; 手机号码唯一性校验&#xff08;后端一定要再次校验手机号唯一性&#xff09…

贯通用友T+与企企,引领企业数字化转型新篇章!

客户介绍&#xff1a; 某科技有限公司是一家专注于高端芯片研发和制造的高科技企业。自成立以来&#xff0c;该企业始终坚持以科技创新为核心&#xff0c;致力于为全球客户提供高性能、高品质的芯片解决方案。公司拥有一支由业内资深专家和优秀工程师组成的研发团队&#xff0…

FairGuard游戏安全2023年度报告

导 读&#xff1a;2023年&#xff0c;游戏行业摆脱了疫情带来诸多负面影响&#xff0c;国内游戏市场收入与用户规模双双实现突破&#xff0c;迎来了历史新高点。但游戏黑灰产规模也在迅速扩大&#xff0c;不少游戏饱受其侵扰&#xff0c;游戏厂商愈发重视游戏安全问题。 为帮助…

Pytorch从零开始实战17

Pytorch从零开始实战——生成对抗网络入门 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——生成对抗网络入门环境准备模型定义开始训练总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch1.8cpu&#xf…