线扫相机项目中定量判断机构运动是否匀速的方法

线扫相机的原理:线扫相机一般一次只拍摄一条线(线宽通常是1个像素),在机构运动的过程中,线扫相机不断地拍摄线,于是“聚线成面”,这就是线扫相机成像的原理。

线扫相机的原理决定了,它所拍摄的物体必须要运动。机构运动的话,就存在机构的速度是否和线扫相机采集的速度匹配的问题。

将对机构运动速度的要求进行拆分的话,其实就是如下两点:

① 运动速度必须与线扫相机的工作行频(即采集速度)相匹配。

② 机构的运动速度最好是匀速,或者十分接近匀速。

如果机构速度过快,最后的图像在运动方向上被压缩;如果机构速度过慢,最后的图像在运动方向上被拉伸。

判断机构速度是偏快还是偏慢,并不困难,困难的是定量分析,要有数据作为判断的标准。

方案步骤说明:

① 先使用标定板标定,得出与相机行频匹配的机构运行速度,并调节至此速度。

② 将标定板放置在运动的机构上,采集标定板的图像,需注意的是,标定板需要大致摆正

③ 将采集到的标定板图像做初步处理,例如裁掉多余的部分以便于后续处理。(这一步不是必须的)

④ 通过算法得到标定板中所有圆的最小外接平行矩形的高,计算这张图中所有圆对应的“高”的标准差

⑤ 为了减少误差,可以对多张标定板图像执行以上算法,观察得到的所有标准差数据。标准差越小,说明机构运动速度越稳定。

Halcon程序如下:

 1 *载入当前目录下的全部图片
 2 list_files (‘‘, [‘files‘,‘follow_links‘], ImageFiles)
 3 tuple_regexp_select (ImageFiles, [‘\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$‘,‘ignore_case‘], ImageFiles)
 4
 5     for Index :=0 to |ImageFiles| - 1 by 1
 6         dev_clear_window ()
 7         read_image (Image, ImageFiles[Index])
 8         threshold (Image, Region, 0, 210)
 9         fill_up_shape (Region, Region, ‘area‘, 1, 100)
10         opening_circle (Region, RegionOpening, 5.5)
11         connection (RegionOpening, ConnectedRegions)
12         select_shape (ConnectedRegions, SelectedRegions, ‘roundness‘, ‘and‘, 0.9, 1)
13         select_shape (SelectedRegions, SelectedRegions1, ‘area‘, ‘and‘, 10550, 19999)
14         smallest_rectangle1 (SelectedRegions1, Row1, Column1, Row2, Column2)
15         gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
16         inner_circle (SelectedRegions1, Row, Column, Radius)
17
18         dev_display (Image)
19         dev_set_draw (‘margin‘)
20         dev_display (Rectangle)
21
22         hight := []
23         for Index := 0 to |Row1| -1 by 1
24             *设置字体和字号
25             set_font (3600, ‘-Courier New-10-‘)
26             *显示每个圆的最小外接矩形的高和宽
27             disp_message (3600,((Row2[Index] - Row1[Index]) + ‘ ‘+  (Column2[Index] - Column1[Index]))  , ‘image‘, Row1[Index] - 70, Column1[Index], ‘black‘, ‘true‘)
28             tuple_concat (hight, Row2[Index] - Row1[Index], hight)
29         endfor
30
31         if (|hight| > 1)
32             *求元组中所有元素的标准差
33             tuple_deviation (hight, Deviation)
34             set_font (3600, ‘-Courier New-20-‘)
35             disp_message (3600, ‘纵向高度标准差:‘ + Deviation + ‘    ‘  + |hight| +  ‘个圆‘ , ‘image‘, 50, 50, ‘black‘, ‘true‘)
36         endif
37     stop()
38     endfor

处理结果:

由于没有对比,因此标准差 = 1.54634暂不能知道机构的速度稳定性是高还是低,但是如果有两台类似的机构,要评判它们的速度稳定性的好坏, 那么这种方法可以轻松做出正确判断。

时间: 2024-10-27 01:30:42

线扫相机项目中定量判断机构运动是否匀速的方法的相关文章

MVC项目中如何判断用户是在用什么设备进行访问

