目录
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.源文件
4.总结
a.主程序166行处数据在处理某几张图像时存在Data为空的情况,目前还未找到原因;
b.程序比较简单,还需进一步完善,希望各位多多指点。