1.像素 2592x1944 相当于 500万像素
2.图像 本质是二位数组(内存里面是一维数组)
图像越大 分别率越大
3.特征对比相对大的 方便寻找大的 灰度图片进行处理
- 图像->区域->图像
函数
read_image() 从磁盘读取文件
get_image_size() 获取图片大小
dev_close_window() 关闭显示图片的窗口
dev_open_window() 打开显示图片窗口
threshold() 根据灰度值查找区域 全局
dyn_threshold() 局部域值
binary_threshold()
mean_image() 均值滤波
connection() 打散查找的区域
select_shape() 按照打散的区域按照特征值查找
fill_up() 填充区域
reduce_domain() 抠图
threshold)sub_pix() 亚像素灰度值查找
select_contours_xld() 按照亚像素查找线的长度
count_obj() 按照亚像素获取查找结果
shape_trans() 对形状进行仿射变换。它可以对点、直线、圆、矩形等形状进行平移、旋转和缩放等操作opening_circle() 开运算rgb_to_gray() 彩色图转灰度图
p7 BLOB分析
图像处理流程
1 获取图像
2 图像分割
3 区域处理
4 特征提取
秘诀:定位特征 逐步求精
p8
p9
图像分割介绍
1 灰度直方图
2 阈值分割
threshold
binary_threshold
mean_image + dyn_threshold
fast_threshold
auto_threshold
var_threshold
3区域集合运算及变换1集合运算union1union2differenceintersection2区域变换connectionfill_upshape_transskeletiom4形态学opening 开closing 闭dilation 膨胀erosion 腐蚀boundary
p10
p11
画ROI区域和区域生成
保存区域,读取区域
数据值及对象输出
联合Vc进行变成输出结果,进行代码架构
1画ROI区域并生成区域生成区域draw_circlegen_circledraw_ellipsegen_ellipsedraw_rectangle1gen_rectangle1draw_rectangle2gen_rectangle2draw_regiondraw_linegen_region_linegen_region_points其他gen_grid_regiongen_checker_regiongen_region_hline2保存区域读取区域(小件左右检测)read_regionwrite_region3生成空对象,向空对象中添加对象gen_empty_regiongen_empty_objconcat_obj4区域间距离点到点 distance_pp点到直线 distance_pl点到区域的最长最短 distance_pr直线到区域最长最短 distance_lr区域与区域最短 distance_rrhttps://www.bilibili.com/video/BV1x5411H7Ns/?p=11&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p12
p13
p14
p15
p16
https://www.bilibili.com/video/BV1x5411H7Ns?p=16&vd_source=9ed5e7be5d8180766946b38de14a1781
write_region 写区域图片
p17
p19
https://www.bilibili.com/video/BV1x5411H7Ns?p=19&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
图片 image hobject
区域 region
数组 image := [,]
变量 hTuplex的像素当量和y的像素当量不一样工作流程
1采集图片
2预处理 二值化 形态学
3求出图像中心点 特征学
4防射变换 变成机械坐标
p22
1几何变换
平移 move_region
缩放 zoom_region
镜像 mirror_region
倒置 transpose_region
极坐标与笛卡尔坐标互转 polar_trans_region, polar_trans_region_inv
closing 闭运算 --> 先膨胀在腐蚀 去掉目标内的孔洞
opening 开运算 --> 先腐蚀在膨胀 去掉目标外的孔洞通常当有噪声的图像使用阈值二值化后,所得到的边界是很不平滑的,物体区域具有一些错判的孔洞,背景区域散布着一些小的噪声
物体,连续的开和闭运算可用显著的改善这种情况boundary 边界
intersection 相交erosion 腐蚀
scale 比例
zoom 快速移动shape_trans 区域变换invert 反转光度立体法OCR识别是把区域抠出来
p23
https://www.bilibili.com/video/BV1x5411H7Ns/?p=23&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
仿射变换
区域的任意变换 affine_trans_region
创建二维变换矩阵 hom_mat2d_identity
平移 hom_mat2d_translate
缩放 hom_mat2d_scale
旋转 home_ma2d_rotate
刚性防射变换 vector_to_rigid
拓展图像变换 affine_trans_image
分为三步1创建矩阵
p24
https://www.bilibili.com/video/BV1x5411H7Ns/?p=24&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
difference 剪掉区域检测常用方案 结合一起使用1 面积2 灰度值contours 轮廓
segment 分割
complement 补集
intensity 强度means 方法
deviation 差
p25 一维码识别
https://www.bilibili.com/video/BV1x5411H7Ns/?p=25&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p26
https://www.bilibili.com/video/BV1x5411H7Ns?p=26&vd_source=9ed5e7be5d8180766946b38de14a1781
candidate 候选
variable 多样
cylinder 圆柱体
majory 多数的
determine 绝对
decode 解码
p28
https://www.bilibili.com/video/BV1x5411H7Ns/?p=28&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
二维码的流程和方法
掌握二维码的图像滤波symbol 象征
XLD 边缘轮廓
p29
https://www.bilibili.com/video/BV1x5411H7Ns?p=29&vd_source=9ed5e7be5d8180766946b38de14a1781
recognition 识别
enhanced 增强模式
morphology 形态学
polaryty 极性的
contrast 对比度均值滤波 mean_image
中值滤波 median_image
腐蚀 erosion
膨胀 dilation//不是一个正常屏幕拍照的情况
1.极坐标转换2.投射变换
hom_vector_hom_mat2d(...) //创建二维矩阵
projective_trans_image(...) //投射变换https://www.bilibili.com/video/BV1x5411H7Ns/?p=29&vd_source=9ed5e7be5d8180766946b38de14a1781时间:52.35灰度图没有前景背景
p30
OCR 光学字符识别
使用Halcon自带的.omc文件字库(训练好的)invert_image() 反转像素图片gray_range_rect() 灰度范围
p31
https://www.bilibili.com/video/BV1x5411H7Ns/?p=31&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
ocr需要白底黑字的图像,所以要反转
p32
https://www.bilibili.com/video/BV1x5411H7Ns/?p=32&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
FontNmae := ‘Industrial_0-9A-Z_NoRej’
read_ocr_class_mlp(FontNmae, OCRHandle)
for i:=1 to NumberC by 1
select_obj(SortedRegions, ObjectSelected, i)
do_ocr_single_class_mlp(ObjectSelected, ImageInvert, OCRHandle, 1, Class, Confidence)
disp_message(WindowHandle, Class, ‘image’, MeanRow-50, Column[i-1]-10, ‘yellow’, ‘false’)
endfor
decompose3(...)
clip_region(...) 剪切
sub_image(...) 图像减法
intensity() //灰度平均值
expand_gray_ref() //灰度膨胀
paint_region(...) //将图片与相交区域之外填充 可用做白底黑字
p33
https://www.bilibili.com/video/BV1x5411H7Ns/?p=33&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p34
gray_opening_rect(...)
fill_up_shape()
delete_file()
append_ocr_trainf(...) //训练文件训练过程1生成训练用的文件append_ocr_trainf将区域,图像和对应的字符装载到该文件中2创建训练模型并进行训练create_ocr_class_mlp,trainf_ocr_class_mlp3保存结果到训练文件中write_ocr_class_mlp4清空缓存clear_ocr_class_mlp
p35
https://www.bilibili.com/video/BV1x5411H7Ns/?p=35&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p36
ocr助手使用
p37 图像滤波需求
https://www.bilibili.com/video/BV1x5411H7Ns?p=37&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
blob分析 --- 二值化的过程1获取图片
2图像预处理平滑处理均值滤波 mean_image mean_n中值滤波 median_image median_rectRank滤波(秩序值滤波) rank_image rank_rect高斯滤波 gauss_filter图像平滑 smooth_image图像增强均值增强 emphasize illuminate一致性扩散增强 coherence_enhancing_diff比例增强 scale_image_max冲击滤波 shock_filter图像算术图像加法 add_image图像减法 sub_image图像乘法 milt_image图像除法 div_image图像翻转 inner_image图像灰度取大 max_image图像灰度取小 min_image绘图比例拉伸 scale_image图像几何变换仿射变换 affine_trans_image镜像变换 mirror_image透射变换 projective_trans_image projective_trans_image_size极坐标变换 polar_trans_image_ext图像旋转 rotate_image缩小图像 zoom_image_size3图像分割
4区域处理 集合运算 complement difference intersection symm_difference union1 union2几何运算 affine_trans_image mirror_region move_region polar_trans_region polar_trans_region_invprojective_trans_imagetranspose_regionzoom_region区域变换background_segclip_regionclip_region_relclosest_point_transformconnectiondistance_transformeliminate_runsexpand_regionfill_upfill_up_shapehamming_change_regioninterjacentjunctions_skeletionmerge_regions_line_scanpartion_dynamicpartion_rectanglerank_regionremove_noise_regionshape_transskeleton split_skeleton_linessplit_skeleton_region特征过滤area_centerarea_holescircularitycompactnessconnect_and_holesconnectioncontlengthconvexitydiameter_regioneccentricityelliptic_axiseuler_numberfind_neighborsget_region_indexget_region_thicknesshamming_distanceinner_circleinner_rectanglemoments_region_2ndmoments_region_2nd_invarmoments_region_center_invarorientation_regionrectangularityregion_featuresroundnessrunlength_distributionrunlength_featuresselect_region_pointsselect_region_spatialselect_shapeselect_shape_protoselect_shape_stdsmallest_circlesmallest_rectangle1smallest_rectangle2spatial_relation形态学boundaryclosingclosing_circleclosing_rectangle1dialation_circledialation_rectangle1dilation1erosion_circleerosion_recrangle1gen_struct_elementsopeningopening_circleopening_rectangletop_hat5特征提取定位特征找出数据
p38
https://www.bilibili.com/video/BV1x5411H7Ns?p=38&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
平滑处理mean_image()edges_sub_pix(...) 边缘提取edges 边缘rank_rect 等级
gauss_filter 高斯滤波 对周围对象进行加权平均值
p39
https://www.bilibili.com/video/BV1x5411H7Ns?p=39&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
图像增强边缘起伏不大的增强 黑的更黑 白的更白emphasize(...) 增强模式coherence_enhancing_diff
min_max_gray(...) 获取最大最小灰度值sub_image 可用于一个产品两次点胶前后判断,加工前后判断
p42
gray_erosion_rect(…) 类似秩序值滤波
gray_disc_se
gray_closing
gray_closing_rect
gray_closing_shape
gray_dilation_rect
gray_dilation_shape
gray_erosion_rect
gray_erosion_shape
gray_opening
gray_opening_shape
gray_opening_rect
gray_rangge_rect
gray_tophat
p43
图像截取合并
抠图
crop_part(...) 坐标不是原图
reduce_domain(...) 坐标还是原图拼图
tile_images_offset
tile_images校验畸变桶状畸变枕形畸变畸变调整change_rafial_distortion_image(...)https://www.bilibili.com/video/BV1x5411H7Ns/?p=43&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p44
图像灰度特征
paint_region(...) 将某区域的灰度值重新填充新的灰度值
paint_gray(...) 把一幅图像的灰度填充到另一幅图中生成新的图像select_gray(...) 灰度区域特征选择entropy 熵 - 体系混乱程度的变量
https://www.bilibili.com/video/BV1x5411H7Ns?p=44&vd_source=9ed5e7be5d8180766946b38de14a1781c++面试题
https://www.bilibili.com/video/BV1CE411r7oj/?p=34&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781intensity(...) 平均灰度和方差
area_center_gray(...)
gray_histo(...) 灰度直方图
gen_region_histo(....)
p45
使用相机的sdk进行开发HAcq开头都是相机的文件
p46
重点:介绍相机的SDK开发流程
调用相机的sdk --稳定性和速度项目初期使用HALCON 到后期使用相机的sdk 提高速度和稳定性1安装相机1)装相机驱动(常用接口 usb2.0,usb3.0,GIGE,CAMLINK,1394A,1394B2)若有采集卡,还需要安装卡的驱动3)测试驱动是否找到设备4)测试厂商提供的测试软件5)找到相机的SDK(dll,lib等),并测试提供的Demo2试用相机1)用厂商的采集软件打开相机抓图2)用halcon的采集助手抓图3相机的设置配置1)分辨率和感兴趣区域2)曝光(曝光时间第可用提高速度)及增益3)帧率(1s采集多少图)4)白平衡(彩色相机需要白平衡)5)触发方式(连续、软触发、硬触发)4看提供的例程,看抓图流程并自己写代码采图,然后转成halcon的HObject变量1)相机厂商一般会提供MFC或者console例程2)选择一个可用采图的程序打开运行调试,分析执行过程3)自己创建一个新的从新开始加入头文件,库文件,及动态链接库进行采图测试4)获取图像指针,使用halcon函数gen_image1_extern,gen_image3_extern等函数转成HObject变量并将其显示在窗口上5使用单张采图模式将相机SDK中需要使用的代码接口做到自己的项目中1)先调试demo中的Basic项目
p47
写一点调试一点
p48
回调函数采图
1回调函数概念
2先分析SDK中使用回调函数进行采图1)找到使用回调函数的例子Basic,并调试看结果3将SDK中的代码转码成自己工程中进行采图1)添加回调函数2)在初始化时登记回调函数到驱动3)在回调函数中将采集的图像数据转成halcon变量4)在抓图中直接使用图像变量,建议使用事件同步
p50
代码复用+拓展
p51
尽量选择畸变少的镜头,尽量不矫畸变
p53
使用标定板进行畸变矫正
p55
p58
crop_part 取一部分
threshold_sub_pix(...) 阈值取边缘 轮廓convex 凸性
contours 轮廓平滑轮廓 smooth_contours_xld
形状变换 shape_trans_xld
封闭轮廓 close_contours_xld
对轮廓排序 sort_contours_xld
修剪出矩形区域的轮廓 clip_contours_xld
修剪出轮廓两端 clip_end_points_contours_xld按直线和圆弧的特性分割轮廓 segment_contours_xld
生成多边形 gen_contours_polygon_xld
对象组合 concat_obj
高斯轮廓线 line_gauss() adjacent 临近的
colinear 共线的
cocircular 共圆的
cotangential 余切的
straight 直的合并端点临近的轮廓: union_adjacent_contours_xld
合并位于同一条直线上的轮廓 union_colinear_contours_xld
合并属于同一圆上的轮廓 union_cocircular_contours_xld
合并具有切线关系的轮廓 union_cotangential_contours_xld
合并具有相似方向的轮廓 union_straight_contours_xld拟合为圆 fit_circle_contour_xld
拟合为直线 fit_line_contour_xld
拟合为矩形2 fit_rectangle2_contour_xldregress_counter(...)
p59
https://www.bilibili.com/video/BV1x5411H7Ns?p=59&vd_source=9ed5e7be5d8180766946b38de14a1781
clip_region_rel 减区域
p60
https://www.bilibili.com/video/BV1x5411H7Ns?p=60&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p61
获取轮廓坐标 get_counter_xld
获取轮廓点的特征 get_countour_attrib_xld
保存轮廓 write_contour_xld_dxf
读取轮廓 read_contour_xld_dxf
p62
对轮廓进行仿射变换,CAD的图纸变为halcon的像素点 affine_trans_contour_xld
实际例子
read_contour_xld_dxf(...)
初始化一个空的仿射变换矩阵 hom_mat2d_identity(...)
缩放 hom_mat2d_scale(...)
仿射轮廓 affine_trans_contour_xld(...)二维仿射变换,顾名思义就是在二维平面内,
将对象进行平移、旋转、缩放等变换的行为(还有其他的变换,
这里仅论述这最常见的三种)。create_shape_model_xld(...) 创建模板
find_shape_model_xld(...) 查找模版
1、仿射变换的大致流程:
① 通过hom_mat2d_identity初始化一个空的仿射变换矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);
② 在初始化空的仿射矩阵中增加模板和目标之间的平移、旋转和缩放关系,
用到的算子包括hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、
hom_mat2d_scale(缩放)等生成仿射变换矩阵(这几个算子可以叠加或者重复使用)
③ 得到模板和目标的仿射变换矩阵之后,可以对图像、区域或XLD执行仿射变换,
用到的算子包括affine_trans_image(仿射图像)、affine_trans_region(仿射区域)、
affine_trans_contour_xld(仿射轮廓)。
rigid 刚性根据两个以上点对计算计算刚性仿射变换矩阵,支持旋转和平移 vector_to_rigid(::Px,Py,Qx,Qy:HomMat2D)
根据两个以上点对计算相似仿射变换矩阵,支持旋转、平移和缩放 vector_to_similarity(::Px,Py,Qx,Qy:HomMat2D)双MARK定位 模板匹配
https://www.bilibili.com/video/BV1x5411H7Ns?p=62&vd_source=9ed5e7be5d8180766946b38de14a1781
p63
polar_trans_contour_xld_inv
轮廓的几何变换生成对应的平行轮廓 gen_parallel_contour_xld极坐标转换 polar_trans_contour_xld_inv投射转换 projective_trans_contour_xld轮廓的集合运算闭合轮廓的交集 intersection_closed_contours_xld闭合轮廓的差 difference_closed_contours_xld合并闭合轮廓 union2_closed_contours_xld
p64
https://www.bilibili.com/video/BV1x5411H7Ns/?p=64&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
一维测量的方法
重复精度distance_cc 轮廓到轮廓的距离,c是轮廓的意思
distance_sc 计算线段与轮廓之间的距离
distance_lc 直线到轮廓的距离
distance_pc 点到轮廓的距离两个直线角度 angle_II(...)angle_lx(...)deg(...) 将弧度角转为度数
p65
使用测量助手进行测量
加载图像
绘制测量对象
参数设置
代码生成
gen_measure_rectangle(...)
measure_oairs(...)
P65
p66
测量算子
创建测量对象 gen_measure_rectangles 和 gen_measure_arc (arc-弧长)
提取直线边缘对 measure_pairs(结果成对出现)
提取边缘位置 measure_pos(结果顺序出现)
释放测量工具 close_measure
p67
https://www.bilibili.com/video/BV1x5411H7Ns/?p=67&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
客户需求分析 — 内容分析
视觉单看法
1项目工程师能与客户验收负责人确认需求,为什么要放在第一位呢,是因为我们接单
拿到的往往不是最终用户给我们的需求,而是设备中间商或者业务转话,传过来的,这样的话就会出现误传或者错传,甚至丢失
信息,进而导致在做设计的时候并不是得到最终需求,需求没有清湖明白的结果只有两个:1)不停的改和商务斡旋,最终勉强成交
2)改到无能为力,直到将工程师干辞职,项目放弃。所以不管什么产品,需求是第一位的。
p68
69
https://www.bilibili.com/video/BV1x5411H7Ns/?p=69&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p70
p71模板匹配
1模板匹配原理
1)什么是模板匹配
first_example_shape_matching.hdev
print+check
find_ncc_model_exposure
2)模板匹配流程
2模板参数介绍1)图像金字塔 Numberlever2)起始角度 AngleStart3)角度范围 AngleExtern4)角度步长 AngleStep5)优化算法 Optimization6)极性 Metric7)对比度 Contrast8)最小对比度 MinContrast9)缩放比 scale(find_scale_shape_model.hdev)3查找模板参数1)最小匹配分数 Score2)匹配最大个数 NumMatches3)最大重叠比 MaxOverlap(1-允许重叠 0-不允许重叠)4)亚像素精度 SubPixel5)搜索时使用的金字塔层数 NumLevels(0-最高效)6)贪婪度 Greediness(0-慢而安全 1快且可能匹配失败)4模板匹配与仿射变换进行定位(rectify_result.hdev)注意模板的对称性,对仿射变换的影响5模板匹配与仿射变换进行缺陷检测inspect 检查从点和角度计算刚性仿射变换 vector_angle_to_rigid
p73
https://www.bilibili.com/video/BV1x5411H7Ns/?p=73&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p74
P75
P76
基于形状的模板匹配
1)创建边缘模板 create_shape_model
2)创建边缘轮廓模板 create_shape_model_xld
3)查找边缘模板 find_shape_model
4)创建具有缩放比的模板 create_scaled_shape_model
5)查找具有缩放比的模板 find_scale_shape_model
6)查看模板图像和模板区域 inspect_shape_model
7)获取模板轮廓 get_shape_model_contours
8)获取模板的位置 get_shape_model_region
9)保存模板 write_shape_model
10)读取模板 read_shape_model
11)清除模板 clear_shape_model
基于相关性的模板匹配
1)创建模板 create_ncc_model
2)find_ncc_model
基于灰度的模版匹配
1)最小匹配分数 Score
https://www.bilibili.com/video/BV1x5411H7Ns/?p=76&spm_id_from=pageDriver&vd_source=9ed5e7be5d8180766946b38de14a1781
p81
坐标系标定
坐标系之间的转换,求两个坐标系之间的关系,比例系数
p82
vector_to_mat2d(…)
vector_to_rigid(…)
//#define USING_FILE
#define USING_HKVISION
#ifdef USING_FILE
#endif
#ifdef USING_HKVISION
#endif
halcon
1区域 --像素 region
2轮廓 --亚像素 xld