使用UAParser在C#MVC项目中如何判断用户是在用什么设备进行访问(手机,平板还是普通的电脑) 现在我们开发的很多web应用都要支持手机等移动设备.为了让手机用户能有更加好的用户体验,我们经常为手机设备专门准备一套前端的页面.这样当用户使用普通电脑来访问的时候,我们的应用就向用户展示普通电脑的页面.当用户使用手机等移动设备来访问我们的系统的时候,我们就向用户展示手机设备的页面.但是这时候另一个问题出现了.如何判断用户在使用什么设备访问我们的应用?是使用手机还是普通电脑? 网上能查到的不同的

JavaScript中正则表达式判断匹配规则以及常用的方法

JavaScript中正则表达式判断匹配规则以及常用的方法: 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它"匹配"了. \d可以匹配一个数字                 '00\d'可以匹配'007' ,'\d\d\d'可以匹配'010' \w可以匹配一个字母或数字      '\w\w'可以匹配'js' \s可

关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法

该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译. 发生该语法错误的原因是cu文件被C++编译器所编译,C++编译器无法识别 "<<<",导致报错. 为什么cu文件会被C++编译器所编译呢?原因在于我们使用#include将cu文件包含到了C++文件中.对于#include的用途,更简单的理解就是把几个文件合并成一个文件,所以,当编译C++文件中,包含其中的cu文件也会被编

iOS项目中引用第三方库引发冲突的解决方法

在iOS程序开发过程中,经常会碰见引用第三方库出现类名重复使用,导致冲突. 解决方案 1.使用命令将.a库中的相同的包移除 2.在编译链接项中添加-dead_strip项  补充说明: -dead_strip:删除多余的库符号: -all_load:让链接器把所有找到的目标文件都加载到可执行文件中: -force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径 使用命令将.a库中的相同的包移除步骤如下: 1.创建临时文件夹(用

web项目中解决post乱码和get乱码的方法

前提复习编码问题产生的原因: 1.  什么是URL编码. URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为URL的一部分或者分离的发送到服务器上. 2.  URL编码规则. 每对name/value由&分开,每对来自表单的name/value用=分开.如果用户没有输入值的那个name依旧会出现不过就是没有值. URL编码是在字符ASCII码的十六进制数的前面加上%.例如\(她的十六进制数表示为5c)的UR

UITextField 限制输入金额(项目中遇到判断输入金额)

下面这个限制输入金额限制得很死: 1.要求用户输入首位不能为小数点; 2.小数点后不超过两位,小数点无法输入超过一个; 3.如果首位为0,后面仅能输入小数点: 4.输入金额不超过11位. 1 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 2 { 3 if (textField.text.lengt

(iOS)项目总结-项目中遇到的各种的问题和解决方法

前言: 一到公司报道那时,便着手独立的去完成了一个项目,其中的辛酸泪也是不足为外人道也.这次算是一个新型的app,仍然是独立开发,但心境和想法却是完全的不同.下面说一次以前做开发时常常忽略的知识,也算是一种复习了吧.下面言归正传: 1.自带键盘的next用法 这算是比较常用的了吧,只要我们想到登录和注册界面,就应该自然而然的想到 - 键盘的next用法(当然不排除相当多的软件并没有实现这个功能). 想法也就是:用户在输入用户名后,点击next跳转到下一个输入框.其实也不用想的如此复杂,在登录界面

分享一个移动项目中消除click事件点击延迟的方法

对于前端工程师来说,apicloud无疑给我们提供了很好的平台,有各种各样的模块供我们使用,但是在实际项目的时候,很大部分的代码,还是需要我们用html css js来实现的.但是呢,移动端页面对于click事件会有 300 毫秒的延迟,导致多数用户感觉移动设备上基于 HTML 的 web 应用界面响应速度慢. 在这里推荐一个简单易用的 js库,用来消除界面中的click事件造成的延迟. https://github.com/ftlabs/fastclick 目前,亲测在iphone表现很完美.

CI框架中,判断post,ajax,get请求的方法

所有就得我们自己造轮子了.下面就介绍一下,如何定义这些判断请求的方法.其实很简单的. 首先打开constants.php,这是一个定义常量的文件.然后往文件里加上这几行代码. 1 2 3 4 //定义请求数据的方法 define('IS_POST',strtolower($_SERVER["REQUEST_METHOD"]) == 'post');//判断是否是post方法 define('IS_GET',strtolower($_SERVER["REQUEST_METHOD