Halcon定位测量、TCP/IP通讯综合实例

目录

1.检测效果

2.HDevelop程序代码:

3.源文件 

4.总结


1.检测效果

2.HDevelop程序代码:

*该程序主要为定位测量(圆、直线)、TCP通讯综合应用
**********************************************************************************
*Initialize Program 
*通讯参数
Protocol := 'TCP4'
Timeout := 1000
*程序参数
list_image_files ('D:/Halcon_Study/Image', 'default', [], ImageFiles)
CirNum := 0
Datetime := ''
TrainModel := 0
imageIndex := 0
path := 'Result.txt'


**********************************************************************************



**********************************************************************************
*训练模型
if (TrainModel)
    read_image (Image, 'model')
    gen_rectangle2 (ROI_0, 565.516, 871.375, rad(-1.44656), 371.368, 118.736)
    gen_rectangle2 (TMP_Region, 565.516, 875.125, rad(-1.08502), 271.549, 74.7735)
    difference (ROI_0, TMP_Region, ROI_model)
    reduce_domain (Image, ROI_model, ImageReduced)
    create_scaled_shape_model (ImageReduced, 'auto', rad(-270), rad(360), 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', 50, 20, ModelID)
    get_shape_model_contours (ModelContours, ModelID, 1)
    find_scaled_shape_model (Image, ModelID, rad(-270), rad(360), 0.9, 1.1, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle1, Scale1, Score1)
endif
*模板基准位
RowInit := 565.5
ColInit := 868.535
AngleInit := -1.13496e-006
**********************************************************************************



**********************************************************************************
*打开Socket服务器监听
open_socket_accept (3000, ['protocol','timeout'], [Protocol,Timeout], AcceptingSocket)
*使用TCP Socket
tuple_regexp_match (Protocol, 'TCP|HALCON', BaseProtocol)
if (BaseProtocol=='TCP' or BaseProtocol == 'HALCON')
    *
    *等待客户端连接(本机测试---IP:127.0.0.1,Port:3000)
    *
    dev_error_var (Error, 1)
    dev_set_check ('~give_error')
    OpenStatus := 5
    while (OpenStatus!=2)
        socket_accept_connect (AcceptingSocket, 'auto', Socket)
        OpenStatus := Error
    endwhile
    dev_set_check ('~give_error')
    set_socket_param (Socket, 'timeout',Timeout)
else
    Socket := AcceptingSocket
endif
*获取客户端连接信息
get_socket_param (Socket, 'address_info', Address)
Answer := []
while (Answer!= 'End')
    *获取系统时间
    get_system_time (MSecond, Second, Minute, Hour, Day, YDay, Month, Year)
    tuple_concat (Month, Year, Datetime)
    tuple_concat (Day, Datetime, Datetime)
    tuple_concat (Hour, Datetime, Datetime)
    tuple_concat (Minute, Datetime, Datetime)
    tuple_concat (Second, Datetime, Datetime)
    tuple_string (Datetime, '.f', String)
    Datetime := String[5]+'_'+String[4]+'_'+String[3]+'_'+String[2]+'_'+String[1]+'_'+String[0]
    *接受客户端数据
    receive_data (Socket, 'z', Answer, From)
    *判定触发字符是否为T
    if (Answer=='T')
        if (imageIndex<|ImageFiles|-1)
            imageIndex := imageIndex+1
            *模板定位
            read_image (Image, ImageFiles[imageIndex])
            dev_open_window (0, 0, 960, 600, 'black', WindowHandle)
            dev_display (Image)
            read_shape_model ('model.shm', ModelID)
            find_scaled_shape_model (Image, ModelID, rad(-270), rad(360), 0.9, 1.1, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Scale, Score)
            get_shape_model_contours (ModelContours, ModelID, 1)
            hom_mat2d_identity (HomMat2DIdentity)
            hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
            hom_mat2d_rotate (HomMat2DTranslate, Angle, Row, Column, HomMat2DRotate)
            affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2DRotate)
            
            *检测圆
            *基于基准的圆检测区域
            CirRow:=571.177
            CirCol := 1110.66
            CirRadius := 78         
            vector_angle_to_rigid (RowInit, ColInit, AngleInit, Row, Column, Angle, HomMat2D)
            affine_trans_pixel (HomMat2D, CirRow, CirCol, RowTrans_Cir, ColTrans_Cir)
            create_metrology_model (MetrologyHandle)
            add_metrology_object_circle_measure (MetrologyHandle, RowTrans_Cir, ColTrans_Cir, CirRadius, 12, 5, 1.5, 30, [], [], MetrologyCircleIndices)
            set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'num_instances', 2)
            apply_metrology_model (Image, MetrologyHandle)
            get_metrology_object_result (MetrologyHandle, MetrologyCircleIndices, 'all', 'result_type', 'all_param', Parameter)
            if (|Parameter|>3)
                index :=|Parameter|/3
                for Index := 1 to index-1 by 1
                    if (Parameter[Index*3]>76)
                        CirNum := Index
                    endif
                    get_metrology_object_result_contour (Contour, MetrologyHandle, CirNum-1, CirNum-1, 1.5)
                    area_center_xld (Contour, Area, CirResRow, CirResCol, PointOrder)
                endfor
            else
                get_metrology_object_result_contour (Contour, MetrologyHandle, 0, 0, 1.5)
            endif 
            
            *检测边缘
            *基于基准图像的直线检测区域(Rectangle1)
            Line1InitRow1 := 480.916
            Line1InitCol1 := 534.64
            Line1InitRow2 := 602.86
            Line1InitCol2 := 531.654
            
            Line2InitRow1 := 661.777
            Line2InitCol1 := 783.475
            Line2InitRow2 := 657.666
            Line2InitCol2 := 593.365
            
            Line3InitRow1 := 453.088
            Line3InitCol1 := 600.094
            Line3InitRow2 := 458.424
            Line3InitCol2 := 781.834
            
            lineRowbegin := [480.916,661.777,453.088]
            lineColbegin := [534.64,783.475,600.094]
            lineRowEnd := [602.86,657.666,458.424]
            lineColEnd := [531.654,593.365,781.834]
            *定位跟随
            affine_trans_point_2d (HomMat2D, lineRowbegin, lineColbegin, lineRowbeginTrans, lineColbeginTrans)
            affine_trans_point_2d (HomMat2D, lineRowEnd, lineColEnd, lineRowEndTrans, lineColEndTrans)
            *直线测量(二维测量)
            add_metrology_object_line_measure (MetrologyHandle, lineRowbeginTrans,lineColbeginTrans,lineRowEndTrans,lineColEndTrans, 40, 5, 1, 30, [], [], MetrologyLineIndices)
            apply_metrology_model (Image, MetrologyHandle)
            get_metrology_object_result (MetrologyHandle, MetrologyLineIndices, 'all', 'result_type', 'row_begin', Row_Begin)
            get_metrology_object_result (MetrologyHandle, MetrologyLineIndices, 'all', 'result_type', 'column_begin', Column_Begin)
            get_metrology_object_result (MetrologyHandle, MetrologyLineIndices, 'all', 'result_type', 'row_end', Row_End)
            get_metrology_object_result (MetrologyHandle, MetrologyLineIndices, 'all', 'result_type', 'column_end', Column_End)
            get_metrology_object_measures (Contours, MetrologyHandle, MetrologyLineIndices, 'all', Row2, Column2)
            get_metrology_object_result_contour (Contour1, MetrologyHandle, MetrologyLineIndices, 'all', 1.5)
            
            *Display          
            dev_display (Image)
            dev_set_color ('cyan')
            dev_display (ContoursAffineTrans)
            dev_set_color ('blue')
            dev_set_line_width (3)
            dev_display (Contour)
            dev_display (Contours)
            dev_set_color ('yellow')
            dev_display (Contour1)    
            
        else
            imageIndex := 0
        endif
        *定义返回客户端结果数据
        Data := '\r\nImage'+imageIndex+'Result: ' +'\r\nModel center: \r'+'Row : '+Row +'  Column: '+Column+'  Angle: '+Angle+'\r'+'Circle Result: \r'+'CirRow: '+Parameter[CirNum-1]+'  CirCol:'+Parameter[CirNum]+'  CirRadius: '+Parameter[CirNum*3]+'\r\n\r\n'
        disp_message (WindowHandle, Data, 'window', 20, 20, 'blue', 'false')
   
        *将数据记录到txt
        file_exists (path, FileExists)
        if (FileExists==0)
            open_file (path, 'append', FileHandle)
            fwrite_string (FileHandle,Datetime +':'+ Data)
            fnew_line (FileHandle) 
        else
            open_file (path, 'append', FileHandle)
            fwrite_string (FileHandle,Datetime+':'+ Data)
            fnew_line (FileHandle)
        endif  
    else
        Data := 'Received:'+Answer+'\r\n请发送正确的触发字符'
    endif
    To := [From[0],From[1]]
    Format := 'z'
    *发送数据到客户端
    send_data (Socket, Format, Data, To)
endwhile
stop ()

**********************************************************************************



**********************************************************************************

*关闭新建资源
close_socket (Socket)
close_socket (AcceptingSocket)
clear_shape_model (ModelID)
close_file (FileHandle)

**********************************************************************************

3.源文件 

Halcon-HDevelop-TCPIP-定位测量-图像处理文档类资源-CSDN文库

4.总结

a.主程序166行处数据在处理某几张图像时存在Data为空的情况,目前还未找到原因;

b.程序比较简单,还需进一步完善,希望各位多多指点。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HeliosXxzh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值