机器视觉实验指导书2王海晖.docx
- 文档编号:29478995
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:26
- 大小:208.34KB
机器视觉实验指导书2王海晖.docx
《机器视觉实验指导书2王海晖.docx》由会员分享,可在线阅读,更多相关《机器视觉实验指导书2王海晖.docx(26页珍藏版)》请在冰豆网上搜索。
机器视觉实验指导书2王海晖
《机器视觉》实验指导书
实验一电子元件插针引脚测量实验
(一)实验类型:
验证性实验
(二)实验目的:
通过该实验使得学生掌握如何建立被测量工件对象的基本检测步骤,包括工件定位、光源调整、焦距调节等图象测量,进而掌握工件尺寸测量可视化组态编程方法和技术,掌握如何对多插针相关尺寸参数同时测量的新方法,建立被测量插针的基本检测框架,进而扎实掌握插件多针尺寸、针间距及针宽度测量新技术,具备解决实际复杂插件多针参数视觉测量的技术难题。
(三)实验要求:
熟练掌握:
用Halcon平台测量的步骤
学生分组人数:
1人/组
(四)实验内容:
【实验内容】
测量如图1-1所示电子插件插针参数尺寸
(a)(b)
图1-1:
开关
(a)需要测量开关引脚的宽度及相互之间的距离。
(b)确定检测边缘的矩形感兴趣区。
【实验原理】
1、单个相机的影像截取控制流程如a)所示,
实验中,采用单相机采集图像,对应的图像处理算子类型为:
open_framegrabber(Name,1,1,0,0,0,0,'default',-1,'default',-1,'default','default',Board0,-1,-1,FGHandle0)
grab_image(Image0,FGHandle0)
2、算子说明:
1)open_framegrabber
函数功能:
打开并设置一个图像采集器
调用格式:
open_framegrabber(:
:
Name,HorizontalResolution,VerticalResolution,ImageWidth,ImageHeight,StartRow,StartColumn,Field,BitsPerChannel,ColorSpace,Generic,ExternalTrigger,CameraType,Device,Port,LineIn:
FGHandle)
参数:
Name--Halcon图像采集接口。
比如:
对应的DLL(Windows)的名字或者共享的库函数(UNIX)的名字
Gerneric--图像增益数,可以控制采集到的图像亮度
FGHandle--图像采集函数句柄
2)grab_image
函数功能:
采集图像
调用格式:
grab_image(:
Image:
FGHandle:
)
参数:
Image----采集图像的名称
FGHandle--帧采集器句柄
===================采集图像部分的程序实例====================
1)
dev_close_window()
open_framegrabber('PXC',1,1,0,0,0,0,'default',8,'default',-1,'default','AUTO','default',-1,1,FGHandle)
grab_image(Image,FGHandle)
get_image_pointer1(Image,Pointer,Type,Width,Height)
dev_open_window(0,0,Width,Height,'black',WindowHandle)
2)
dev_update_window('off')
open_framegrabber('DT315x',2,2,0,0,0,0,'default',-1,'default',-1,'default','default','default',-1,1,FGHandle)
grab_image(Image,FGHandle)
get_image_pointer1(Image,Pointer,Type,Width,Height)
dev_close_window()
dev_open_window(0,0,Width,Height,'black',WindowID)
【实验步骤】
1、工件定位:
将工件放置到平台转盘上相应位置,确保动态图象采集根据被测对象要求。
2、光源调整:
选择前光源或背光源确保图象不受自然光源影响。
3、焦距调节:
根据被测对象大小和厚度,调节支架横枞位置和相机焦距。
4、打开图像处理软件,通过变量输入窗口、源程序窗口、菜单栏算子三种方式添加算子,编写工件尺寸的测量与标定程序。
其中,相机采集部分的算子可借助菜单栏“助手”—“opennewImageacquisition”设置,生成代码。
(参见前一部分《图像处理软件操作》),如MV-VS860平台中相机的代码:
open_framegrabber('DirectShow',1,1,0,0,0,0,'default',8,'rgb',-1,'false','default','MVOneVideoCapture',0,-1,FGHandle)//采集卡初始化设置
set_framegrabber_param(FGHandle,'saturation',0)//设置采集卡参数
while(true)//循环采集
grab_image(Image,FGHandle)
*Dosomething//在这里添加算法步骤,对Image,即原始图像做处理
endwhile
close_framegrabber(FGHandle)
主要算法步骤:
-----------------------
1)通过包含如图1-1(b)描述引脚的ROI矩形创建测量对象。
ROI矩形用以取得垂直于矩形主轴的各个直线边界对。
运用算子gen_measure_rectangle2返回所创建对象的句柄MeasureHandle。
gen_measure_rectangle2(Row,Column,Phi,Length1,Length2,Interpolation,MeasureHandle)
------------------------
2)将句柄MeasureHandle传寄给测量函数进行测量。
用measure_pairs算子检测,该算子能提取出引脚对应的边缘对并返回其宽度(每组边缘对的两边之间的距,IntraDistance)和距离(连续两个边缘对之间的距离,InterDistance)。
measure_pairs(Image,MeasureHandle,Sigma,Threshold,Transition,Select,RowEdgeFirst,ColumnEdgeFirst,AmplitudeFirst,RowEdgeSecond,ColumnEdgeSecond,AmplitudeSecond,IntraDistance,InterDistance)
------------------------
要测量引脚的宽度及其之间的距离。
用一维测量,这个任务可迎刃而解,因为位置、距离都是沿着一条线测量的。
============================参考程序===============================
open_framegrabber('DirectShow',1,1,0,0,0,0,'default',-1,'gray',-1,'default','default',default',-1,-1,FGHandle)//打开图像采集设备,DirectShow即为相机的参数,'gray'表示黑白相机
set_framegrabber_param(FGHandle,'saturation',0)//设置采集卡参数
while(true)//循环采集
grab_image(Image,FGHandle)//抓取图像
read_image(Image,'C:
/Templ')//读取图像,因grab_image抓取的图像保存在C:
/Templ中
get_image_pointer1(Image,Pointer,Type,Width,Height)//获得图像参数
dev_close_window()
dev_open_window(0,0,Width,Height,'black',WindowHandle)//打开图像显示窗口,设置背景色为黑色
dev_display(Image)//显示图像
Row:
=390
Column:
=380//定义ROI矩形的R/C坐标
Phi:
=rad(-60)//矩形偏移水平位置的角度,逆时针为正,顺时针为负
Length1:
=60
Length2:
=10//定义ROI矩形长度及宽度
Interpolation:
='nearest_neighbor'//定义被检测对象的相互关系
gen_measure_rectangle2(Row,Column,Phi,Length1,Length2,Width,Height,Interpolation,MeasureHandle)//创建ROI矩形
Sigma:
=0.9
Threshold:
=12
Transition:
='negative'
Select:
='all'
measure_pairs(Image,MeasureHandle,Sigma,Threshold,Transition,Select,RowEdgeFirst,ColumnEdgeFirst,AmplitudeFirst,RowEdgeSecond,ColumnEdgeSecond,AmplitudeSecond,IntraDistance,InterDistance)//在指定ROI矩形区域内,检测符合Threshold:
=12的所有边缘对
dev_display(Image)
dev_set_draw('margin')//设置图形的显示方式
dev_set_color('black')//设置字体的颜色
gen_rectangle2(Rectangle,Row,Column,Phi,Length1,Length2)//在显示窗口中输出矩形
p_disp_dimensions(RowEdgeFirst,ColumnEdgeFirst,RowEdgeSecond,ColumnEdgeSecond,IntraDistance,InterDistance,Phi,Length2,WindowHandle)//测量结果显示函数
close_measure(MeasureHandle)//清除与测量相关的缓存文件
endwhile
close_framegrabber(FGHandle)//关闭图像采集设备
5、电子插件参数实验测量结果如图1-2所示:
标示了引脚的边缘,宽度及其之间的距离。
图1-2:
开关引脚宽度及相互距离检测结果
参考例程:
examples\solution_guide\1d_measuring\measure_switch.dev。
6、延伸训练
图1-3a)测引脚的宽度以及各个引脚的间距b)测引脚的长度
这个训练的任务是检测芯片的主要尺寸(见图1-3)。
主要算法步骤:
------------------------
1)检测每个引脚的宽度以及各个引脚的间距(更加重要)。
我们定义一个包含引脚的矩形ROI(见图1-3a),这就产生了测量目标。
gen_measure_rectangle2(Row,Column,Phi,Length1,Length2,Width,eight,’nearest_neighbor’,MeasureHandle)
measure_pairs(Image,MeasureHandle,1.5,30,’negative’,’all’,RowEdgeFirst,ColumnEdgeFirst,AmplitudeFirst,RowEdgeSecond,ColumnEdgeSecond,AmplitudeSecond,PinWidth,PinDistance)
通过取出的各个直线边界对,就可以得到引脚数目、平均宽度和他们的平均间距
numPins:
=|PinWidth|
avgPinWidth:
=sum(PinWidth)/|PinWidth|
avgPinDistance:
=sum(PinDistance)/|PinDistance|
2)确定引脚的长度。
尽管每个引脚的宽度都只有几个象素,但还是可以求出他们的长度。
为了完成这个任务,我们画出了一个包含了芯片两个对边引脚的矩形,从而得到了一个新的测量区域(见图1-3b)。
找到的第一条边和第二条边之间的距离就是上侧引脚的长度,第三条和第四条就是下面引脚的长度。
gen_measure_rectangle2(Row,Column,Phi,Length1,Length2,Width,Height,’nearest_neighbor’,MeasureHandle)
measure_pos(Image,MeasureHandle,1.5,30,’all’,’all’,RowEdge,ColumnEdge,Amplitude,Distance)
参考例程:
examples\hdevelop\Applications\Measure\measurepin.dev
============================参考程序===============================
dev_close_window()
read_image(Image,'ic_pin')
get_image_pointer1(Image,Pointer,Type,Width,Height)
dev_open_window(0,0,Width/2,Height/2,'black',WindowHandle)
dev_display(Image)
stop()
draw_rectangle2(WindowHandle,Row,Column,Phi,Length1,Length2)//创建矩形,各参数定义如下。
Row:
=47//矩形中心点Row值
Column:
=485
Phi:
=0//矩形偏移水平位置的角度,逆时针为正,顺时针为负
Length1:
=420//矩形长度
Length2:
=10//矩形宽度
dev_set_color('green')
dev_set_draw('margin')
dev_set_line_width(3)
gen_rectangle2(Rectangle,Row,Column,Phi,Length1,Length2)
gen_measure_rectangle2(Row,Column,Phi,Length1,Length2,Width,Height,'nearest_neighbor',MeasureHandle)
stop()
dev_update_pc('off')
dev_update_var('off')
n:
=100
count_seconds(Seconds1)
fori:
=1tonby1
measure_pairs(Image,MeasureHandle,1.5,30,'negative','all',RowEdgeFirst,ColumnEdgeFirst,AmplitudeFirst,RowEdgeSecond,ColumnEdgeSecond,AmplitudeSecond,PinWidth,PinDistance)
endfor
count_seconds(Seconds2)
Time:
=Seconds2-Seconds1
stop()
dev_set_color('red')
disp_line(WindowHandle,RowEdgeFirst,ColumnEdgeFirst,RowEdgeSecond,ColumnEdgeSecond)
avgPinWidth:
=sum(PinWidth)/|PinWidth|
avgPinDistance:
=sum(PinDistance)/|PinDistance|
numPins:
=|PinWidth|
OpSystem:
=environment('OS')
if(OpSystem='Windows_NT')
set_font(WindowHandle,'-Arial-18-*-*-*-*-*-')
else
set_font(WindowHandle,'-*-courier-*-*-*-*-18-*-*-*-*-*-*-*')
endif
dev_set_color('yellow')
set_tposition(WindowHandle,200,100)//设置文字输入位置
write_string(WindowHandle,'Numberofpins:
'+numPins)//显示测量数据:
Numberofpins
set_tposition(WindowHandle,260,100)
write_string(WindowHandle,'AveragePinWidth:
'+avgPinWidth)
set_tposition(WindowHandle,320,100)
write_string(WindowHandle,'AveragePinDistance:
'+avgPinDistance)
dump_window(WindowHandle,'tiff_rgb','C:
\\Temp\\pins_result')
stop()
draw_rectangle1(WindowHandle,Row1,Column1,Row2,Column2)
Row1:
=0
Column1:
=600
Row2:
=100
Column2:
=700
dev_set_color('blue')
disp_rectangle1(WindowHandle,Row1,Column1,Row2,Column2)
stop()
dev_set_part(Row1,Column1,Row2,Column2)
dev_display(Image)
dev_set_color('green')
dev_display(Rectangle)
dev_set_color('red')
disp_line(WindowHandle,RowEdgeFirst,ColumnEdgeFirst,RowEdgeSecond,ColumnEdgeSecond)
stop()
close_measure(MeasureHandle)
dev_set_part(0,0,Height-1,Width-1)
dev_display(Image)
stop()
dev_set_color('green')
draw_rectangle2(WindowHandle,Row,Column,Phi,Length1,Length2)
Row:
=508
Column:
=200
Phi:
=-1.5708
Length1:
=482
Length2:
=35
gen_rectangle2(Rectangle,Row,Column,Phi,Length1,Length2)
gen_measure_rectangle2(Row,Column,Phi,Length1,Length2,Width,Height,'nearest_neighbor',MeasureHandle)
stop()
measure_pos(Image,MeasureHandle,1.5,30,'all','all',RowEdge,ColumnEdge,Amplitude,Distance)
PinHeight1:
=RowEdge[1]-RowEdge[0]
PinHeight2:
=RowEdge[3]-RowEdge[2]
dev_set_color('red')
disp_line(WindowHandle,RowEdge,ColumnEdge-Length2,RowEdge,ColumnEdge+Length2)
dev_set_color('yellow')
set_tposition(WindowHandle,RowEdge[1]+40,ColumnEdge[1]+100)
write_string(WindowHandle,'PinHeight:
'+PinHeight1)
set_tposition(WindowHandle,RowEdge[3]-12
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器 视觉 实验 指导书 王海晖