当前位置: 首页 > article >正文

Halcon开启多线程

并行运算(提升检测时间)

支持主线程中的子线程并行执行程序和调用算子。 一旦启动,子线程由线程 ID 标识,该线程 ID 是一个取决于操作系统的整数进程号。 子线程的执行独立于它们启动的线程。 因此,无法预测子线程执行结束确切时间点。 如果要访问一组线程返回的数据,则需要显式等待相应的线程完成。

HDevelop 默认将线程数限制为 20。 如果需要,可以在首选项中修改此数字。 完全限制并发线程数的主要原因是为了防止用户由于编程错误而无意中生成大量线程。 在这种情况下,系统负载和内存消耗可能会增长得如此之高,以至于可能会变得无响应。

启动线程 par_start<UserThreadID> : 算子/方法

par_start 不是实际的算子,而只是修改调用行为的限定符。 因此,无法在操作员窗口中选择 par_start。如果启动新的子线程会超过配置的最大线程数,则会引发异常。

等待子线程结束 par_join (UserThreadID)

实例:

count_seconds(t0)
read_image (Image880720666518444692, 'E:/图片/880720666518444692.jpg')
rgb1_to_gray(Image880720666518444692, GrayImage)
get_image_size(GrayImage, Width, Height)
count_seconds(t1)
*-------------生成区域参数配置
l1:=305.789
l2:=237.636
*----左上卡尺
ROI_up_l_r:=1869.6
ROI_up_l_c:=2894.94
ROI_up_l_a:=rad(-0)
par_start<ThreadID> : C_L_U (GrayImage, Cross_c_l_up, ROI_up_l_r, ROI_up_l_c, ROI_up_l_a, l1, l2, Width, Height, MeasureHandle, RowEdge_c_l_up, ColumnEdge_c_l_up, Amplitude, Distance)

*-----左下卡尺
par_start<ThreadID1> : C_L_D (GrayImage, Cross_c_l_down, l1, l2, Width, Height, ROI_down_l_r, ROI_down_l_c, ROI_down_l_a, MeasureHandle1, RowEdge_c_l_down, ColumnEdge_c_l_down, Amplitude1, Distance1)

*-----右下卡尺
par_start<ThreadID2> : C_R_D (GrayImage, Cross_c_r_down, l1, l2, Width, Height, ROI_down_r_r, ROI_down_r_c, ROI_down_r_a, MeasureHandle2, RowEdge_c_r_down, ColumnEdge_c_r_down, Amplitude2, Distance2)

*------右上卡尺
par_start<ThreadID3> : C_R_U (GrayImage, Cross_c_r_up, l1, l2, Width, Height, ROI_up_r_r, ROI_up_r_c, ROI_up_r_a, MeasureHandle3, RowEdge_c_r_up, ColumnEdge_c_r_up, Amplitude3, Distance3)
*--------找上方直线
*--------上直线由下到上检测
par_start<ThreadID4> : L_UP (GrayImage, Contours2, Contour3, Contour_line_up, Width, Height, linepr_up, MetrologyHandle, Index, Row2, Column2, RowBegin_line_up, ColBegin_line_up, RowEnd_line_up, ColEnd_line_up, Nr, Nc, Dist)
*-------------找下方直线
*--------下直线由上到下检测
par_start<ThreadID5> : L_DOWN (GrayImage, Contours4, Contour5, Contour_line_down, Width, Height, linepr_down, MetrologyHandle1, Index1, Row3, Column3, RowBegin_line_down, ColBegin_line_down, RowEnd_line_down, ColEnd_line_down, Nr1, Nc1, Dist1)
par_join([ThreadID,ThreadID1,ThreadID2,ThreadID3,ThreadID4,ThreadID5])
count_seconds(t2)
detectiontime1:=t2-t1
dev_set_color('green')
dev_display (GrayImage)
dev_display (Contour5)
dev_display (Contour3)
dev_display (Cross_c_l_up)
dev_display (Cross_c_l_down)
dev_display (Cross_c_r_up)
dev_display (Cross_c_r_down)
dev_get_window (WindowHandle)
set_tposition(WindowHandle, 1000, 1000)
write_string(WindowHandle, '检测时间:'+detectiontime1)

stop ()

无并行运算时间对比

dev_clear_window ()
dev_display (GrayImage)

