QQ登录

只需一步,快速开始

工业视觉halcon客户项目实战剖析与编程

[ 复制链接 ]
当前这个视觉项目刚结束,趁还有些印象,视觉算法部分思路还在,就开了这个章节,拿来分享。
解说整个项目的开发流程。
项目不难,收费4200。
整个流程是:前期是客户主动联系,说明开发需求,我们根据难易程序开价,确定开发流程。
提供产品图片做前期产品分析,开发出DEMO供客户确定是否下单,
确定就预付20%,提供调试版本后付60%,调试OK后尾款。
下面我们来看下用户现场拍摄产品的图片。
先了解功能上要实现什么目的,再来分析视觉上如何一步步实现,也就是算法的一个实现过程,最后如何打包发布给用户使用。
通过对整个开发过程的了解,知晓接视觉项目私活的流程,明白项目开发的过程。

根据功能实现的要求,我们知道这是一种几何测量类型的视觉项目。
几何测量,最终都会提取出测量对象,也就是那两根金手指的轮廓(也就是XLD形式的图形),
再将轮廓拟合成特定几何图形测量。
从图片上看,上下板的金手指都是矩形的形状,
所以我们的大概思路是:
对图片进行分析,以自己熟悉的方法提取出上下两电路板从右到左的第一根金手指,
然后将得到的这两金手指提取轮廓,拟合成矩形,计算两矩形的距离。

工业视觉halcon客户项目实战剖析与编程

工业视觉halcon客户项目实战剖析与编程

工业视觉halcon客户项目实战剖析与编程

工业视觉halcon客户项目实战剖析与编程

dev_close_window ()
read_image (Image1, '1.bmp')
dev_open_window_fit_image (Image1, 0, 0, -1, -1, WindowHandle)
dev_display (Image1)
get_image_size (Image1, ImageWidth, ImageHeight)
rgb1_to_gray (Image1, Image)
binary_threshold (Image, IconTemp, 'max_separability', 'light', UsedThreshold)
connection (IconTemp, Icon)
*筛选全部白色区域
select_shape (Icon, IconTemp, ['area','ratio','column'], 'and', [2000,3,0], [999999,20,ImageWidth*0.95])
*筛选上,下白色区
select_shape(IconTemp, Icon, 'row1', 'and', 0, 100)
difference (IconTemp, Icon, IconTemp2)
*处理上白色
union1 (Icon, IconTemp)
smallest_rectangle1 (IconTemp, Row, Column, Row1, Column1)
gen_rectangle1 (Rectangle, Row, Column, Row1/2, ImageWidth)
reduce_domain(Image, Rectangle, IconTemp)
binary_threshold (IconTemp, Icon, 'smooth_histo', 'dark', UsedThreshold)
connection (Icon, IconTemp)
select_shape (IconTemp, Icon, ['area','ratio','column','rectangularity'], 'and', [500,3,0,0.8], [999999,20,ImageWidth*0.95,1])
sort_region (Icon, IconTemp, 'upper_right', 'false', 'column')
select_obj(IconTemp, Icon, 1)
gen_contour_region_xld (Icon, IconTemp, 'border')
fit_rectangle2_contour_xld (IconTemp, 'regression', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
gen_rectangle2_contour_xld(Rect, Row, Column, Phi, Length1, Length2)
*提取矩形中心线为上参考线
get_rectangle2_points (Row, Column, Phi, Length1, Length2, CornerY, CornerX, LineCenterY, LineCenterX)
if( Phi<=0)
    XValue := LineCenterX[3]
    YValue := LineCenterY[3]
    XValue1:= LineCenterX[1]
    YValue1:= LineCenterY[1]
else
    XValue := LineCenterX[1]
    YValue := LineCenterY[1]  
    XValue1:= LineCenterX[3]
    YValue1:= LineCenterY[3]
endif
*处理下白色区
union1 (IconTemp2, IconTemp)
smallest_rectangle1 (IconTemp, Row, Column, Row1, Column1)
*gen_rectangle1 (Rectangle, Row-(Row1-Row)*0.1, Column, Row1+(Row1-Row)*0.1, ImageWidth)
gen_rectangle1 (Rectangle, Row, Column, Row1, ImageWidth)
reduce_domain(Image, Rectangle, IconTemp)
auto_threshold (IconTemp, Icon, 5)
* binary_threshold (IconTemp, Icon, 'smooth_histo', 'light', UsedThreshold)
connection (Icon, IconTemp)
fill_up(IconTemp, IconTemp)
select_shape (IconTemp, Icon, ['area','ratio','column','rectangularity'], 'and', [500,3,0,0.8], [999999,20,ImageWidth*0.95,1])
sort_region (Icon, IconTemp, 'upper_right', 'false', 'column')
select_obj(IconTemp, Icon, 1)
gen_contour_region_xld (Icon, IconTemp, 'border')
fit_rectangle2_contour_xld (IconTemp, 'regression', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
gen_rectangle2_contour_xld(Rect1, Row, Column, Phi, Length1, Length2)
get_rectangle2_points (Row, Column, Phi, Length1, Length2, CornerY, CornerX, LineCenterY, LineCenterX)
if( Phi<=0)
    XValue2 := LineCenterX[3]
    YValue2 := LineCenterY[3]
    XValue3 := LineCenterX[1]
    YValue3 := LineCenterY[1]  
else
    XValue2 := LineCenterX[1]
    YValue2 := LineCenterY[1]  
    XValue3 := LineCenterX[3]
    YValue3 := LineCenterY[3]   
Endif
*下金手指中心线顶点到上金手指中心线的投影。
projection_pl(YValue2,XValue2,YValue,XValue,YValue1,XValue1,YValue1,XValue1)
*投影点到下金手指中心线距离
distance_pl(YValue1,XValue1,YValue2,XValue2,YValue3,XValue3,Distance)
if(|Distance|==0)
    return()
endif
*显示结果
gen_contour_polygon_xld(LineXLD,[YValue,YValue1],[XValue,XValue1])
gen_contour_polygon_xld(LineXLD1,[YValue2,YValue3],[XValue2,XValue3])
gen_arrow_contour_xld(Arrow, YValue1, XValue1, YValue2, XValue2, 10, 10)
gen_arrow_contour_xld(Arrow1, YValue2, XValue2, YValue1, XValue1, 10, 10)
dev_display(Image1)
dev_set_line_width (2)
dev_set_draw ('margin')
dev_set_color('red')
dev_display(Rect)
dev_display(Rect1)
dev_set_color('magenta')
dev_display(LineXLD)
dev_display(LineXLD1)
dev_set_color('green')
dev_display(Arrow)
dev_display(Arrow1)
message := Distance$'.2f'+'pix'
get_string_extents(WindowHandle, message, Ascent, Descent, Width1, Height1)
dev_disp_text(message, 'image', YValue2-Height1*2, XValue2, 'green', ['box'], ['false'])
图片未贴出,
因为是下面HALCON视频教程的部分内容。
所以更多介绍与附件下载都可以通过教程来获取 。
  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)


  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  



回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索