├── 10-1.hdev ├── 10-10.hdev ├── 10-3.hdev ├── 10-4.hdev ├── 10-5.hdev ├── 10-6.hdev ├── 10-7.hdev ├── 10-8.hdev ├── 10-9.hdev ├── 11-1.hdev ├── 11-12.hdev ├── 11-2.hdev ├── 11-3.hdev ├── 11-4.hdev ├── 11-5.hdev ├── 11-6.hdev ├── 12-4.hdev ├── 12-5.hdev ├── 12-mlp-test.hdev ├── 12-mlp-test2.hdev ├── 13-4.hdev ├── 15-1.hdev ├── 16-1.hdev ├── 16-2.hdev ├── 16-3.hdev ├── 16-4.hdev ├── 17-2.hdev ├── 18-4.hdev ├── 5-1.hdev ├── 5-10.hdev ├── 5-11.hdev ├── 5-2.hdev ├── 5-3.hdev ├── 5-5.hdev ├── 5-6.hdev ├── 5-7.hdev ├── 5-8.hdev ├── 5-9.hdev ├── 6-1.hdev ├── 6-10.hdev ├── 6-11.hdev ├── 6-2.hdev ├── 6-4.hdev ├── 6-5.hdev ├── 6-6.hdev ├── 6-7.hdev ├── 6-8.hdev ├── 6-9.hdev ├── 7-3.hdev ├── 7-4.hdev ├── 7-5.hdev ├── 8-10.hdev ├── 8-12.hdev ├── 8-2.hdev ├── 8-4.hdev ├── 8-5.hdev ├── 8-6.hdev ├── 8-7.hdev ├── 8-8.hdev ├── 8-9.hdev ├── 9-1.hdev ├── 9-11.hdev ├── 9-2.hdev ├── 9-3.hdev ├── 9-4.hdev ├── 9-5.hdev ├── 9-9.hdev └── data ├── arrow1.jpg ├── arrow2.jpg ├── beads.jpg ├── board.jpg ├── boardEqu.jpg ├── bolts-0.jpg ├── bolts-1.jpg ├── carmex-0.jpg ├── carmex-1.jpg ├── char.jpg ├── chess.jpg ├── cloth.jpg ├── cloth1.jpg ├── cloth2.jpg ├── cloth3.jpg ├── cloth4.jpg ├── codes.jpg ├── cream.jpg ├── creamlabel.jpg ├── crossShape.jpg ├── defocusComponnet.jpg ├── disparity.jpg ├── display.jpg ├── flower.jpg ├── garlic.jpg ├── garlic2.jpg ├── holes.jpg ├── holes2.jpg ├── holesBoard.jpg ├── holesBoardNoise.jpg ├── label.jpg ├── labelShape-0.jpg ├── labelShape-1.jpg ├── logs.jpg ├── m1.jpg ├── m105.jpg ├── m2.jpg ├── m3.jpg ├── m4.jpg ├── m5.jpg ├── marker.jpg ├── meter1.jpg ├── meter2.jpg ├── modelWords.jpg ├── pen01.jpg ├── pen02.jpg ├── pen1.jpg ├── pen2.jpg ├── pen3.jpg ├── shapes.jpg ├── stereo-left.jpg ├── stereo-right.jpg ├── testWords.jpg ├── text.jpg ├── village.jpg ├── woodboard.jpg ├── yszx.omc └── yszx.trf /10-1.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image(Image,'data/flower') 7 | rgb1_to_gray (Image, GrayImage) 8 | sobel_amp(GrayImage,Amp,'sum_abs',3) 9 | threshold(Amp,Edg,100,255) 10 | skeleton (Edg, Skeleton) 11 | dev_clear_window () 12 | dev_display (Skeleton) 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /10-10.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取了图像并创建显示窗口 8 | read_image (Image, 'data/flower') 9 | rgb1_to_gray (Image, GrayImage) 10 | get_image_size (Image, Width, Height) 11 | dev_open_window (0, 0, Width , Height, 'black', WindowHandle) 12 | dev_set_color ('white') 13 | *对图像进行阈值处理 14 | threshold (GrayImage, Region, 130, 255) 15 | *使用闭运算进行填充 16 | closing_circle (Region, Region, 20.5) 17 | *获取前景目标的初始轮廓 18 | gen_contour_region_xld (Region, Contour, 'border') 19 | *拟合圆形轮廓 20 | fit_circle_contour_xld (Contour, 'atukey', -1, 2, 0, 10, 1, Row, Column, Radius, StartPhi, EndPhi, PointOrder) 21 | *生成该拟合的圆形轮廓 22 | gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 4 * acos(0), 'positive', 1) 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /10-3.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | read_image(Image,'data/flower') 8 | rgb1_to_gray (Image, GrayImage) 9 | gen_image_proto (Image, ImageCleared, 1) 10 | dev_open_window (0, 0, 256, 256, 'black', WindowHandle1) 11 | dev_open_window (0, 256, 256, 256, 'black', WindowHandle2) 12 | dev_open_window (0, 512, 256, 256, 'black', WindowHandle3) 13 | edges_image (GrayImage, ImaAmpGray, ImaDirGray, 'canny', 1, 'none', -1, -1) 14 | edges_image (GrayImage, ImaAmpGrayNMS, ImaDirGrayHyst, 'canny', 1, 'nms',20, 40) 15 | *对非极大值抑制后的边缘梯度图像进行了阈值处理 16 | threshold (ImaAmpGrayNMS, RegionGray, 1, 255) 17 | *提取边缘轮廓 18 | skeleton (RegionGray, EdgesGray) 19 | *用于结果显示和对比 20 | dev_set_window (WindowHandle1) 21 | dev_display (ImageCleared) 22 | dev_display (ImaAmpGray) 23 | dev_set_window (WindowHandle2) 24 | dev_display (ImageCleared) 25 | dev_display (ImaAmpGrayNMS) 26 | dev_set_window (WindowHandle3) 27 | dev_display (ImageCleared) 28 | dev_display (EdgesGray) 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /10-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/flower') 7 | laplace (Image, ImageLaplace, 'signed', 11, 'n_8_isotropic') 8 | zero_crossing (ImageLaplace, RegionCrossing) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /10-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/flower') 7 | laplace_of_gauss(Image,Laplace,2.0) 8 | zero_crossing(Laplace,ZeroCrossings) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /10-6.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/flower') 7 | *转换为单通道灰色图像 8 | rgb1_to_gray (Image, GrayImage) 9 | *进行亚像素边缘提取。分别使用了不同的滞后阈值以便进行对比 10 | edges_sub_pix (GrayImage, Edges1, 'lanser2', 0.5, 5, 50) 11 | edges_sub_pix (GrayImage, Edges2, 'lanser2', 0.5, 25, 50) 12 | edges_sub_pix (GrayImage, Edges3, 'lanser2', 0.5, 5, 25) 13 | *将提取结果显示在窗口中 14 | dev_display (Edges1) 15 | stop() 16 | dev_display (Edges2) 17 | stop() 18 | dev_display (Edges3) 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /10-7.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/flower') 7 | *使用canny算子进行亚像素边缘提取 8 | edges_color_sub_pix (Image, Edges1, 'canny', 0.5, 5, 50) 9 | *使用canny算子进行亚像素边缘提取 10 | edges_color_sub_pix (Image, Edges2, 'sobel_fast', 0.5, 40, 70) 11 | dev_clear_window () 12 | dev_display (Edges1) 13 | dev_display (Edges2) 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /10-8.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/flower') 7 | rgb1_to_gray (Image, GrayImage) 8 | dev_open_window (0, 512, 512, 512, 'black', WindowHandle1) 9 | *进行边缘检测 10 | lines_gauss(GrayImage,Lines,1.5,1,8,'light','true','bar-shaped','true') 11 | *在窗口将轮廓线条绘制出来 12 | dev_set_color ('red') 13 | dev_clear_window() 14 | dev_display (Lines) 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /10-9.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | read_image (Image, 'data/shapes') 8 | rgb1_to_gray (Image, GrayImage) 9 | get_image_size (Image, Width, Height) 10 | dev_open_window (0, 0, Width , Height, 'black', WindowHandle) 11 | *提取出的亚像素边缘edge的图像,得到了一个初始的轮廓 12 | edges_sub_pix (GrayImage, Edges, 'canny', 2.5, 15, 40) 13 | *对上一步的轮廓进行分割 14 | segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2) 15 | *提取出轮廓中较长的部分线段 16 | select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width / 2, -0.5, 0.5) 17 | *对相邻的轮廓段进行连接 18 | union_adjacent_contours_xld (SelectedContours, UnionContours, 20, 1, 'attr_keep') 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /11-1.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | dev_open_window (0, 0, 599, 464, 'black', WindowID) 8 | *读取了一幅彩色图像 9 | read_image (Imagecolor, 'data/holesBoard') 10 | *将其转化为灰度图像 11 | rgb1_to_gray (Imagecolor, Image) 12 | dev_set_draw ('margin') 13 | dev_set_line_width(3) 14 | Row1 :=700 15 | Column1 := 950 16 | Row2 := 906 17 | Column2 := 1155 18 | *选择了一块矩形的ROI区域 19 | gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) 20 | dev_display (Rectangle) 21 | *将ROI区域进行裁剪,变成模板图像 22 | reduce_domain (Image, Rectangle, ImageReduced) 23 | *创建模板,因为光照比较稳定,GrayValues选择‘original’ 24 | create_template (ImageReduced, 5, 4, 'sort', 'original', TemplateID) 25 | *读取测试图像 26 | read_image (ImageNoise, 'data/holesBoardNoise') 27 | *应用灰度模板并进行匹配 28 | adapt_template (ImageNoise, TemplateID) 29 | best_match_mg (ImageNoise, TemplateID, 35, 'false', 4, 'all', Row_, Column_, Error_) 30 | dev_clear_window () 31 | dev_display (ImageNoise) 32 | *根据匹配返回的坐标中心,绘制矩形标识框,将匹配到的目标框选出来 33 | disp_rectangle2 (WindowID, Row_, Column_, 0, 95, 95) 34 | *匹配结束,释放模板资源 35 | clear_template (TemplateID) 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /11-12.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | * 这个例子用来介绍 HALCON中的形状模板匹配 7 | dev_close_window() 8 | *读取图像并获取其宽高 9 | read_image(ModelImage, 'data/arrow1') 10 | median_image (ModelImage, ImageMedian, 'circle', 6, 'mirrored') 11 | get_image_size(ModelImage, Width,Height) 12 | dev_open_window (0, 0, Width/2, Height/2, 'white', WindowHandle) 13 | *显示模板图像 14 | dev_display (ModelImage) 15 | * 设置画笔颜色和线条 16 | dev_set_color ('yellow') 17 | dev_set_line_width (3) 18 | * ------------------- 形状模板匹配程序 ---------------- 19 | *第1步:选择模板中的目标 20 | Row1 := 281 21 | Column1 := 160 22 | Row2 := 440 23 | Column2 := 312 24 | *用矩形框选定一个目标区域 25 | gen_rectangle1 (ROI, Row1, Column1, Row2, Column2) 26 | *显示ROI区域 27 | dev_display (ROI) 28 | *剪裁出这个区域 29 | reduce_domain (ModelImage, ROI, ImageROI) 30 | *第2步,创建模板 31 | *检查模板参数 32 | inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 4, 50) 33 | *显示金字塔各层级的图像,以检查层数的合理性 34 | dev_display (ShapeModelRegions) 35 | area_center (ShapeModelRegions, AreaModelRegions, RowModelRegions,ColumnModelRegions) 36 | count_obj (ShapeModelRegions, HeightPyramid) 37 | *确定金字塔的层级 38 | for i := 1 to HeightPyramid by 1 39 | if (AreaModelRegions[i - 1] >= 15) 40 | NumLevels := i 41 | endif 42 | endfor 43 | *使用ROI图像创建模板 44 | create_shape_model (ImageROI, NumLevels, 0, rad(360), 'auto', 'none', 'ignore_global_polarity', 50, 10, ModelID) 45 | *获取轮廓信息,用于结果显示 46 | get_shape_model_contours (ShapeModel, ModelID, 1) 47 | * step 3: 在检测图像中搜索模板 48 | *读取检测图像 49 | read_image(SearchImage, 'data/arrow2') 50 | *寻找最佳模板匹配 51 | find_shape_model (SearchImage, ModelID, 0, rad(360), 0.3, 1, 0.5, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score) 52 | *如果找到了目标,则将它标示出来 53 | if (|Score| > 0.9) 54 | *计算刚性变换矩阵 55 | vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject) 56 | *应用二维仿射变换XLD轮廓,以便在图像中显示检测到的轮廓 57 | affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject) 58 | *显示检测图像 59 | gen_rectangle2 (recResult, RowCheck, ColumnCheck, AngleCheck, 80, 80) 60 | dev_set_draw ('margin') 61 | dev_display (SearchImage) 62 | *标示出检测到的模板 63 | dev_display (ModelAtNewPosition) 64 | dev_set_color ('blue') 65 | dev_display (recResult) 66 | endif 67 | * ------------------- 程序结束 ----------------- 68 | * 清除模板 69 | clear_shape_model (ModelID) 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /11-2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *读取参考的原始图像。如果是彩色的,需要先转化为单通道灰度图像 7 | read_image (Image, 'data/carmex-0') 8 | get_image_size (Image, Width, Height) 9 | dev_close_window () 10 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle) 11 | *设置窗口绘制参数,线宽设为3 12 | dev_set_line_width(3) 13 | dev_set_draw ('margin') 14 | *创建圆形,因为目标区域是圆形,因为用圆形将ROI区域选择出来 15 | gen_circle (Circle, 161, 208, 80) 16 | *获取圆形的中心点,为匹配后的可视化显示结果做准备 17 | area_center (Circle, Area, RowRef, ColumnRef) 18 | *裁剪ROI区域,得到模板图像 19 | reduce_domain (Image, Circle, ImageReduced) 20 | *创建基于相关性的匹配模型,输入模板图像和模型参数 21 | create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID) 22 | *显示原始图像和圆形框 23 | dev_display (Image) 24 | dev_display (Circle) 25 | stop () 26 | *读取测试图像。该测试图像和参考图像比起来有轻微的位移,旋转,缩放,以及失焦 27 | read_image (Image2, 'data/carmex-1') 28 | *进行行基于相关性的模板匹配 29 | find_ncc_model (Image2, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score) 30 | vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, 0, HomMat2D) 31 | *对圆形进行仿射变换,使其将匹配的结果目标标识出来 32 | affine_trans_region (Circle, RegionAffineTrans, HomMat2D, 'nearest_neighbor') 33 | *显示测试画面和圆形标记圈 34 | dev_display (Image2) 35 | dev_display (RegionAffineTrans) 36 | *匹配结束,释放模板资源 37 | clear_ncc_model (ModelID) 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /11-3.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *读取参考图像 7 | read_image(Image, 'data/labelShape-0') 8 | *根据要匹配的目标,围绕目标创建一个矩形,获取ROI区域 9 | gen_rectangle1 (Rectangle, 34, 290, 268, 460) 10 | *对ROI区域进行裁剪,得到模板图像 11 | reduce_domain (Image, Rectangle, ImageReduced) 12 | *测试金字塔的层级参数 13 | inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30) 14 | *设置显示图像、绘制线条的线宽等窗口参数 15 | dev_set_draw ('margin') 16 | dev_set_line_width(3) 17 | dev_display(Image) 18 | dev_display(Rectangle) 19 | *根据剪裁的模板图像创建基于形状的模板,返回模板句柄ShapeModelID 20 | create_shape_model (ImageReduced, 5, rad(-10), rad(20), 'auto', 'none', 'use_polarity', 20, 10, ShapeModelID) 21 | stop() 22 | *读取用于测试的图像 23 | read_image(SearchImage, 'data/labelShape-1') 24 | *使用匹配算子进行形状模板匹配 25 | find_shape_model (SearchImage, ShapeModelID, 0, rad(360), 0.5, 3, 0, 'least_squares', 0, 0.5, RowCheck, ColumnCheck, AngleCheck, Score) 26 | *显示匹配结果,将匹配得到的实例以形状轮廓的形式绘制出来 27 | dev_display_shape_matching_results (ShapeModelID, 'red', RowCheck, ColumnCheck, AngleCheck, 1, 1, 0) 28 | *匹配结束,释放模板资源 29 | clear_shape_model (ShapeModelID) 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /11-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取参考图像,这里读取的是单通道灰度图像 8 | read_image (ModelImage, 'data/bolts-0') 9 | *设置显示图像、绘制线条等窗口参数 10 | dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle) 11 | dev_display (ModelImage) 12 | dev_set_draw ('margin') 13 | dev_set_line_width(3) 14 | stop () 15 | *定义各个组件, 选取各个组件的ROI区域 16 | gen_rectangle1 (Rectangle1, 140, 71, 279, 168) 17 | gen_rectangle1 (Rectangle2, 181, 281,285, 430) 18 | gen_circle (Circle, 106, 256, 60) 19 | *将所有组件放进一个名为ComponentRegions的Tuple中 20 | concat_obj (Rectangle1, Rectangle2, ComponentRegions) 21 | concat_obj (ComponentRegions, Circle, ComponentRegions) 22 | *显示参考图像,以及选择的各个组件区域。核对区域选择是否理想 23 | dev_display (ModelImage) 24 | dev_display (ComponentRegions) 25 | stop () 26 | *创建基于组件的模板,返回模板句柄ComponentModelID 27 | create_component_model (ModelImage, ComponentRegions, 20, 20, rad(25), 0, rad(360), 15, 40, 15, 10, 0.8, 3, 0, 'none', 'use_polarity', 'true', ComponentModelID, RootRanking) 28 | *读取测试图像,该测试图像相对于参考图像有一定的位移和旋转。 29 | read_image (SearchImage, 'data/bolts-1') 30 | *在参考图像模板的基础上,进行基于基于组件的匹配 31 | find_component_model (SearchImage, ComponentModelID, RootRanking, 0, rad(360), 0.5, 0, 0.5, 'stop_search', 'search_from_best', 'none', 0.8, 'interpolation', 0, 0.8, ModelStart, ModelEnd, Score, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp) 32 | *显示测试图像 33 | dev_display (SearchImage) 34 | *对每一个检测到的组件实例进行可视化的显示 35 | for Match := 0 to |ModelStart| - 1 by 1 36 | dev_set_line_width (4) 37 | *获得每个组件的实例和位移旋转等参数 38 | get_found_component_model (FoundComponents, ComponentModelID, ModelStart, ModelEnd, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp, Match, 'false', RowCompInst, ColumnCompInst, AngleCompInst, ScoreCompInst) 39 | dev_display (FoundComponents) 40 | endfor 41 | stop () 42 | *匹配结束,释放模板资源 43 | clear_component_model (ComponentModelID) 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /11-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取参考图像,这里读取的是单通道灰度图像 8 | *这里的参考图像是已经剪裁好的感兴趣区域图像,可以直接作为模板图像 9 | read_image (ModelImage, 'data/creamlabel') 10 | *设置显示窗口参数 11 | dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle) 12 | *创建局部形变模板,返回局部形变模板句柄ModelID 13 | create_local_deformable_model (ModelImage, 'auto', rad(-15), rad(30), 'auto', 1, 1, 'auto', 1, 1, 'auto', 'none', 'use_polarity', [40,60], 'auto', [], [], ModelID) 14 | *获取局部形变模板的轮廓 15 | get_deformable_model_contours (ModelContours, ModelID, 1) 16 | *为了将模板轮廓可视化显示,需要将轮廓与图像实物对应起来 17 | *因此出于可视化显示的目的,先获取模板图像的几何中心 18 | area_center (ModelImage, Area, Row, Column) 19 | *进行仿射变换 20 | hom_mat2d_identity (HomMat2DIdentity) 21 | hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate) 22 | affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2DTranslate) 23 | *设置轮廓显示的线条参数,显示模板图像与轮廓 24 | dev_set_line_width (2) 25 | dev_display (ModelImage) 26 | dev_display (ContoursAffinTrans) 27 | stop () 28 | *读取测试图像,这里的图像中更包含模板图像,并且有一定的形变 29 | read_image (DeformedImage, 'data/cream') 30 | *显示用于测试的局部形变图像 31 | dev_resize_window_fit_image (DeformedImage, 0, 0, -1, -1) 32 | dev_display (DeformedImage) 33 | *进行局部形变模板匹配 34 | find_local_deformable_model (DeformedImage, ImageRectified, VectorField, DeformedContours, ModelID, rad(-14), rad(28), 0.9, 1, 0.9, 1, 0.78, 0, 0, 0, 0.7, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [18,0,0], Score, Row, Column) 35 | *显示形变轮廓 36 | dev_display (DeformedImage) 37 | dev_set_line_width (2) 38 | dev_set_color ('red') 39 | dev_display (DeformedContours) 40 | stop() 41 | *匹配结束,释放模板资源 42 | clear_deformable_model (ModelID) 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /11-6.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取参考图像,这里的参考图像应只包含识别的关键区域,用于创建模板 8 | read_image (ImageLabel, 'data/labelShape-0') 9 | *设置窗口参数用于显示图像 10 | get_image_size (ImageLabel, Width, Height) 11 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle1) 12 | dev_set_draw ('margin') 13 | dev_display (ImageLabel) 14 | *设置用于存储特征点和感兴趣区域的变量 15 | NumPoints := [] 16 | RowRoi := [10,10,Height - 10,Height - 10] 17 | ColRoi := [10,Width - 10,Width - 10,10] 18 | *将参考图像中的除边缘外的区域都设为感兴趣区域。因为参考图像已经近似于匹配的纹理样本 19 | gen_rectangle1 (Rectangle, 10, 10, Height - 10, Width - 10) 20 | *显示参考图像上选择的ROI区域 21 | dev_set_line_width (4) 22 | dev_display (Rectangle) 23 | stop () 24 | *将感兴趣区域剪裁为模板图像 25 | reduce_domain (ImageLabel, Rectangle, ImageReduced) 26 | dev_clear_window () 27 | dev_display (ImageLabel) 28 | *创建基于描述符的模板 29 | create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot','max_rot','min_scale','max_scale'], [-90,90,0.2,1.1], 42, ModelID) 30 | *设置模型的原点,为了后面获取坐标作参照 31 | set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2) 32 | *获取模型中特征点的位置 33 | get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D) 34 | *将模型中计算出的特征点存入NumPoints变量中 35 | NumPoints := [NumPoints,|Row_D|] 36 | 37 | *读取测试图像,这里读取的是单通道灰度图像,因此省略了通道转化的步骤 38 | read_image (ImageGray, 'data/labelShape-1') 39 | dev_resize_window_fit_image (ImageGray, 0, 0, -1, -1) 40 | dev_display (ImageGray) 41 | *对描述符特征点进行匹配 42 | find_uncalib_descriptor_model (ImageGray, ModelID, 'threshold', 800, ['min_score_descr','guided_matching'], [0.003,'on'], 0.25, 1, 'num_points', HomMat2D, Score) 43 | *显示匹配结果,将特征点用不同的颜色绘制出来 44 | if ((|HomMat2D| > 0) and (Score > NumPoints[0] / 4)) 45 | get_descriptor_model_points (ModelID, 'search', 0, Row, Col) 46 | *创建十字标识符 47 | gen_cross_contour_xld (Cross, Row, Col, 6, 0.785398) 48 | projective_trans_region (Rectangle, TransRegion, HomMat2D, 'bilinear') 49 | projective_trans_pixel (HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans) 50 | angle_ll (RowTrans[2], ColTrans[2], RowTrans[1], ColTrans[1], RowTrans[1], ColTrans[1], RowTrans[0], ColTrans[0], Angle) 51 | Angle := deg(Angle) 52 | if (Angle > 70 and Angle < 110) 53 | area_center (TransRegion, Area, Row, Column) 54 | dev_set_color ('green') 55 | dev_set_line_width (4) 56 | dev_display (TransRegion) 57 | dev_set_colored (6) 58 | dev_display (Cross) 59 | endif 60 | endif 61 | stop () 62 | *匹配结束,释放模板资源 63 | clear_descriptor_model (ModelID) 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /12-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *关闭当前窗口 7 | dev_close_window () 8 | *创建新窗口 9 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle) 10 | *设置绘制形状的方式 11 | dev_set_draw ('margin') 12 | dev_set_line_width (3) 13 | *创建mlp分类器,特征数为1,输出类为2个,输出方法选择‘softmax’用于分类 14 | create_class_mlp (1, 1, 2, 'softmax', 'normalization', 3, 42, MLPHandle) 15 | *创建训练样本图像与其分类的对应关系 16 | *图像和分类名称一一对应 17 | FileNames := ['m1','m2','m3','m4'] 18 | Classes := [0,0,1,1] 19 | for J := 0 to |FileNames| - 1 by 1 20 | *读取训练图像 21 | read_image (Image, 'data/' + FileNames[J]) 22 | dev_display (Image) 23 | *对图像进行分割 24 | rgb1_to_gray (Image, GrayImage) 25 | threshold (GrayImage, darkRegion, 0, 105) 26 | connection (darkRegion, ConnectedRegions) 27 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999) 28 | fill_up (SelectedRegions, Objects) 29 | dev_display (Objects) 30 | disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true') 31 | *将分割后的对象objects添加进分类器对应的分类Classes[J]中 32 | count_obj (Objects, Number) 33 | *提取特征(圆度) 34 | for N := 1 to Number by 1 35 | select_obj (Objects, Region, N) 36 | circularity (Region, Circularity) 37 | add_sample_class_mlp (MLPHandle, Circularity,Classes[J]) 38 | endfor 39 | stop() 40 | disp_continue_message (WindowHandle, 'black', 'true') 41 | endfor 42 | dev_clear_window () 43 | disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true') 44 | *训练mlp分类器 45 | train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog) 46 | clear_samples_class_mlp (MLPHandle) 47 | 48 | *读取输入的待检测图像 49 | read_image (testImage, 'data/m5') 50 | rgb1_to_gray (testImage, GrayTestImage) 51 | *将图像进行分割 52 | threshold (GrayTestImage, darkTestRegion, 0, 105) 53 | connection (darkTestRegion, ConnectedTestRegions) 54 | select_shape (ConnectedTestRegions, SelectedTestRegions, 'area', 'and', 1500, 99999) 55 | fill_up (SelectedTestRegions, testObjects) 56 | *将分割后的对象objects进行分类 57 | count_obj (testObjects, Number) 58 | Classes := [] 59 | Colors := ['yellow','magenta'] 60 | dev_set_colored (6) 61 | dev_display (testImage) 62 | *提取特征(圆度) 63 | for J := 1 to Number by 1 64 | select_obj (testObjects, singleRegion, J) 65 | circularity (singleRegion, Circularity) 66 | classify_class_mlp (MLPHandle, Circularity, 1, Class, Confidence) 67 | Classes := [Classes,Class] 68 | dev_set_color (Colors[Classes[J-1]]) 69 | dev_display (singleRegion) 70 | endfor 71 | 72 | *清除MLP分类器,释放内存 73 | clear_class_mlp (MLPHandle) 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /12-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window() 7 | read_image (Image, 'data/modelWords') 8 | get_image_size(Image,width,height) 9 | dev_open_window (0, 0, width, height, 'black', WindowHandle) 10 | rgb1_to_gray (Image, GrayImage) 11 | gen_empty_obj (EmptyObject) 12 | for Index := 1 to 4 by 1 13 | disp_message (WindowHandle, '请框选单个汉字区域,右键确认:','window', 12, 12, 'yellow', 'false') 14 | draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) 15 | **根据画的矩形生成对应的矩形 16 | gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) 17 | reduce_domain (GrayImage, Rectangle, ImageReduced1) 18 | *阈值处理 19 | threshold (ImageReduced1, Region1, 128, 255) 20 | *准备接收所有提取的字符区域 21 | concat_obj (EmptyObject, Region1, EmptyObject) 22 | endfor 23 | words:=['艺','术','中','心'] 24 | *排序 25 | sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row') 26 | for Index1:=1 to 4 by 1 27 | select_obj (SortedRegions1, ObjectSelected1, Index1) 28 | append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], 'data/yszx.trf') 29 | endfor 30 | read_ocr_trainf_names ('data/yszx.trf', CharacterNames, CharacterCount) 31 | create_ocr_class_mlp (50, 60, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle) 32 | trainf_ocr_class_mlp (OCRHandle, 'data/yszx.trf', 200, 1, 0.01, Error, ErrorLog) 33 | write_ocr_class_mlp (OCRHandle, 'data/yszx.omc') 34 | *导入另一张做测试的图 35 | read_image (ImageTest, 'data/testWords.jpg') 36 | rgb1_to_gray (ImageTest, Image1) 37 | threshold (Image1, testwordregion, 125, 255) 38 | *对符合条件的字符区域进行分割 39 | connection (testwordregion, ConnectedwordRegions) 40 | *筛选符合条件的字符形状区域 41 | select_shape (ConnectedwordRegions, SelectedwordRegions, 'area', 'and', 700, 2500) 42 | *从左到右,排序 43 | sort_region (SelectedwordRegions, SortedRegions2, 'upper_left', 'true', 'column') 44 | count_obj(SortedRegions2, Number) 45 | *开始字符识别 46 | read_ocr_class_mlp ('data/yszx.omc', OCRHandle1) 47 | do_ocr_multi_class_mlp (SortedRegions2, Image1, OCRHandle1, Class, Confidence) 48 | *显示结果 49 | disp_message(WindowHandle, '识别结果:', 'image', 10, 10, 'white', 'false') 50 | for i:=1 to 4 by 1 51 | disp_message(WindowHandle, Class[i-1], 'image', 90, 60*i, 'yellow', 'false') 52 | endfor 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /12-mlp-test.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *关闭当前窗口 7 | dev_close_window () 8 | *创建新窗口 9 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle) 10 | *设置显示颜色 11 | dev_set_colored (6) 12 | *设置绘制形状的方式 13 | dev_set_draw ('margin') 14 | dev_set_line_width (3) 15 | *创建mlp分类器,输出方法选择‘softmax’用于分类 16 | create_class_mlp (6, 5, 3, 'softmax', 'normalization', 3, 42, MLPHandle) 17 | *创建训练样本图像与其分类的对应关系 18 | *图像和分类名称一一对应 19 | FileNames := ['m1','m2','m3','m4'] 20 | Classes := [0,0,1,1] 21 | for J := 0 to |FileNames| - 1 by 1 22 | *读取训练图像 23 | read_image (Image, 'data/' + FileNames[J]+'.jpg') 24 | dev_display (Image) 25 | dev_set_colored (6) 26 | *对图像进行自动分割 27 | rgb1_to_gray (Image, GrayImage) 28 | threshold (GrayImage, darkRegion, 0, 105) 29 | connection (darkRegion, ConnectedRegions) 30 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999) 31 | fill_up (SelectedRegions, Objects) 32 | dev_display (Objects) 33 | disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true') 34 | *将分割后的对象objects添加进分类器对应的分类Classes[J]中 35 | count_obj (Objects, Number) 36 | for N := 1 to Number by 1 37 | select_obj (Objects, Region, N) 38 | circularity (Region, Circularity) 39 | roundness (Region, Distance, Sigma, Roundness, Sides) 40 | moments_region_central_invar (Region, PSI1, PSI2, PSI3, PSI4) 41 | Features := [Circularity,Roundness,PSI1,PSI2,PSI3,PSI4] 42 | add_sample_class_mlp (MLPHandle, Features,Classes[J]) 43 | endfor 44 | stop() 45 | disp_continue_message (WindowHandle, 'black', 'true') 46 | endfor 47 | dev_clear_window () 48 | disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true') 49 | *训练mlp分类器 50 | train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog) 51 | clear_samples_class_mlp (MLPHandle) 52 | disp_message (WindowHandle, 'Training... completed', 'window', 10, 10, 'black', 'true') 53 | *读取输入的待检测图像 54 | read_image (testImage, 'E:/Doc/MV/pics/12-m5.jpg') 55 | rgb1_to_gray (testImage, GrayTestImage) 56 | dev_display (testImage) 57 | *将图像进行分割 58 | threshold (GrayTestImage, darkTestRegion, 0, 105) 59 | connection (darkTestRegion, ConnectedTestRegions) 60 | select_shape (ConnectedTestRegions, SelectedTestRegions, 'area', 'and', 1500, 99999) 61 | fill_up (SelectedTestRegions, testObjects) 62 | *将分割后的对象objects进行分类 63 | count_obj (testObjects, Number) 64 | Classes := [] 65 | for J := 1 to Number by 1 66 | select_obj (testObjects, singleRegion, J) 67 | circularity (singleRegion, Circularity) 68 | roundness (singleRegion, Distance, Sigma, Roundness, Sides) 69 | moments_region_central_invar (singleRegion, PSI1, PSI2, PSI3, PSI4) 70 | Features := [Circularity,Roundness,PSI1,PSI2,PSI3,PSI4] 71 | classify_class_mlp (MLPHandle, Features, 1, Class, Confidence) 72 | Classes := [Classes,Class] 73 | endfor 74 | *用不同颜色显示同类的对象 75 | count_obj (Objects, Number) 76 | Colors := ['yellow','magenta','green'] 77 | for J := 1 to Number by 1 78 | select_obj (Objects, Region, J) 79 | dev_set_color (Colors[Classes[J - 1]]) 80 | dev_display (Region) 81 | endfor 82 | *清除MLP分类器,释放内存 83 | clear_class_mlp (MLPHandle) 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /12-mlp-test2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *关闭当前窗口 7 | dev_close_window () 8 | *创建新窗口 9 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle) 10 | *设置显示颜色 11 | dev_set_colored (6) 12 | *设置绘制形状的方式 13 | dev_set_draw ('margin') 14 | dev_set_line_width (3) 15 | *创建mlp分类器,输出方法选择‘softmax’用于分类 16 | create_class_mlp (6, 5, 3, 'softmax', 'normalization', 3, 42, MLPHandle) 17 | *创建训练样本图像与其分类的对应关系 18 | *图像和分类名称一一对应 19 | FileNames := ['m1','m2','m3','m4'] 20 | Classes := [0,0,1,1] 21 | for J := 0 to |FileNames| - 1 by 1 22 | *读取训练图像 23 | read_image (Image, 'data/' + FileNames[J]) 24 | dev_display (Image) 25 | *对图像进行自动分割 26 | rgb1_to_gray (Image, GrayImage) 27 | threshold (GrayImage, darkRegion, 0, 105) 28 | connection (darkRegion, ConnectedRegions) 29 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999) 30 | fill_up (SelectedRegions, Objects) 31 | dev_display (Objects) 32 | disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true') 33 | *将分割后的对象objects添加进分类器对应的分类Classes[J]中 34 | count_obj (Objects, Number) 35 | for N := 1 to Number by 1 36 | select_obj (Objects, Region, N) 37 | circularity (Region, Circularity) 38 | add_sample_class_mlp (MLPHandle, Circularity,Classes[J]) 39 | endfor 40 | stop() 41 | disp_continue_message (WindowHandle, 'black', 'true') 42 | endfor 43 | dev_clear_window () 44 | disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true') 45 | *训练mlp分类器 46 | train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog) 47 | clear_samples_class_mlp (MLPHandle) 48 | disp_message (WindowHandle, 'Training... completed', 'window', 10, 10, 'black', 'true') 49 | *读取输入的待检测图像 50 | read_image (testImage, 'E:/Doc/MV/pics/12-m5.jpg') 51 | rgb1_to_gray (testImage, GrayTestImage) 52 | 53 | *将图像进行分割 54 | threshold (GrayTestImage, darkTestRegion, 0, 105) 55 | connection (darkTestRegion, ConnectedTestRegions) 56 | select_shape (ConnectedTestRegions, SelectedTestRegions, 'area', 'and', 1500, 99999) 57 | fill_up (SelectedTestRegions, testObjects) 58 | *将分割后的对象objects进行分类 59 | count_obj (testObjects, Number) 60 | Classes := [] 61 | Colors := ['yellow','magenta'] 62 | dev_display (testImage) 63 | for J := 1 to Number by 1 64 | select_obj (testObjects, singleRegion, J) 65 | circularity (singleRegion, Circularity) 66 | classify_class_mlp (MLPHandle, Circularity, 1, Class, Confidence) 67 | Classes := [Classes,Class] 68 | 69 | dev_set_color (Colors[Classes[J-1]]) 70 | dev_display (singleRegion) 71 | endfor 72 | 73 | *清除MLP分类器,释放内存 74 | clear_class_mlp (MLPHandle) 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /13-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *使用相机参数校正畸变 7 | * CameraParameters为相机的内部参数 8 | CameraParameters := [0.0271606, -518.0, 1.48e-005, 1.48e-005, 271.343, 260.681, 640, 480] 9 | * CameraPose为相机的外部参数,即位姿 10 | CameraPose := [0.258487, -0.018, 4.954, 2.0, 14.0, 2.4, 0] 11 | scaleParam := 1920/1080.0 12 | *读取待校正的图像 13 | read_image (Image, 'data/chess') 14 | *调整原点的位姿 15 | set_origin_pose (CameraPose, -1,-0.7, 0, rectificationPose) 16 | *生成用于校正的映射图,用来描述图像坐标系与世界坐标系之间的映射 17 | gen_image_to_world_plane_map(rectificationMap,CameraParameters, rectificationPose, 640, 480, 640, 480, scaleParam/ 640, 'bilinear') 18 | *利用映射图rectificationMap进行图像的校正 19 | map_image (Image, rectificationMap, rectifiedImage) 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /15-1.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *清空显示窗口。 7 | dev_close_window () 8 | *读取参考图像。这里读取图像是为了创建模板。 9 | read_image (Image, 'data/pen01') 10 | *因为参考图像因为拍摄的原因会有一些噪声,因此使用均值滤波对图像进行平滑。 11 | 12 | mean_image (Image, ImageMean, 3, 3) 13 | *获取图像的宽和高用于窗口显示 14 | get_image_size (Image, Width, Height) 15 | *设置窗口显示参数,包括设置绘制线条的颜色和线宽等 16 | dev_close_window () 17 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle) 18 | dev_set_color ('red') 19 | dev_display (Image) 20 | dev_set_draw ('margin') 21 | dev_set_line_width(3) 22 | 23 | *对原图进行阈值分割,粗略的提取出印刷图案的区域 24 | threshold (ImageMean, Region, 0, 42) 25 | *对印刷图案区域做一定的膨胀,使选区完全包围印刷图案部分 26 | dilation_circle (Region, RegionDilation, 8.5) 27 | *将选择转化为包围的形状 28 | shape_trans (RegionDilation, RegionTrans, 'convex') 29 | *将形状区域作为感兴趣区域从原图中分割出来 30 | reduce_domain (ImageMean, RegionTrans, ImageReduced) 31 | 32 | *检查形状模板参数,为后续的形状模板匹配检查合适的层级参数。 33 | *这里只用了1层的金字塔图像,因为该形状已经可以满足检测的需求了 34 | inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 20) 35 | *创建形状的轮廓,为了显示形状便于检查形状选择的是否完整 36 | gen_contours_skeleton_xld (ModelRegions, Model, 1, 'filter') 37 | *获取图像的面积和几何中心点坐标 38 | area_center (RegionTrans, Area, RowRef, ColumnRef) 39 | *创建形状模板。 40 | *金字塔层级为。因为测试图像与参考图像在光照,坐标方面的变化比较小,因此按默认值设置即可 41 | create_shape_model (ImageReduced, 1, rad(-10), rad(10), 'auto', 'none', 'use_polarity', 20, 10, ShapeModelID) 42 | *创建一个用于对比的差异模型,返回模型句柄VariationModelID 43 | create_variation_model (Width, Height, 'byte', 'standard', VariationModelID) 44 | 45 | *使用良品的训练图像对检查模板进行训练。 46 | *其中为了将各个图像进行对齐,避免可能的位移和旋转,先对图像做个仿射变换。 47 | *然后使用对变换后的良品图像进行训练,得到良品的检查模板。 48 | for Num := 1 to 2 by 1 49 | read_image (Image, 'data/pen0' + Num) 50 | find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score) 51 | if (|Score| == 1) 52 | vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D) 53 | affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false') 54 | train_variation_model (ImageTrans, VariationModelID) 55 | dev_display (Model) 56 | endif 57 | endfor 58 | 59 | *准备检查模板。设置两个阈值AbsThreshold, VarThreshold。 60 | *前者定义了检测图像与检查模板的灰度差的绝对值的允许阈值。 61 | *后者定义了与理想图像的差异程度 62 | prepare_variation_model (VariationModelID, 20, 2) 63 | *读取待检测的图像,这里开始正式检测。 64 | *也可以连接相机进行拍摄,图像如果是彩色的,需要转换为单通道图像。 65 | stop() 66 | for Num := 1 to 3 by 1 67 | read_image (Image2, 'data/pen'+Num) 68 | *进行模板匹配。寻找图中的形状 69 | find_shape_model (Image2, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 4, 0.9, Row, Column, Angle, Score) 70 | if (|Score| == 1) 71 | *如果匹配成功,现将图像进行仿射变换用于和模板对齐。 vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D) 72 | vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D) 73 | affine_trans_image (Image2, ImageTrans2, HomMat2D, 'constant', 'false') 74 | *然后裁剪出感兴趣区域。对后面的比对做准备 75 | reduce_domain (ImageTrans2, RegionTrans, ImageReduced2) 76 | *将裁剪后的感兴趣区域图像与检查模板图像进行比对。提取出有差异的部分 77 | compare_variation_model (ImageReduced2, RegionDiff, VariationModelID) 78 | *将差异部分的区域分割开来 79 | connection (RegionDiff, ConnectedRegions) 80 | *对差异图像区域进行筛选,根据差异的面积排除掉极微小的无意义的差别部分。 81 | select_shape (ConnectedRegions, RegionsError, 'area', 'and', 20, 1000000) 82 | *计算提取出的差异的个数,作为缺陷数量。这是为了判别最终结果 83 | count_obj (RegionsError, NumError) 84 | *将缺陷部位标记出来。如果是良品,则显示的是没有标记的测试图像 85 | dev_clear_window () 86 | dev_display (ImageTrans2) 87 | dev_display (RegionsError) 88 | *打印结果。 89 | *如果结果为0,可以认为是良品,没有发生缺陷 90 | *如果缺陷个数不为0,则认为是次品 91 | set_tposition (WindowHandle, 20, 20) 92 | if (NumError == 0) 93 | write_string (WindowHandle, 'OK') 94 | else 95 | write_string (WindowHandle, 'Not OK') 96 | endif 97 | endif 98 | stop() 99 | endfor 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /16-1.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *清空当前窗口 7 | dev_close_window () 8 | *读取测试图像 9 | read_image (Image, 'data/cloth1') 10 | *获取图像的宽 11 | get_image_size (Image, Width, Height) 12 | *创建显示窗口,并设置窗口及绘制参数 13 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle) 14 | dev_set_draw ('margin') 15 | dev_set_line_width (3) 16 | dev_set_color ('red') 17 | *创建一个高斯滤波器,用于将傅里叶转换后的图像进行滤波 18 | gen_gauss_filter (GaussFilter, 3.0, 3.0, 0.0, 'none', 'rft', Width, Height) 19 | *开始检测 20 | *将测试图像转化为单通道的灰度图像 21 | rgb1_to_gray (Image, ImageGray) 22 | *对灰度图像进行颜色反转 23 | invert_image (ImageGray, ImageInvert) 24 | *对反转后的图像进行傅里叶变换 25 | rft_generic (ImageInvert, ImageFFT, 'to_freq', 'none', 'complex', Width) 26 | *对傅里叶图像做卷积,使用之前创建的高斯滤波器作为卷积核 27 | convol_fft (ImageFFT, GaussFilter, ImageConvol) 28 | *将卷积后的傅里叶图像还原为空间域图像。可见图像的突变部分得到了增强 29 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width) 30 | *设置提取线条的参数 31 | calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High) 32 | *将图像中的有灰度差异的线条提取出来 33 | lines_gauss (ImageFiltered, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true') 34 | *将提取出的结果显示出来 35 | dev_display (Image) 36 | dev_display (Lines) 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /16-2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *清空当前窗口 7 | dev_close_window () 8 | read_image (Image, 'data/cloth2') 9 | get_image_size (Image, Width, Height) 10 | *创建窗口并设置窗口绘制参数 11 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle) 12 | dev_set_draw ('margin') 13 | dev_set_line_width (4) 14 | dev_set_color ('red') 15 | *创建一个高斯滤波器,用于将傅里叶转换后的图像进行滤波 16 | gen_gauss_filter (GaussFilter, 3.0, 3.0, 0.0, 'none', 'rft', Width, Height) 17 | *开始检测,读取图像 18 | rgb1_to_gray (Image, ImageGray) 19 | *对图像进行傅里叶变换,平滑以及还原 20 | rft_generic (ImageGray, ImageFFT, 'to_freq', 'none', 'complex', Width) 21 | convol_fft (ImageFFT, GaussFilter, ImageConvol) 22 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width) 23 | *对还原后的图像进行阈值处理,提取出图中明显偏暗的部分,即瑕疵的位置 24 | threshold (ImageFiltered, ImageDark, 0, 85) 25 | *由于瑕疵部位可能不止一个,将其分离成独立的区域 26 | connection (ImageDark, ConnectedRegions) 27 | *获取瑕疵的数量。 28 | *如果对瑕疵的形状面积尺寸等有筛选要求的, 29 | *也可以在这一步之前加入selecct_shape算子进行判断 30 | count_obj (ConnectedRegions, Number) 31 | *逐个显示瑕疵的位置并以圆圈标记出来。 32 | for index := 1 to Number by 1 33 | select_obj (ConnectedRegions, shape, index) 34 | area_center (shape, Area, Row, Column) 35 | gen_circle (Circle, Row, Column, 30) 36 | dev_display (Circle) 37 | endfor 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /16-3.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *关闭当前屏幕的窗口 7 | dev_close_window () 8 | *读取图像,创建新窗口 9 | read_image (Image, 'data/cloth3') 10 | get_image_size (Image, Width, Height) 11 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle) 12 | dev_set_draw ('margin') 13 | dev_set_line_width (3) 14 | dev_set_color ('red') 15 | *读取检测图像 16 | rgb1_to_gray (Image, ImageGray) 17 | *使用muti_image算子对灰度图像做了乘法运算 18 | *增强了图像的对比度 19 | mult_image(ImageGray, ImageGray, ImageResult,0.01, 0) 20 | *创建一个正弦形状的带通滤波器,用于消除背景的纹理图像。 21 | *其第二个参数决定了正弦的最大值,需要能在平滑背景的同时较好的提取出缺陷点 22 | gen_sin_bandpass (ImageBandpass, 0.2, 'none', 'rft', Width, Height) 23 | *对图像进行傅里叶变换,平滑以及还原 24 | rft_generic (ImageResult, ImageFFT, 'to_freq', 'none', 'complex', Width) 25 | convol_fft (ImageFFT, ImageBandpass, ImageConvol) 26 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n','byte', Width) 27 | *使用纹理滤波器提取缺陷部位 28 | texture_laws (ImageFiltered, ImageTexture, 'el',3, 5) 29 | *使用阈值处理等方式,根据灰度差异将缺陷部位选择出来 30 | threshold (ImageTexture, Imagelight, 150, 255) 31 | connection (Imagelight, ConnectedRegions) 32 | *根据形状的面积选择最大的区域 33 | select_shape_std (ConnectedRegions, SelectedRegion, 'max_area', 70) 34 | area_center (SelectedRegion, Area, Row, Column) 35 | gen_circle (Circle, Row, Column, 30) 36 | *显示缺陷检测结果 37 | dev_clear_window() 38 | dev_display(ImageGray) 39 | dev_display (Circle) 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /16-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *关闭当前窗口 7 | dev_close_window () 8 | read_image (Image, 'data/cloth4') 9 | get_image_size (Image, Width, Height) 10 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle) 11 | dev_set_line_width (4) 12 | *创建两个高斯滤波器 13 | gen_gauss_filter (GaussFilter1, 30.0, 30.0, 0.0, 'none', 'rft', Width, Height) 14 | gen_gauss_filter (GaussFilter2,3.0, 3.0, 0.0, 'none', 'rft', Width, Height) 15 | sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0) 16 | rgb1_to_gray (Image, ImageGray) 17 | *对图像进行傅里叶变换,滤波以及还原 18 | rft_generic (ImageGray, ImageFFT, 'to_freq', 'none', 'complex', Width) 19 | convol_fft (ImageFFT, Filter, ImageConvol) 20 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width) 21 | scale_image_range (ImageFiltered, ImageScaled, 0, 255) 22 | *使用形态学方法提取污染区域 23 | threshold (ImageScaled, Region, 0, 1) 24 | erosion_circle (Region, RegionErosion, 11.5) 25 | connection (RegionErosion, ConnectedRegions) 26 | select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70) 27 | dilation_circle (SelectedRegions, RegionDirty, 9.5) 28 | *显示提取结果 29 | dev_display (Image) 30 | dev_set_draw ('margin') 31 | dev_display (RegionDirty) 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /17-2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *清空显示窗口 7 | dev_close_window() 8 | *读取模板图像。这里的模板图像是单通道灰度图像,如果是彩色的,还需要做一步转换 9 | read_image(ModelImage, 'data/meter1') 10 | *获取图像的尺寸,便于创建合适的窗口进行显示 11 | get_image_size(ModelImage, Width, Height) 12 | *创建窗口并设置显示参数 13 | dev_open_window (0, 0, Width, Height, 'white', WindowHandle) 14 | dev_display (ModelImage) 15 | dev_set_color ('yellow') 16 | dev_set_line_width (5) 17 | 18 | *设置指针区域的多边形形状坐标 19 | Rows := [410,308,312,327,428,410] 20 | Cols := [135,267,283,283,143,135 ] 21 | *创建形状多边形,该多边形区域应完全的覆盖指针所在的区域。该区域即为感兴趣区域 22 | gen_region_polygon_filled (ROI, Rows, Cols) 23 | *创建参考图像,从原模板图像中裁剪出多边形形状区域 24 | reduce_domain (ModelImage, ROI, ImageROI) 25 | 26 | *检查形状模板参数,查看金字塔层级的图像 27 | inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 2, 50) 28 | *显示形状模板图像。以此检查形状模板区域是否理想 29 | dev_display (ShapeModelRegions) 30 | *创建形状模板 31 | create_shape_model (ImageROI, 2, 0, rad(360270), 'auto', 'none', 'ignore_global_polarity', 20, 10,ModelID) 32 | *获取形状模板的轮廓。用于匹配成功后的显示 33 | get_shape_model_contours (ShapeModel, ModelID, 1) 34 | 35 | *读取要检测的图像。这里的检测图像也是单通道灰度图像,如果是彩色的,还需要做一步转换 36 | read_image(SearchImage, 'data/meter2') 37 | *进行基于形状模板的匹配,在图中寻找到指针的位置。 38 | *返回指针的坐标,旋转角度,以及匹配分数 39 | find_shape_model (SearchImage, ModelID, -rad(360900), rad(360270), 0.7, 1, 0.5, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score) 40 | 41 | *如果匹配分数达到要求,则匹配成功 42 | if (|Score| > 0.9) 43 | *用于从匹配结果数据中创建一个刚体的仿射变换矩阵 44 | vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck,MovementOfObject) 45 | *将形状模板进行仿射变换,使之显示在指针的新位置上 46 | affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject) 47 | *将匹配结果显示出来 48 | dev_display (SearchImage) 49 | dev_display (ModelAtNewPosition) 50 | endif 51 | *匹配结束,释放模板资源 52 | clear_shape_model (ModelID) 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /18-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image(ImageRec1,'data/stereo-left') 7 | read_image(ImageRec2,'data/stereo-right') 8 | binocular_disparity (ImageRec1, ImageRec2, Disparity, Score, 'ncc', 11, 11, 0, -150, 30, 4, 0.6, 'none', 'none') 9 | *将整幅视差图像转换为3d点图。 10 | *计算后输出的三张图,三张图的灰度分别表示视差图中的对应位置的点在X, Y, Z轴的坐标 11 | CamParamRect1 := [0.0121606, 0.0, 1.48e-005, 1.48e-005, -101.343, 120.681, 337, 242] 12 | CamParamRect2:=[0.0121606, 0.0, 1.48e-005, 1.48e-005, 546.365, 120.681, 364, 242] 13 | Cam1PoseRect1:=[0.158487, 0.0, 0.0, 0.0, 0.0, 0.0, 0] 14 | disparity_image_to_xyz(Disparity, ImgX, ImgY, ImgZ,CamParamRect1, CamParamRect2, Cam1PoseRect1) 15 | *释放相机资源 16 | *close_framegrabber(AcqHandle1) 17 | *close_framegrabber(AcqHandle2) 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /5-1.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *关闭当前显示窗口,清空屏幕 7 | dev_close_window () 8 | *读取测试图像 9 | read_image (Image_display, 'data/display.jpg') 10 | *将图像转化为灰度图像 11 | rgb1_to_gray (Image_display, GrayImage) 12 | *获取图像的尺寸 13 | get_image_size(Image_display,imageWidth, imageHeight) 14 | *新建显示窗口,适应图像尺寸 15 | dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle1) 16 | dev_display (GrayImage) 17 | *初始化角点坐标 18 | XCoordCorners := [] 19 | YCoordCorners := [] 20 | *阈值处理,提取较暗的区域 21 | threshold(GrayImage,DarkRegion,0, 80) 22 | *分离不相连的区域 23 | connection (DarkRegion, ConnectedRegions) 24 | *选择面积最大的暗色区域,即屏幕区域 25 | select_shape_std (ConnectedRegions, displayRegion, 'max_area', 70) 26 | *裁剪屏幕区域 27 | reduce_domain (GrayImage, displayRegion, displayImage) 28 | *创建边缘轮廓 29 | gen_contour_region_xld (displayRegion, Contours, 'border') 30 | *将轮廓分割为边 31 | segment_contours_xld (Contours, ContoursSplit, 'lines', 5, 4, 2) 32 | *获取边的数量 33 | count_obj (ContoursSplit, Number) 34 | *存储每条边的起点位置 35 | for index:=1 to Number by 1 36 | select_obj(ContoursSplit, ObjectCurrent, index) 37 | *拟合每条边 38 | fit_line_contour_xld (ObjectCurrent, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) 39 | *存储每条边的顶点x坐标 40 | tuple_concat (XCoordCorners, RowBegin, XCoordCorners) 41 | *存储每条边的顶点y坐标 42 | tuple_concat (YCoordCorners, ColBegin, YCoordCorners) 43 | endfor 44 | 45 | * 投影变换给四个特征点与校正后的坐标建立关联 46 | XOff:= 100 47 | YOff:= 100*imageHeight/imageWidth 48 | hom_vector_to_proj_hom_mat2d (XCoordCorners, YCoordCorners, [1,1,1,1], [YOff,YOff,imageHeight-YOff,imageHeight-YOff], [XOff,imageWidth-XOff,imageWidth-XOff,XOff], [1,1,1,1], 'normalized_dlt', HomMat2D) 49 | *投影变换 50 | projective_trans_image (Image_display, Image_rectified, HomMat2D, 'bilinear', 'false', 'false') 51 | * 显示校正结果 52 | dev_display (Image_rectified) 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /5-10.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (ImageNoise, 'data/marker.jpg') 7 | gauss_filter(ImageNoise, ImageGauss, 5) 8 | dev_display(ImageGauss) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /5-11.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (test, 'data/label') 7 | *通道分离 8 | decompose3(test, image1, image2, image3) 9 | mean_image (image1, Mean1, 9, 9) 10 | emphasize (Mean1, em1, 5, 5, 1.5) 11 | illuminate (em1, ImageI1, 20, 20, 0.55) 12 | equ_histo_image (image2, ImageEquHisto2) 13 | equ_histo_image (image3, ImageEquHisto3) 14 | compose3 (ImageI1, ImageEquHisto2, ImageEquHisto3, MultiChannelImage) 15 | dev_display(MultiChannelImage) 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /5-2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *关闭当前显示窗口,清空屏幕 7 | dev_close_window () 8 | *读取测试图像 9 | read_image (Image_display, 'data/display.jpg') 10 | *获取图像的尺寸 11 | get_image_size(Image_display,imageWidth, imageHeight) 12 | *新建显示窗口,适应图像尺寸 13 | dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle) 14 | dev_display (Image_display) 15 | gen_rectangle1 (ROI_0, 52, 46, 456, 574) 16 | *裁剪屏幕区域 17 | reduce_domain (Image_display, ROI_0, reducedImage) 18 | dev_open_window (0, 400, imageWidth, imageHeight, 'black', WindowHandle1) 19 | * 显示校正结果 20 | dev_display (reducedImage) 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /5-3.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (board, 'data/boardEqu') 7 | rgb1_to_gray (board, GrayImage) 8 | equ_histo_image (GrayImage, ImageEquHisto) 9 | *显示直方图 10 | gray_histo (board, board, AbsoluteHisto1, RelativeHisto1) 11 | gray_histo (ImageEquHisto, ImageEquHisto, AbsoluteHisto2, RelativeHisto2) 12 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle) 13 | dev_set_color ('red') 14 | gen_region_histo (Histo1, AbsoluteHisto1, 255, 5, 1) 15 | dev_set_color ('green') 16 | gen_region_histo (Histo2, AbsoluteHisto2, 255, 450, 1) 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /5-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (boardtext, 'calinderdata/text.jpg') 7 | emphasize (boardtext, ImageEmphasize, 10, 10, 1.5) 8 | dev_display(ImageEmphasize) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /5-6.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (text, 'data/text.jpg') 7 | scale_image_max (text, ImageScaleMax) 8 | dev_display(ImageScaleMax) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /5-7.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (test, 'data/defocusComponnet.jpg') 7 | shock_filter (test, SharpenedImage, 0.5, 20, 'canny', 12.5) 8 | dev_display(SharpenedImage) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /5-8.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (ImageNoise, 'data/marker.jpg') 7 | mean_image (ImageNoise, ImageMean, 9,9) 8 | dev_display(ImageMean) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /5-9.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (ImageNoise, 'data/marker.jpg') 7 | median_image (ImageNoise, ImageMedian, 'circle', 3, 'continued') 8 | dev_display(ImageMedian) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /6-1.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image,'data/codes.jpg') 7 | rgb1_to_gray (Image, GrayImage) 8 | threshold (GrayImage, DarkArea, 0, 128) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /6-10.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/village') 7 | *对原图进行了均值处理,选用了“circle”类型的中值滤波器 8 | median_image (Image, ImageMedian, 'circle', 2, 'mirrored') 9 | *使用了区域生长算子寻找颜色相似的邻域 10 | regiongrowing (ImageMedian, Regions, 1, 1, 3, 500) 11 | *对图像进行粗略的区域分割,提取满足条件的各个独立区域 12 | shape_trans (Regions, Centers, 'inner_center') 13 | connection (Centers, SingleCenters) 14 | *对初步提取的区域计算出了中心点坐标 15 | area_center (SingleCenters, Area, Row, Column) 16 | *以均值灰度图像为输入,进行区域生长计算,计算的起始坐标为上一步的各区域中心 17 | regiongrowing_mean (ImageMedian, RegionsMean, Row, Column, 25, 100) 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /6-11.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *输入待检测的木材图像 7 | read_image (Image, 'data/woodboard') 8 | *将原始图转化为灰度图。便与后续的平滑处理 9 | rgb1_to_gray (Image, GrayImage) 10 | *对单通道图像进行高斯平滑处理,以去除噪声 11 | gauss_filter (GrayImage, ImageGauss, 11) 12 | *对高斯平滑后的图像进行分水岭处理,阈值分割,提取出盆地区域 13 | watersheds (ImageGauss, Basins1, Watersheds) 14 | watersheds_threshold(ImageGauss, Basins, 50) 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /6-2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image,'data/shapes') 7 | rgb1_to_gray (Image, GrayImage) 8 | auto_threshold(GrayImage,Regions,8.0) 9 | **下面是直方图波形对比 10 | *gray_histo (GrayImage, GrayImage, AbsoluteHisto1, RelativeHisto1) 11 | *gen_region_histo (Histo1, AbsoluteHisto1, 255, 5, 1) 12 | *dev_clear_window () 13 | *create_funct_1d_array (AbsoluteHisto1, Function) 14 | *smooth_funct_1d_gauss (Function, 8.0, SmoothedFunction) 15 | *dev_set_color ('red') 16 | *funct_1d_to_pairs (SmoothedFunction, XValues, YValues) 17 | *gen_region_histo (Histo2, YValues, 255, 255, 1) 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /6-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/codes.jpg') 7 | rgb1_to_gray (Image, GrayImage) 8 | binary_threshold (GrayImage, RegionMaxSeparabilityLight, 'max_separability', 'dark', UsedThreshold) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /6-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/text.jpg') 7 | *将图像转换为灰度 8 | rgb1_to_gray (Image, GrayImage) 9 | *由于图像对比度比较低,对图像进行相乘,增强对比度 10 | mult_image (GrayImage, GrayImage, ImageResult, 0.005, 0) 11 | *使用平滑滤波器对原始图像进行适当平滑 12 | mean_image (ImageResult, ImageMean, 50,50) 13 | *动态阈值分割,提取字符区域 14 | dyn_threshold (ImageResult, ImageMean, RegionDynThresh, 4, 'not_equal') 15 | *开运算,去除无意义的小的杂点 16 | opening_circle (RegionDynThresh, RegionOpening, 1.5) 17 | dev_clear_window() 18 | dev_display (RegionOpening) 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /6-6.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/garlic') 7 | *将图像转换为灰度 8 | rgb1_to_gray (Image, GrayImage) 9 | *使用平滑滤波器对原始图像进行适当平滑 10 | mean_image (GrayImage, ImageMean, 30,30) 11 | *动态阈值分割,提取字符区域 12 | dyn_threshold (GrayImage, ImageMean, RegionDynThresh, 30, 'not_equal') 13 | *腐蚀操作,去除杂点 14 | erosion_circle (RegionDynThresh, RegionClosing, 1.5) 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /6-7.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image,'data/holes.jpg') 7 | rgb1_to_gray (Image, GrayImage) 8 | *设置矩形,选择感兴趣区域 9 | gen_rectangle1 (Rectangle, 170, 80, 370, 510) 10 | reduce_domain (GrayImage, Rectangle, ImageReduced) 11 | var_threshold (ImageReduced, Region, 15, 15, 0.2, 35, 'dark') 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /6-8.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Char, 'data/char') 7 | rgb1_to_gray (Char, GrayImage) 8 | char_threshold (GrayImage, GrayImage, Characters, 6, 95, Threshold) 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /6-9.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image(Image,'data/village') 7 | *对原图进行了均值处理,选用了5*5的滤波器 8 | mean_image(Image,Mean,5,5) 9 | *使用了区域生长算子寻找颜色相似的邻域 10 | regiongrowing(Mean,Regions,1,1,3.0,100) 11 | *对提取区域做了形态学处理,使区域更加平滑和完整 12 | closing_circle (Regions, RegionClosing, 3.5) 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /7-3.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/beads.jpg') 7 | decompose3 (Image, Red, Green, Blue) 8 | sub_image (Blue, Red, BlueSubRed, 1, 128) 9 | sub_image (BlueSubRed, Green, BlueSubRedGreen, 1, 128) 10 | threshold (BlueSubRedGreen, BlueRegion, 230, 255) 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /7-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/m105') 7 | *将原始图像进行通道分离,得到红绿蓝三个分量的图像 8 | decompose3 (Image, Red, Green, Blue) 9 | *将RGB三个分量的图像转化为H(色调)、S(饱和度)、V(明度)的图像 10 | trans_from_rgb (Red, Green, Blue, ImageResultH, ImageResultS, ImageResultI, 'hsv') 11 | *对饱和度图像阈值处理,分割出高饱和度区域,即字符区域的大致范围 12 | threshold (ImageResultS, High, 192,255) 13 | *区域分割, 14 | reduce_domain (ImageResultH, High, ImageReduced) 15 | *并进行膨胀操作 16 | dilation_circle (ImageReduced, RegionDilation, 3.5) 17 | *开运算,使边缘更清晰 18 | opening_circle (RegionDilation, RegionChars, 5.5) 19 | dev_clear_window () 20 | dev_display (RegionChars) 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /7-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image(Image, 'data/cloth') 7 | *将图像分解成RGB三个通道 8 | decompose3 (Image, Image1, Image2, Image3) 9 | *将RGB三个通道的图像,转化为HSV图像空间 10 | trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv') 11 | *进行纹理检测。 12 | *其中选择的滤波器类型是‘ls’,即行方向用‘level’,列方向用‘spot’进行检测。 13 | *这种滤波器类型适合检测垂直方向上的缺陷。 14 | texture_laws (ImageResult2, ImageTextureLS, 'ls', 2, 7) 15 | *对滤波器处理后的图像进行均值化,使图像更平滑,缺陷区域明显 16 | mean_image (ImageTextureLS, ImageMean, 11, 11) 17 | *对检测出的缺陷区域进行形态学处理并显示出来 18 | threshold (ImageMean, Regions, 60, 255) 19 | *将符合条件的区域分隔成独立区域 20 | connection(Regions, ConnectedRegions) 21 | *计算各区域的面积,提取出面积最大的区域 22 | area_center (ConnectedRegions, Area, Row, Column) 23 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', max(Area), 99999) 24 | *做闭运算,提取出缺陷区域 25 | closing_circle(SelectedRegions, RegionClosing, 11.5) 26 | dev_clear_window () 27 | dev_display (RegionClosing) 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /8-10.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (ImageColor, 'data/village.jpg') 7 | *将原始图像转换为灰度图像作为形态学处理的输入 8 | rgb1_to_gray (ImageColor, Image) 9 | *进行灰度图像腐蚀操作 10 | gray_erosion_shape (Image, ImageMin, 11, 11, 'octagon') 11 | *进行灰度图像膨胀操作 12 | gray_dilation_shape (Image, ImageMax, 11, 11, 'octagon') 13 | *进行灰度图像开运算操作 14 | gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon') 15 | *进行灰度图像闭运算操作 16 | gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon') 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /8-12.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取图像,将其转化为灰度图像并显示出来 8 | read_image (Image, 'data/logs') 9 | get_image_size (Image, Width, Height) 10 | rgb1_to_gray(Image,grayImage) 11 | *进行全局阈值分割,将亮色区域提取出来 12 | threshold (grayImage, Bright, 60, 255) 13 | *开运算去除边缘毛刺 14 | opening_rectangle1 (Bright, Cut, 1, 7) 15 | *将非连通区域分割成独立区域 16 | connection (Cut, ConnectedRegions) 17 | *根据面积选择表示截面比较小的木材的区域 18 | select_shape (ConnectedRegions, smallRegions, 'area', 'and', 500, 20000) 19 | *对粘连区域做腐蚀操作,根据腐蚀的情况和面积,选出截面区域 20 | *count_obj(SelectedRegions2,number1) 21 | *根据面积选择表示截面比较大的木材的区域,可能有粘连和区域重叠的情况 22 | select_shape (ConnectedRegions, largeRegions, 'area', 'and', 20000, 1000000) 23 | erosion_circle(largeRegions,erisionedLargeRegions,8.5) 24 | *将非连通区域分割成独立区域 25 | connection (erisionedLargeRegions, ConnectedRegions2) 26 | *再次选择符合面积条件的区域,排除杂点 27 | select_shape (ConnectedRegions2, SelectedRegions3, 'area', 'and', 150, 200000) 28 | *区域合并 29 | concat_obj(smallRegions, SelectedRegions3, ObjectsConcat) 30 | *区域计数 31 | count_obj(ObjectsConcat,number3) 32 | *创建窗口用于显示结果 33 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle) 34 | dev_display(ObjectsConcat) 35 | set_display_font (WindowHandle,18, 'mono', 'true', 'true') 36 | *显示计数的结果,程序结束 37 | disp_message(WindowHandle, 'Number of logs : '+number3, 'image', 30, 50, 'blue', 'true') 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /8-2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/board') 7 | rgb1_to_gray (Image, GrayImage) 8 | threshold (GrayImage, Region, 100, 255) 9 | gen_image_proto (GrayImage, ImageCleared, 0) 10 | erosion_circle (Region, RegionErosion, 7.5) 11 | erosion_circle (RegionErosion, RegionErosion2, 6.5) 12 | dev_clear_window () 13 | dev_display (RegionErosion2) 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /8-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image, 'data/board') 7 | rgb1_to_gray (Image, GrayImage) 8 | threshold (GrayImage, Region, 100, 255) 9 | erosion_circle (Region, RegionErosion, 7.5) 10 | erosion_circle (RegionErosion, RegionErosion2, 6.5) 11 | erosion_circle (RegionErosion2, RegionErosion3, 5.5) 12 | *膨胀操作 13 | dilation_circle (RegionErosion3, RegionDilation, 23.5) 14 | dev_clear_window () 15 | dev_display (RegionDilation) 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /8-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *读取待检测的图像 7 | read_image (Image,'data/board') 8 | *将图像转换为单通道的灰度图像 9 | rgb1_to_gray(Image, GrayImage) 10 | *创建矩形区域 11 | gen_rectangle1 (Rectangle, 259, 87, 957, 909) 12 | *进行裁剪,将感兴趣区域单独提取出来 13 | reduce_domain (GrayImage, Rectangle, ImageReduced) 14 | *使用阈值处理将灰度值于设定的像素选取出来 15 | threshold(ImageReduced,Light,85,255) 16 | *创建圆形结构元素,用于开运算 17 | gen_circle(StructElement,6,6,7) 18 | *进行开运算去除背景中的杂点 19 | opening(Light,StructElement,Large) 20 | dev_clear_window () 21 | dev_display (Large) 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /8-6.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image,'data/shapes') 7 | *将图像进行通道分解,分别转换为三个通道的RGB图像 8 | decompose3 (Image, Red, Green, Blue) 9 | *使用颜色转换将RGB三个通道图像转化为HSV通道的图像 10 | trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv') 11 | *对饱和度通道的图像进行阈值处理 12 | threshold (Saturation, Regions, 180, 255) 13 | *创建圆形结构元素用于闭运算 14 | gen_circle(StructElement,10,10,10) 15 | *对图像中较亮的区域进行闭运算处理,填补了各自轮廓中的小空隙 16 | closing(Regions,StructElement,Large) 17 | 18 | dev_clear_window () 19 | dev_display (Large) 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /8-7.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image,'data/board') 7 | rgb1_to_gray(Image, GrayImage) 8 | gen_rectangle1 (Rectangle, 259, 87, 957, 909) 9 | reduce_domain (GrayImage, Rectangle, ImageReduced) 10 | threshold(ImageReduced,Light,85,255) 11 | gen_circle(StructElement,6,6,7) 12 | *清理显示窗口,以便显示结果 13 | dev_clear_window () 14 | *进行顶帽运算,得到了开运算中移除的局部像素并高亮显示 15 | top_hat (Light, StructElement, RegionTopHat) 16 | 17 | dev_clear_window () 18 | dev_display (RegionTopHat) 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /8-8.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | read_image (Image,'data/shapes') 7 | decompose3 (Image, Red, Green, Blue) 8 | trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv') 9 | threshold (Saturation, Regions, 180, 255) 10 | gen_circle(StructElement,10,10,10) 11 | *清理显示窗口,以便显示结果 12 | dev_clear_window () 13 | *清理显示窗口,以便显示结果 14 | bottom_hat (Regions, StructElement, RegionBottomHat) 15 | dev_clear_window () 16 | dev_display (RegionBottomHat) 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /8-9.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *读取一幅光照不均匀的亮背景图像,这里选取的是一幅彩色图像 7 | read_image (Image,'data/shapes') 8 | *变换之前转为灰度图像 9 | rgb1_to_gray (Image, GrayImage) 10 | *将图像通过阈值处理转化为二值化图像。 11 | threshold (GrayImage, Regions, 145, 255) 12 | *创建一个结构元素,这里创建的是一个圆形 13 | gen_circle(StructElement,10,10,100) 14 | *清空窗口便于显示结果 15 | dev_clear_window () 16 | *进行底帽操作,提取出较暗区域 17 | bottom_hat (Regions, StructElement, RegionBottomHat) 18 | *将较暗区域从原图中提取出来 19 | reduce_domain (Image, RegionBottomHat, ImageReduced) 20 | 21 | dev_clear_window () 22 | dev_display (ImageReduced) 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /9-1.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取图片 8 | read_image(Image, 'data/holes') 9 | *设置窗口属性,为了获取窗口句柄,供后面显示文字用 10 | get_image_size (Image, Width, Height) 11 | *创建新窗口 12 | dev_open_window (0, 0, Width, Height, 'black', WindowID) 13 | *将图像转化为单通道灰度图 14 | rgb1_to_gray (Image, GrayImage) 15 | *创建矩形选区,选择感兴趣部分 16 | gen_rectangle1 (Rectangle, 180, 83, 371, 522) 17 | reduce_domain (GrayImage, Rectangle, ROI) 18 | *阈值处理,提取图中深色部分,也就是文字部分,这里阈值设置为50,基本可以取出所有黑色文字 19 | threshold ( ROI, Region, 0, 80) 20 | *gen_image_proto (ImageReduced, ImageCleared, 0) 21 | *dev_display (Region) 22 | *提取中的整个区域中将不相连的部分分割成独立的区域 23 | connection (Region, ConnectedRegions) 24 | *获取不相连的区域的数量 25 | count_obj (ConnectedRegions, Num) 26 | *计算所有不相连区域的面积和中心点坐标。Area表示面积, Row和 Column分别表示中心点坐标 27 | area_center (ConnectedRegions, Area, Row, Column) 28 | *打印各区域的面积 29 | for i := 1 to Num by 1 30 | dev_set_color ('red') 31 | select_obj (ConnectedRegions, ObjectSelected, i) 32 | *设定了输出文字的起始坐标点 33 | set_tposition (WindowID, Row[i - 1]+40, Column[i - 1]) 34 | *设置打印文字的颜色 35 | dev_set_color ('blue') 36 | *设置字体 37 | set_font (WindowID, '-System-32-*-*-0-0-0-1-GB2312_CHARSET-') 38 | *输出文字内容,即该区域的面积 39 | write_string (WindowID, Area[i-1]) 40 | endfor 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /9-11.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取输入的图片 8 | read_image (Image, 'data/board') 9 | *将输入的彩色图像转为黑白图像 10 | rgb1_to_gray (Image, GrayImage) 11 | get_image_size (GrayImage, Width, Height) 12 | *创建一个与输入图像同样大小的窗口 13 | dev_open_window (0, 0, Width/4, Height/4, 'black', WindowID) 14 | *设定画笔宽度 15 | dev_set_line_width (5) 16 | *创建两个窗口用于显示参数计算的结果 17 | dev_open_window (0, 512, 320, 320, 'black', WindowID1) 18 | dev_open_window (512, 512, 320, 320, 'black', WindowID2) 19 | *分别设置两个矩阵,选择不同的两部分区域 20 | gen_rectangle1 (Rectangle1, 200,10, 380, 190) 21 | gen_rectangle1 (Rectangle2, 580, 650, 730, 800) 22 | *分别对两个矩形求取灰度共生矩阵Matrix1和Matrix2 23 | gen_cooc_matrix (Rectangle1, GrayImage, Matrix1, 6, 0) 24 | gen_cooc_matrix (Rectangle2, GrayImage, Matrix2, 6, 0) 25 | *分别对Matrix1和Matrix2提取灰度特征参数 26 | cooc_feature_matrix (Matrix1, Energy1, Correlation1, Homogeneity1, Contrast1) 27 | cooc_feature_matrix (Matrix2, Energy2, Correlation2, Homogeneity2, Contrast2) 28 | *采取另一种方式,直接对矩阵2的图像求灰度特征参数,结果与上面两步计算出的参数是一致的 29 | cooc_feature_image (Rectangle2, GrayImage, 6, 0, Energy3, Correlation3, Homogeneity3, Contrast3) 30 | *显示图像窗口和两个矩形的灰度共生矩阵 31 | dev_set_window (WindowID) 32 | dev_set_draw ('margin') 33 | dev_display (GrayImage) 34 | dev_display (Rectangle1) 35 | dev_set_color('yellow') 36 | dev_display (Rectangle2) 37 | dev_set_window (WindowID1) 38 | dev_display (Matrix1) 39 | *以字符串的形式,分别在两个矩阵的对应窗口上显示灰度特征值的计算结果 40 | String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: '] 41 | dev_set_color('red') 42 | disp_message (WindowID1, String$'-14s' + [Energy1,Correlation1,Homogeneity1,Contrast1]$'6.3f', 'window', 12, 12, 'white', 'false') 43 | dev_set_window (WindowID2) 44 | dev_display (Matrix2) 45 | dev_set_color('yellow') 46 | String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: '] 47 | disp_message (WindowID2, String$'-14s' + [Energy2,Correlation2,Homogeneity2,Contrast2]$'6.3f', 'window', 12, 12, 'white', 'false') 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /9-2.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *清空显示窗口 7 | dev_close_window () 8 | *读取包含孔洞的图片 9 | read_image (Image, 'data/holes2') 10 | *打开新的显示窗口 11 | dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) 12 | *将彩色图像转化为灰度图像,这是为了后面的图像二值化 13 | rgb1_to_gray (Image, GrayImage) 14 | *进行阈值处理,提取出图中较亮的有封闭区域的(孔洞以外)背景区域 15 | threshold (GrayImage, Region, 50,255) 16 | *将背景区域作为area_holes算子的输入,计算所有孔洞的面积 17 | area_holes (Region, Area) 18 | *将面积计算结果以字符串形式显示在窗口中 19 | disp_message (WindowHandle, 'Size of holes: ' + Area + ' pixel', 'window', 10, 10, 'black', 'true') 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /9-3.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *清空显示窗口 7 | dev_close_window () 8 | *读取待检测的图像 9 | read_image (Image, 'data/crossShape') 10 | dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) 11 | *设置系统绘制的颜色 12 | dev_set_color ('white') 13 | *将彩色图像转化为灰度图像,这是为了后面的图像二值化 14 | rgb1_to_gray (Image, GrayImage) 15 | *创建矩形选区,选择感兴趣部分 16 | gen_rectangle1 (Rectangle, 100, 127, 325, 490) 17 | reduce_domain (GrayImage, Rectangle, ROI) 18 | gen_image_proto (ROI, ImageCleared, 0) 19 | *进行阈值处理,提取出图中较暗的包含了孔洞的区域 20 | threshold (ROI, Regions, 50, 255) 21 | *将其不连通的部分独立分割出来,成为一组区域 22 | connection (Regions, ConnectedRegions) 23 | *设置系统绘制的颜色。为了标记选择的区域 24 | dev_set_color ('yellow') 25 | *方法一 26 | *将阈值处理的结果区域作为select_shape算子的输入,根据区域的宽度,选择出目标 27 | select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 1000, 99999) 28 | *方法二 29 | *先计算面积,再选择出面积最大的目标 30 | area_center(ConnectedRegions, Area, Row, Column) 31 | select_shape (ConnectedRegions, SelectedRegions2, 'area', 'and', max(Area), 99999) 32 | *方法三 33 | select_shape_std (SelectedRegions1, SelectedRegion3, 'max_area', 70) 34 | dev_clear_window () 35 | dev_display (SelectedRegion3) 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /9-4.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | *读取图像 8 | read_image (Image, 'data/crossShape') 9 | get_image_size (Image, Width, Height) 10 | dev_open_window (0, 0, Width, Height, 'black', WindowID) 11 | rgb1_to_gray (Image, GrayImage) 12 | *创建矩形选区,选择感兴趣部分 13 | gen_rectangle1 (Rectangle, 100, 127, 325, 490) 14 | reduce_domain (GrayImage, Rectangle, ROI) 15 | *进行阈值处理,提取出图中较暗的包含了孔洞的区域 16 | threshold (ROI, Regions, 50, 255) 17 | *将其不连通的部分独立分割出来,成为一组区域 18 | connection (Regions, ConnectedRegions) 19 | select_shape_std (ConnectedRegions, SelectedRegion3, 'max_area', 70) 20 | dev_set_draw ('fill') 21 | *求出了三个区域的最大内接圆的中心和半径 22 | inner_circle(SelectedRegion3,Row,Column,Radius) 23 | *绘制圆形 24 | gen_circle(Circles,Row,Column,Radius) 25 | dev_set_window (WindowID) 26 | *gen_image_proto (ROI, ImageCleared, 0) 27 | *dev_display (SelectedRegion3) 28 | *绘制形状的边缘 29 | dev_set_draw ('margin') 30 | dev_set_line_width (3) 31 | *显示内接圆形 32 | dev_display (Image) 33 | dev_display (Circles) 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /9-5.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | dev_close_window () 7 | read_image (Image, 'data/garlic2') 8 | get_image_size (Image, Width, Height) 9 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle) 10 | rgb1_to_gray (Image, GrayImage) 11 | *使阈值处理提取出了较暗的区域 12 | threshold (GrayImage, Region, 100, 255) 13 | *将非连通区域分割成一组区域的集合 14 | connection (Region, ConnectedRegions) 15 | *利用面积特征,将比较大快的区域分割出来 16 | select_shape(ConnectedRegions,selectRegion,'area','and',50000,200000) 17 | *求最小外接矩形 18 | smallest_rectangle2 (selectRegion, Row1, Column1, Phi, Length1, Length2) 19 | *根据矩形参数创建举行的轮廓 20 | gen_rectangle2_contour_xld (Rectangle1, Row1, Column1, Phi, Length1, Length2) 21 | *显示最小外接矩形 22 | dev_set_window (WindowHandle) 23 | dev_set_draw ('margin') 24 | dev_set_line_width (3) 25 | dev_display (Image) 26 | dev_display (Rectangle1) 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /9-9.hdev: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | *读取输入图像 7 | read_image (Image, 'data/village') 8 | *获取原始图像的宽和高 9 | get_image_size (Image, Width, Height) 10 | *创建同尺寸的显示图像的窗口 11 | dev_open_window (0, 0, Width, Height, 'white', WindowID) 12 | *将图像转化为灰度图像 13 | rgb1_to_gray (Image, GrayImage) 14 | *使用均值滤波对灰度图像进行平滑,以去除细节杂点 15 | median_image (GrayImage, ImageMedian, 'circle', 2, 'mirrored') 16 | *进行阈值处理,提取出较亮部分 17 | threshold (ImageMedian, BrightRegion, 180, 255) 18 | *使用开运算使各区域分离 19 | opening_circle (BrightRegion, RegionClosing, 6.5) 20 | *将不相连通的区域分割开来 21 | connection (RegionClosing, BrightRestConnection) 22 | *将面积较大的区域提取出来 23 | select_shape (BrightRestConnection, SelectedRegions1, 'area', 'and', 5000, 99999) 24 | *获取这些区域的均值和偏差。由于湖面区域灰度值比较平滑,灰度偏差会比较小 25 | intensity (SelectedRegions1, ImageMedian, Mean, Deviation) 26 | *以灰度偏差为条件,选出符合条件的区域 27 | select_gray (SelectedRegions1, ImageMedian, SelectedRegions, 'deviation', 'and', 4, 10) 28 | dev_clear_window () 29 | dev_display (GrayImage) 30 | dev_display (SelectedRegions) 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /data/arrow1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/arrow1.jpg -------------------------------------------------------------------------------- /data/arrow2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/arrow2.jpg -------------------------------------------------------------------------------- /data/beads.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/beads.jpg -------------------------------------------------------------------------------- /data/board.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/board.jpg -------------------------------------------------------------------------------- /data/boardEqu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/boardEqu.jpg -------------------------------------------------------------------------------- /data/bolts-0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/bolts-0.jpg -------------------------------------------------------------------------------- /data/bolts-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/bolts-1.jpg -------------------------------------------------------------------------------- /data/carmex-0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/carmex-0.jpg -------------------------------------------------------------------------------- /data/carmex-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/carmex-1.jpg -------------------------------------------------------------------------------- /data/char.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/char.jpg -------------------------------------------------------------------------------- /data/chess.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/chess.jpg -------------------------------------------------------------------------------- /data/cloth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth.jpg -------------------------------------------------------------------------------- /data/cloth1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth1.jpg -------------------------------------------------------------------------------- /data/cloth2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth2.jpg -------------------------------------------------------------------------------- /data/cloth3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth3.jpg -------------------------------------------------------------------------------- /data/cloth4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth4.jpg -------------------------------------------------------------------------------- /data/codes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/codes.jpg -------------------------------------------------------------------------------- /data/cream.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cream.jpg -------------------------------------------------------------------------------- /data/creamlabel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/creamlabel.jpg -------------------------------------------------------------------------------- /data/crossShape.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/crossShape.jpg -------------------------------------------------------------------------------- /data/defocusComponnet.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/defocusComponnet.jpg -------------------------------------------------------------------------------- /data/disparity.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/disparity.jpg -------------------------------------------------------------------------------- /data/display.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/display.jpg -------------------------------------------------------------------------------- /data/flower.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/flower.jpg -------------------------------------------------------------------------------- /data/garlic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/garlic.jpg -------------------------------------------------------------------------------- /data/garlic2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/garlic2.jpg -------------------------------------------------------------------------------- /data/holes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holes.jpg -------------------------------------------------------------------------------- /data/holes2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holes2.jpg -------------------------------------------------------------------------------- /data/holesBoard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holesBoard.jpg -------------------------------------------------------------------------------- /data/holesBoardNoise.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holesBoardNoise.jpg -------------------------------------------------------------------------------- /data/label.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/label.jpg -------------------------------------------------------------------------------- /data/labelShape-0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/labelShape-0.jpg -------------------------------------------------------------------------------- /data/labelShape-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/labelShape-1.jpg -------------------------------------------------------------------------------- /data/logs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/logs.jpg -------------------------------------------------------------------------------- /data/m1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m1.jpg -------------------------------------------------------------------------------- /data/m105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m105.jpg -------------------------------------------------------------------------------- /data/m2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m2.jpg -------------------------------------------------------------------------------- /data/m3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m3.jpg -------------------------------------------------------------------------------- /data/m4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m4.jpg -------------------------------------------------------------------------------- /data/m5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m5.jpg -------------------------------------------------------------------------------- /data/marker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/marker.jpg -------------------------------------------------------------------------------- /data/meter1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/meter1.jpg -------------------------------------------------------------------------------- /data/meter2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/meter2.jpg -------------------------------------------------------------------------------- /data/modelWords.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/modelWords.jpg -------------------------------------------------------------------------------- /data/pen01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen01.jpg -------------------------------------------------------------------------------- /data/pen02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen02.jpg -------------------------------------------------------------------------------- /data/pen1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen1.jpg -------------------------------------------------------------------------------- /data/pen2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen2.jpg -------------------------------------------------------------------------------- /data/pen3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen3.jpg -------------------------------------------------------------------------------- /data/shapes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/shapes.jpg -------------------------------------------------------------------------------- /data/stereo-left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/stereo-left.jpg -------------------------------------------------------------------------------- /data/stereo-right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/stereo-right.jpg -------------------------------------------------------------------------------- /data/testWords.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/testWords.jpg -------------------------------------------------------------------------------- /data/text.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/text.jpg -------------------------------------------------------------------------------- /data/village.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/village.jpg -------------------------------------------------------------------------------- /data/woodboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/woodboard.jpg -------------------------------------------------------------------------------- /data/yszx.omc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/yszx.omc -------------------------------------------------------------------------------- /data/yszx.trf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/yszx.trf --------------------------------------------------------------------------------