count_seconds(t3)
ROI_up_l_r:=1869.6
ROI_up_l_c:=2894.94
ROI_up_l_a:=rad(-0)
gen_measure_rectangle2(ROI_up_l_r, ROI_up_l_c, ROI_up_l_a, l1, l2, Width, Height, 'nearest_neighbor', MeasureHandle)
measure_pos(GrayImage,MeasureHandle, 1, 30, 'positive', 'first', RowEdge_c_l_up, ColumnEdge_c_l_up, Amplitude, Distance)
gen_cross_contour_xld(Cross_c_l_up, RowEdge_c_l_up, ColumnEdge_c_l_up, 600, 0.785398)
ROI_down_l_r:=9838.89
ROI_down_l_c:=2894.94
ROI_down_l_a:=rad(-0)
gen_measure_rectangle2(ROI_down_l_r, ROI_down_l_c,ROI_down_l_a,  l1, l2, Width, Height, 'nearest_neighbor', MeasureHandle1)
measure_pos(GrayImage, MeasureHandle1, 1, 30, 'positive', 'first', RowEdge_c_l_down, ColumnEdge_c_l_down, Amplitude1, Distance1)
gen_cross_contour_xld(Cross_c_l_down, RowEdge_c_l_down, ColumnEdge_c_l_down, 600, 0.785398)
ROI_down_r_r:=9838.89
ROI_down_r_c:=5774.45
ROI_down_r_a:=rad(-178.8)
gen_measure_rectangle2(ROI_down_r_r, ROI_down_r_c, ROI_down_r_a,l1, l2, Width, Height, 'nearest_neighbor', MeasureHandle2)
measure_pos(GrayImage, MeasureHandle2, 1, 30, 'positive', 'first', RowEdge_c_r_down, ColumnEdge_c_r_down, Amplitude2, Distance2)
gen_cross_contour_xld(Cross_c_r_down, RowEdge_c_r_down, ColumnEdge_c_r_down, 600, 0.785398)
ROI_up_r_r:=1869.6
ROI_up_r_c:=5774.45
ROI_up_r_a:=rad(-178.8)
gen_measure_rectangle2(ROI_up_r_r, ROI_up_r_c,ROI_up_r_a, l1, l2, Width, Height, 'nearest_neighbor', MeasureHandle3)
measure_pos(GrayImage, MeasureHandle3, 1, 30, 'positive', 'first', RowEdge_c_r_up, ColumnEdge_c_r_up, Amplitude3, Distance3)
gen_cross_contour_xld(Cross_c_r_up, RowEdge_c_r_up, ColumnEdge_c_r_up, 600, 0.785398)
linepr_up:=[1423.49,5063.6 ,1428.49, 3444.44]
create_metrology_model(MetrologyHandle)
set_metrology_model_image_size(MetrologyHandle, Width, Height)
add_metrology_object_generic(MetrologyHandle, 'line', linepr_up, 100, 20, 1, 20, [], [], Index)
set_metrology_object_param(MetrologyHandle, 'all', 'measure_transition', 'positive')
set_metrology_object_param(MetrologyHandle, 'all', 'measure_select', 'first')
apply_metrology_model(GrayImage, MetrologyHandle)
get_metrology_object_measures(Contours2, MetrologyHandle, 'all', 'all', Row2, Column2)
gen_contour_polygon_xld(Contour3, Row2, Column2)
fit_line_contour_xld(Contour3, 'tukey', -1, 0, 5, 2, RowBegin_line_up, ColBegin_line_up, RowEnd_line_up, ColEnd_line_up, Nr, Nc, Dist)
gen_contour_polygon_xld(Contour_line_up, [RowBegin_line_up,RowEnd_line_up], [ColBegin_line_up,  ColEnd_line_up])
linepr_down:=[10587.2, 3495.74,10598.2, 5276.52]
create_metrology_model(MetrologyHandle1)
set_metrology_model_image_size(MetrologyHandle1, Width, Height)
add_metrology_object_generic(MetrologyHandle1, 'line', linepr_down, 100, 20, 1, 30, [], [], Index1)
set_metrology_object_param(MetrologyHandle1, 'all', 'measure_transition', 'positive')
set_metrology_object_param(MetrologyHandle1, 'all', 'measure_select', 'first')
apply_metrology_model(GrayImage, MetrologyHandle1)
get_metrology_object_measures(Contours4, MetrologyHandle1, 'all', 'all', Row3, Column3)
gen_contour_polygon_xld(Contour5, Row3, Column3)
fit_line_contour_xld(Contour5, 'tukey', -1, 0, 5, 2, RowBegin_line_down, ColBegin_line_down, RowEnd_line_down, ColEnd_line_down, Nr1, Nc1, Dist1)
gen_contour_polygon_xld(Contour_line_down, [RowBegin_line_down,RowEnd_line_down], [ColBegin_line_down,ColEnd_line_down])
count_seconds(t4)


detectiontime2:=t4-t3
dev_set_color('red')
dev_display (GrayImage)
dev_display (Contour5)
dev_display (Contour3)
dev_display (Cross_c_l_up)
dev_display (Cross_c_l_down)
dev_display (Cross_c_r_up)
dev_display (Cross_c_r_down)
set_tposition(WindowHandle, 1300, 1000)
write_string(WindowHandle, '检测时间:'+detectiontime2)


http://www.kler.cn/news/359972.html

相关文章:

  • 物联网之超声波测距模块、arduino、esp32
  • 【Flutter】状态管理:高级状态管理 (Riverpod, BLoC)
  • 计算机网络最后错题本-cy
  • Centos7搭建minio对象存储服务器
  • Unity之如何使用Unity Cloud Build云构建
  • 【算法系列-栈与队列】栈与队列的双向模拟
  • 新手向-pkg-config的原理和使用
  • (六) 进程控制
  • Android中的SSL/TLS加密及其作用
  • centos系统查看端口占用情况并杀死进程
  • Java缓存技术(java内置缓存,redis,Ehcache,Caffeine的基本使用方法及其介绍)
  • 机器学习驱动的智能化电池管理技术与应用
  • 音乐如何去除人声只剩背景音乐?轻松享受背景旋律
  • 戴尔电脑win11找不到D盘的解决办法
  • Python 学习笔记(十三)—— urllib获取网页
  • `connection.commit()` 和 `res = cur.fetchall()`的区别是什么
  • RTMP、FFmpeg安装测试
  • Java中巧用 parseInt 实现高效数值变换,进制转换
  • 13. Request请求与Response响应
  • 后端绘制二维码图片(支持带Logo)