当前位置:首页 >> 计算机软件及应用 >>

Halcon学习博客整理


HALCON

算子函数 (一)

Classification

1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 把一个训练样本添加到一个高斯混合模型的训练数据上。 2.classify_class_gmm 通过一个高斯混合模型来计算一个特征向量的类。 3. clear_all_class_gmm 清除所有高斯混合模型。 4. clear_class_gmm 清除一个高斯混合模型。 5. clear_samples_class_gmm 清除一个高斯混合模型的训练数据。 6. create_class_gmm 为分类创建一个高斯混合模型。 7.evaluate_class_gmm 通过一个高斯混合模型评价一个特征向量。 8. get_params_class_gmm 返回一个高斯混合模型的参数。 9. get_prep_info_class_gmm 计算一个高斯混合模型的预处理特征向量的信息内容。 10. get_sample_class_gmm 从一个高斯混合模型的训练数据返回训练样本。 11. get_sample_num_class_gmm 返回存储在一个高斯混合模型的训练数据中的训练样本的数量。 12. read_class_gmm 从一个文件中读取一个高斯混合模型。 13. read_samples_class_gmm 从一个文件中读取一个高斯混合模型的训练数据。 14. train_class_gmm 训练一个高斯混合模型。 15. write_class_gmm 向文件中写入一个高斯混合模型。 16. write_samples_class_gmm 向文件中写入一个高斯混合模型的训练数据。 1.2 Hyperboxes 1. clear_sampset 释放一个数据集的内存。 2. close_all_class_box 清除所有分类器。 3. close_class_box 清除分类器。 4. create_class_box 创建一个新的分类器。 5. descript_class_box 分类器的描述。 6. enquire_class_box 为一组属性分类。 7. enquire_reject_class_box 为一组带抑制类的属性分类。 8. get_class_box_param 获取关于现在参数的信息。 9. learn_class_box 训练分类器。 10. learn_sampset_box 用数据组训练分类器。 11. read_class_box 从一个文件中读取分类器。 12.read_sampset 从一个文件中读取一个训练数据组。 13. set_class_box_param 为分类器设计系统参数。 14. test_sampset_box 为一组数组分类。 15. write_class_box 在一个文件中保存分类器。 1.3 Neural-Nets 1. add_sample_class_mlp 把一个训练样本添加到一个多层感知器的训练数据中。 2. classify_class_mlp 通过一个多层感知器计算一个特征向量的类。 3. clear_all_class_mlp 清除所有多层感知器。 4. clear_class_mlp 清除一个多层感知器。 5. clear_samples_class_mlp 清除一个多层感知器的训练数据。 6. create_class_mlp 为分类或者回归创建一个多层感知器。 7. evaluate_class_mlp 通过一个多层感知器计算一个特征向量的评估。

8. get_params_class_mlp 返回一个多层感知器的参数。 9. get_prep_info_class_mlp 计算一个多层感知器的预处理特征向量的信息内容。 10. get_sample_class_mlp 从一个多层感知器的训练数据返回一个训练样本。 11. get_sample_num_class_mlp 返回存储在一个多层感知器的训练数据中的训练样本的数量。 12. read_class_mlp 从一个文件中读取一个多层感知器。 13. read_samples_class_mlp 从一个文件中读取一个多层感知器的训练数据。 14. train_class_mlp、训练一个多层感知器。 15. write_class_mlp 向一个文件中写入一个多层感知器。 16. write_samples_class_mlp 向一个文件中写入一个多层感知器的训练数据。 1.4 Support-Vector-Machines 1. add_sample_class_svm 把一个训练样本添加到一个支持向量机的训练数据上。 2. classify_class_svm 通过一个支持向量机为一个特征向量分类。 3. clear_all_class_svm 清除所有支持向量机。 4. clear_class_svm 清除一个支持向量机。 5. clear_samples_class_svm 清除一个支持向量机的训练数据。 6. create_class_svm 为模式分类创建一个支持向量机。 7. get_params_class_svm 返回一个支持向量机的参数。 8. get_prep_info_class_svm 计算一个支持向量机的预处理特征向量的信息内容。 9. get_sample_class_svm 从一个支持向量机的训练数据返回一个训练样本。 10. get_sample_num_class_svm 返回存储在一个支持向量机训练数据中的训练样本的数量。 11. get_support_vector_class_svm 从一个训练过的支持向量机返回一个支持向量的索引。 12. get_support_vector_num_class_svm 返回一个支持向量机的支持向量的数量。 13. read_class_svm 从一个文件中读取一个支持向量机。 14. read_samples_class_svm 从一个文件中读取一个支持向量机的训练数据。 15. reduce_class_svm 为了更快分类,用一个降低的支持向量机近似一个训练过的支持向量机。 16. train_class_svm 训练一个支持向量机。 17. write_class_svm 向一个文件中写入一个支持向量机。 18.write_samples_class_svm 向一个文件中写入一个支持向量机的训练数据。

HALCON 算子函数(二) Control
1.assign 为一个控制变量分配一个新值。 2.break 终止循环执行。 3. comment 向程序添加一行注释。 4. continue 跳过现在的循环执行。 5. else 条件语句的替换。 6. elseif 可选择的条件语句。 7. endforfor 循环的终止。 8. endifif 命令的终止。 9. endwhilewhile 循环的终止。 10. exit 终止 HDevelop。 11. for 执行一定数量的主体。 12. if 条件语句。 13.ifelse 有选择的条件语句。

14. insert 向一个元组分配一个量。 15.repeatrepeat..until 循环的开始。 16. return 终止程序调用。 17. stop 停止程序执行。 18.until 继续执行主体,只要条件是不真实的。 19. while 继续执行主体,只要条件是真实的。

HALCON 算子函数(三) Develop
1. dev_clear_obj 从 HALCON 数据库中删除一个图标。 2. dev_clear_window 清除活动图形窗口。 3. dev_close_inspect_ctrl 关闭一个控制变量的监视窗口。 4. dev_close_window 关闭活动图形窗口。 5. dev_display 在现有图形窗口中显示图像目标。 6. dev_error_var 定义或者不定义一个错误变量。 7. dev_get_preferences 通过设计查询 HDevelop 的参数选择。 8. dev_inspect_ctrl 打开一个窗口来检查一个控制变量。 9. dev_map_par 打开一个对话框来指定显示参数。 10. dev_map_prog 使 HDevelop_的主窗口可视化。 11. dev_map_var 在屏幕上绘制可视化窗口。 12. dev_open_window 打开一个图形窗口。 13. dev_set_check 指定错误处理。 14. dev_set_color 设置一个或更多输出颜色。 15. dev_set_colored 设置混合输出颜色。 16. dev_set_draw 定义区域填充模式。 17. dev_set_line_width 定义区域轮廓输出的线宽。 18. dev_set_lut 设置查询表_(lut). 19. dev_set_paint 定义灰度值输出模式。 20. dev_set_part 修改显示图像部分。 21. dev_set_preferences 通过设计设置 HDevelop 的参数选择。 22. dev_set_shape 定义区域输出形状。 23. dev_set_window 激活一个图形窗口。 24. dev_set_window_extents 改变一个图形窗口的位置和大小。 25. dev_unmap_par 为图形参数隐藏窗口。 26. dev_unmap_prog 隐藏主窗口。 27. dev_unmap_var 隐藏变量窗口。 28. dev_update_pc 在程序执行中指定 PC 的行为。 29. dev_update_time 为操作符打开或关闭切换时间测量。 30. dev_update_var 在程序执行中指定活动窗口的行为。 31. dev_update_window 在程序执行中指定输出行为。

HALCON 算子函数(四) File

4.1 Images 1. read_image 读取有不同文件格式的图像。 2. read_sequence 读取图像。 3. write_image 用图形格式写图像。 4.2 Misc 1. delete_file 删除一个文件。 2. file_exists 检查文件是否存在。 3. list_files 列出目录中的所有文件。 4. read_world_file 从一个 ARC/INFO 世界文件中读取地理编码。 4.3 Region 1. read_region 读取二值图像或者 HALCON 区域。 2. write_region 在文件中写入地域。 4.4 Text 1. close_all_files 关闭所有打开的文件。 2.close_file 关闭一个文本文件。 3. fnew_line 创建一个换行符。 4. fread_char 从一个文本文件中读取一个字符。 5. fread_line 从一个文本文件中读取一行。 6. fread_string 从一个文本文件中读取字符串。 7. fwrite_string 向一个文本文件中写入值。 8. open_file 打开文本文件。 4.5 Tuple 1. read_tuple 从一个文件中读取一个数组。 2. write_tuple 向一个文件中写入一个数组。 4.6_XLD 1. read_contour_xld_arc_info 从用 ARC/INFO 生成格式表示的文件读取 XLD 轮廓。 2. read_contour_xld_dxf 从一个 DXF 文件中读取_XLD 轮廓。 3. read_polygon_xld_arc_info 从用 ARC/INFO 生成格式表示的文件读取 XLD 多边形。 4. read_polygon_xld_dxf 从一个 DXF 文件中读取_XLD 多边形。 5. write_contour_xld_arc_info 向用 ARC/INFO 生成格式表示的文件写入 XLD 轮廓。 6. write_contour_xld_dxf 向一个 DXF 格式的文件中写入_XLD 轮廓。 7. write_polygon_xld_arc_info 向用 ARC/INFO 生成格式表示的文件写入 XLD 多边形。 8. write_polygon_xld_dxf 向一个 DXF 格式的文件中写入_XLD 多边形。

HALCON 算子函数(五) Filter
5.1 Arithmetic 1. abs_image 计算一个图像的绝对值(模数)。 2. add_image 使两个图像相加。 3. div_image 使两个图像相除。 4. invert_image 使一个图像反像。 5. max_image 按像素计算两个图像的最大值。 6. min_image 按像素计算两个图像的最大小值。 7. mult_image 使两个图像相乘。

8. scale_image 为一个图像的灰度值分级。 9. sqrt_image 计算一个图像的平方根。 10. sub_image 使两个图像相减。 5.2 Bit 1. bit_and 输入图像的所有像素的逐位与。 2. bit_lshift 图像的所有像素的左移。 3. bit_mask 使用位掩码的每个像素的逻辑与。 4. bit_not 对像素的所有位求补。 5. bit_or 输入图像的所有像素的逐位或。 6. bit_rshift 图像的所有像素的右移。 7. bit_slice 从像素中提取一位。 8. bit_xor 输入图像的所有像素的逐位异或。 5.3 Color 1. cfa_to_rgb 把一个单通道颜色滤波阵列图像变成 RGB 图像。 2. gen_principal_comp_trans 计算多通道图像的主要部分分析的转换矩阵。 3. linear_trans_color 计算多通道图像的颜色值的一个仿射转换。 4. principal_comp 计算多通道图像的主要部分。 5. rgb1_to_gray 把一个 RGB 图像转变成一个灰度图像。 6. rgb3_to_gray 把一个 RGB 图像转变成一个灰度图像。 7. trans_from_rgb 把一个图像从 RGB 颜色空间转变成任意颜色空间。 8. trans_to_rgb 把一个图像从任意颜色空间转变成 RGB 颜色空间。 5.4 Edges 1.close_edges 使用边缘幅值图像消除边缘缺陷。 2. close_edges_length 使用边缘幅值图像消除边缘缺陷。 3. derivate_gauss 用高斯派生物对一个图像卷积。 4. diff_of_gauss 近似高斯的拉普拉斯算子。 5. edges_color 使用 Canny、Deriche 或者_Shen_滤波器提取颜色边缘。 6. edges_color_sub_pix 使用 Canny、Deriche 或者_Shen_滤波器提取子像素精确颜色边缘。 7. edges_image 使用 Deriche、_Lanser、Shen 或者_Canny 滤波器提取边缘。 8. edges_sub_pix 使用 Deriche、_Lanser、Shen 或者_Canny 滤波器提取子像素精确边缘。 9. frei_amp 使用 Frei-Chen 算子检测边缘(幅值)。 10. frei_dir 使用 Frei-Chen 算子检测边缘(幅值和相位)。 11. highpass_image 从一个图像提取高频成分。 12. info_edges 在 edges_image 估计滤波器的宽度。 13. kirsch_amp 使用 Kirsch 算子检测边缘(幅值)。 14. kirsch_dir 使用 Kirsch 算子检测边缘(幅值和相位)。 15. laplace 使用有限差计算拉普拉斯算子。 16. laplace_of_gauss 高斯的拉普拉斯算子。 17. prewitt_amp 使用 Prewitt 算子检测边缘(幅值)。 18. prewitt_dir 使用 Prewitt 算子检测边缘(幅值和相位)。 19. Roberts 使用 Roberts 滤波器检测边缘。 20. robinson_amp 使用 Robinson 算子检测边缘(幅值)。 21. robinson_dir 使用 Robinson 算子检测边缘(幅值和相位)。 22. sobel_amp 使用 Sobel 算子检测边缘(幅值)。

23. sobel_dir 使用 Sobel 算子检测边缘(幅值和相位)。 5.5 Enhancement 1. adjust_mosaic_images 全景图像的自动颜色更改。 2. coherence_enhancing_diff 执行一个图像的一个一致性增强扩散。 3. emphasize 增强图像对比度。 4. equ_histo_image 图像的柱状图线性化。 5. illuminate 增强图像对比度。 6. mean_curvature_flow 把平均曲率应用在一个图像中。 7. scale_image_max_最大灰度值在 0 到 255 范围内。 8. shock_filter 把一个冲击滤波器应用到一个图像中。 5.6 FFT 1. convol_fft 用在频域内的滤波器使一个图像卷积。 2. convol_gabor 用在频域内的一个 Gabor 滤波器使一个图像卷积。 3. correlation_fft 计算在频域内的两个图像的相互关系。 4. energy_gabor 计算一个两通道图像的能量。 5. fft_generic 计算一个图像的快速傅里叶变换。 6. fft_image 计算一个图像的快速傅里叶变换。 7. fft_image_inv 计算一个图像的快速傅里叶逆变换。 8. gen_bandfilter 生成一个理想带通滤波器。 9. gen_bandpass 生成一个理想带通滤波器。 10. gen_derivative_filter 在频域内生成一个倒数滤波器。 11. gen_filter_mask 在空域内存储一个滤波器掩码作为实时图像。 12. gen_gabor 生成一个 Gabor 滤波器。 13. gen_gauss_filter 在频域内生成一个高斯滤波器。 14. gen_highpass 生成一个理想高通滤波器。 15. gen_lowpass 生成一个理想低通滤波器。 16. gen_sin_bandpass 用正弦形状生成一个带通滤波器。 17. gen_std_bandpass 用高斯或者正弦形状生成一个带通滤波器。 18. optimize_fft_speed 使 FFT 的运行时间最优化。 19. optimize_rft_speed 使实值的 FFT 的运行时间最优化。 20. phase_deg 返回用角度表示的一个复杂图像的相位。 21. phase_rad 返回用弧度表示的一个复杂图像的相位。 22. power_byte 返回一个复杂图像的功率谱。 23. power_ln_返回一个复杂图像的功率谱。 24. power_real 返回一个复杂图像的功率谱。 25. read_fft_optimization_data 从一个文件中下载 FFT 速度最优数据。 26. rft_generic 计算一个图像的实值快速傅里叶变换。 27. write_fft_optimization_data 把 FFT 速度最优数据存储在一个文件中。 5.7 Geometric-Transformations 1. affine_trans_image 把任意仿射 2D 变换应用在图像中。 2. affine_trans_image_size 把任意仿射 2D 变换应用在图像中并且指定输出图像大小。 3. gen_bundle_adjusted_mosaic 把多重图像合成一个马赛克图像。 4. gen_cube_map_mosaic 创建球形马赛克的 6 方位图像。 5. gen_projective_mosaic 把多重图像合成一个马赛克图像。

6. gen_spherical_mosaic 创建一个球形马赛克图像。 7. map_image 把一个一般变换应用于一个图像中。 8. mirror_image 镜像一个图像。 9. polar_trans_image 把一个图像转换成极坐标。 10. polar_trans_image_ext 把一个图像中的环形弧转变成极坐标。 11. polar_trans_image_inv 把极坐标中的图像转变成直角坐标。 12. projective_trans_image 把投影变换应用于一个图像中。 13. projective_trans_image_size 把投影变换应用于一个图像中并且指定输出图像的大小。 14. rotate_image 以一个图像的中心为圆心旋转。 15. zoom_image_factor 把一个图像缩放规定因子倍。 16. zoom_image_size 把一个图像缩放到规定大小。 5.8 Inpainting 1. harmonic_interpolation 对一个图像区域执行谐波插值。 2. inpainting_aniso 通过各向异性扩散执行图像修复。 3. inpainting_ced 通过一致性增强扩散执行图像修复。 4. inpainting_ct 通过连贯传送执行图像修复。 5. inpainting_mcf 通过水平线平滑执行图像修复。 6. inpainting_texture 通过结构传导执行图像修复。 5.9 Lines 1. bandpass_image 使用带通滤波器提取边缘。 2. lines_color 检测色线和它们的宽度。 3. lines_facet 使用面模型检测线。 4. lines_gauss 检测线和它们的宽度。 5.10 Match 1. exhaustive_match 模板和图像的匹配。 2. exhaustive_match_mg 在一个分辨率塔式结构中匹配模板和图像。 3. gen_gauss_pyramid 计算一个高斯金字塔。 4. monotony 计算单一操作。 5.11 Misc 1. convol_image 用一个任意滤波掩码对一个图像卷积。 2. expand_domain_gray 扩大图像区域并且在扩大的区域中设置灰度值。 3. gray_inside 对图像中的每一点在图像边界的任意路径计算尽可能低的灰度值。 4. gray_skeleton 灰度值图像的细化。 5. lut_trans 使用灰度值查询表转换一个图像。 6. symmetry 沿一行的灰度值的对称性。 7. topographic_sketch 计算一个图像的地理原始草图。 5.12 Noise 1. add_noise_distribution 向一个图像添加噪声。 2. add_noise_white 向一个图像添加噪声。 3. gauss_distribution 产生一个高斯噪声分布。 4. noise_distribution_mean 测定一个图像的噪声分布。 5. sp_distribution 产生一个椒盐噪声分布。 5.13 Optical-Flow 1. optical_flow_mg 计算两个图像之间的光流。

2. unwarp_image_vector_field 使用一个矢量场来展开一个图像。 3. vector_field_length 计算一个矢量场的矢量长度。 5.14 Points 1. corner_response 在图像中寻找角点。 2. dots_image 在一个图像中增强圆形点。 3. points_foerstner 使用 F?rstner 算子检测关注点。 4. points_harris 使用 Harris 算子检测关注点。 5. points_sojka 使用 Sojka 算子找出角点。 5.15 Smoothing 1. anisotrope_diff 通过保边各向异性扩散平滑一个图像。 2. anisotropic_diffusion 对一个图像执行各向异性扩散。 3. binomial_filter 使用 binomial 滤波器平滑一个图像。 4. eliminate_min_max 在空域内平滑一个图像来抑制噪声。 5. eliminate_sp 用中值替代阀值外的值。 6. fill_interlace 插补两个半个视频图像。 9. gauss_image 使用离散高斯函数平滑图像。 10. info_smooth 平滑滤波器 smooth_image 的信息。 11. isotropic_diffusion 对一个图像执行各向同性扩散。 12. mean_image 通过平均平滑一个图像。 13. mean_n 几个通道的平均灰度值。 14. mean_sp 抑制椒盐噪声。 15. median_image 使用不同级别掩码的中值滤波。 16. median_separate_使用矩形掩码的离散中值滤波。 17. median_weighted 使用不同级别掩码的加权中值滤波。 18. midrange_image 计算掩码内最大和最小值的平均。 19. rank_image 通过一个任意等级掩码平滑一个图像。 20. sigma_image 使用 sigma 滤波器的非线性平滑。 21. smooth_image 使用递归滤波器平滑一个图像。 22. trimmed_mean 使用任意等级掩码平滑一个图像。 5.16 Texture 1. deviation_image 计算矩形窗口内的灰度值的标准偏差。 2. entropy_image 计算矩形窗口内的灰度值的熵。 3. texture_laws 使用一个 Laws 文本滤波器过滤一个图像。 5.17 Wiener-Filter 1. gen_psf_defocus 产生一个均匀散焦模糊的脉冲相应。 2. gen_psf_motion 产生一个(线性)运动模糊的脉冲相应。 3. simulate_defocus 对一个图像的均匀散焦模糊进行仿真。 4. simulate_motion(线性)运动模糊的仿真。 5. wiener_filter 通过 Wiener 滤波进行图像恢复。 6. wiener_filter_ni 通过 Wiener 滤波进行图像恢复。

HALCON 算子函数(六) Graphics
6.1 Drawing

1. drag_region1 一个区域的交互运动。 2. drag_region2 一个带有定点规格区域的交互运动。 3. drag_region3 一个带有限制位置区域的交互运动。 4. draw_circle 一个圆的交互绘图。 5. draw_circle_mod 一个圆的交互绘图。 6. draw_ellipse 一个椭圆的交互绘图。 7. draw_ellipse_mod_一个椭圆的交互绘图。 8. draw_line 画一根线。 9. draw_line_mod 画一根线。 10. draw_nurbs 一个 NURBS 曲线的交互绘图。 11. draw_nurbs_interp 使用插值的一个 NURBS 曲线的交互绘图。 12. draw_nurbs_interp_mod 使用插值的一个 NURBS 曲线的交互修正。 13. draw_nurbs_mod 一个 NURBS 曲线的交互修正。 14. draw_point 画一个点。 15. draw_point_mod 画一个点。 16.draw_polygon 一个多边形的交互绘图。 17. draw_rectangle1 画一个与坐标轴平行的矩形。 18. draw_rectangle1_mod 画一个与坐标轴平行的矩形。 19. draw_rectangle2 任意定向矩形的交互绘图。 20. draw_rectangle2_mod 任意定向矩形的交互绘图。 21. draw_region 一个闭区域的交互绘图。 22. draw_xld 一个轮廓的交互绘图。 23. draw_xld_mod 一个轮廓的交互修正。 6.2 Gnuplot 1. gnuplot_close 关闭所有打开的 gnuplot 文件或者终止一个活动的 gnuplot 子流程。 2. gnuplot_open_file 为图像和控制量的可视化打开一个 gnuplot 文件。 3. gnuplot_open_pipe 为图像和控制量的可视化打开一个通道的 gnuplot 流程。 4. gnuplot_plot_ctrl 使用 gnuplot 显示控制量。 5. gnuplot_plot_funct_1d 使用 gnuplot 显示控制量的功能。 6. gnuplot_plot_image 使用 gnuplot 使一个图像可视化。 6.3 LUT 1. disp_lut 查询表的图解。 2. draw_lut 交互利用查询表。 3. get_fixed_lut 为实际彩色图像获取固定查询表。 4. get_lut 获取现在的查询表。 5. get_lut_style 获取查询表的修正参数。 6. query_lut 查询所有可得到的查询表。 7. set_fixed_lut 为实际彩色图像固定查询表。 8. set_lut 设置查询表。 9. set_lut_style 改变查询表。 10. write_lut 把查询表作为文件写入。 6.4 Mouse 1. get_mbutton 等待直到一个鼠标键被按下。 2. get_mposition

_查询鼠标位置。 3. get_mshape 查询现在鼠标指针形状。 4. query_mshape 查询所有可得到的鼠标指针形状。 5. set_mshape 设置现在鼠标指针形状。 6.5 Output 1. disp_arc 在一个窗口中显示圆形弧。 2. disp_arrow 在一个窗口中显示箭头。 3. disp_channel 用几个通道显示图像。 4. disp_circle 在一个窗口中显示圆。 5. disp_color 显示一个彩色(RGB)图像。 6. disp_cross 在一个窗口中显示交叉。 7. disp_distribution 显示一个噪声分布。 8. disp_ellipse 显示椭圆。 9. disp_image 显示灰度值图像。 10. disp_line 在窗口中画一条线。 11. disp_obj 显示图像目标(图像,区域,XLD)。 12.disp_polygon 显示一个多叉线。 13. disp_rectangle1 显示和坐标轴对齐的矩形。 14. disp_rectangle2 显示任意方向的矩形。 15. disp_region 在一个窗口中显示区域。 16. disp_xld 显示一个 XLD 物体。 6.6 Parameters 1. get_comprise 获取一个图像矩阵的输出处理。 2. get_draw 获取现在区域填充模式。 3. get_fix 获取现在查询表的固定模式。 4. get_hsi 获取现在颜色的 HSI 编码。 5. get_icon 查询区域输出的图标。 6. get_insert 获取现在显示模式。 7. get_line_approx 获取轮廓显示的现在近似误差。 8. get_line_style 获取轮廓的现在图解模式。 9. get_line_width 获取轮廓显示的现在线宽。 10. get_paint 获取灰度值的现在显示模式。 11. get_part 获取图像部分。 12. get_part_style 获取灰度值显示的现在插值模式。 13. get_pixel 获取查询表索引的现在颜色。 14. get_rgb 获取 RGB 编码中的现在颜色。 15. get_shape 获取现在区域输出形状。 16. query_all_colors 查询所有颜色名称。 17. query_color 查询窗口中显示的所有颜色名称。 18. query_colored 查询颜色输出的颜色数目。 19. query_gray 查询显示的灰度值。 20. query_insert 查询可能的图解模式。 21. query_line_width 查询可能的线宽。 22. query_paint 查询灰度值显示模式。

23. query_shape 查询区域显示模式。 24. set_color 设置输出颜色。 25. set_colored 设置多输出颜色。 26. set_comprise 定义图像矩阵输出剪辑。 27. set_draw 定义区域填充模式。 28. set_fix 设置固定的查询表。 29. set_gray 定义区域输出的灰度值。 30. set_hsi 定义输出颜色(HSI 编码)。 31. set_icon 区域输出的图标定义。 32. set_insert 定义图像输出功能。 33. set_line_approx 定义输出显示的近似误差。 34. set_line_style 定义一个轮廓输出模式。 35. set_line_width 定义区域轮廓输出的线宽。 36. set_paint 定义灰度值输出模式。 37. set_part 修正显示图像部分。 38. set_part_style 为灰度值输出定义一个插值方法。 39. set_pixel 定义一个颜色查询表索引。 40. set_rgb 通过 RGB 值设置颜色定义。 41. set_shape 定义区域输出轮廓。 6.7 Text 1. get_font 获取现在字体。 2. get_string_extents 获取一个字符串的空间大小。 3. get_tposition 获取光标位置。 4. get_tshape 获取文本光标的形状。 5. new_line 设置下一行的开始文本光标的位置。 6. query_font 查询可得到的字体。 7. query_tshape 查询文本光标的所有可得到的形状。 8. read_char 从一个文本窗口读取一个字符。 9. read_string 从一个文本窗口读取一个字符串。 10. set_font 设置文本输出的字体。 11. set_tposition 设置文本光标的位置。 12. set_tshape 设置文本光标的形状。 13. write_string 在一个窗口中打印文本。 6.8 Window 1. clear_rectangle 在输出窗口中删除一个矩形。 2. clear_window 删除一个输出窗口。 3. close_window 关闭一个输出窗口。 4. copy_rectangle 在输出窗口间复制矩形内所有像素。 5. dump_window 把窗口内容写入一个文件。 6. dump_window_image 在一个图像目标中写窗口内容。 7. get_os_window_handle 获取操作系统图像处理。 8. get_window_attr 获取窗口特征。 9. get_window_extents 一个窗口大小和位置的信息。 10. get_window_pointer3 一个窗口像素数据的通道。

11. get_window_type 获取窗口类型。 12. move_rectangle 在一个输出窗口内部复制。 13. new_extern_window 在 Windows_NT 下创建一个虚拟图形窗口。 14. open_textwindow 打开一个文本窗口。 15. open_window 打开一个图形窗口。 16. query_window_type 查询所有可得到的窗口类型。 17. set_window_attr 设置窗口特征。 18. set_window_dc 设置一个虚拟图形窗口(Windows_NT)的设计背景。 19. set_window_extents 修正一个窗口的位置和大小。 20. set_window_type 指定一个窗口类型。 21. slide_image 两个窗口缓冲区的交互输出。

HALCON 算子函数(七) Image
7.1 Access 1. get_grayval 获取一个图像目标的灰度值。 2. get_image_pointer1 获取一个通道的指针。 3. get_image_pointer1_rect 获取图像数据指针和输入图像区域内最小矩形内部的图像数据。 4. get_image_pointer3 获取一个彩色图像的指针。 5. get_image_time 查找图像被创建的时间。 7.2 Acquisition 1. close_all_framegrabbers 关闭所有图像获取设备。 2. close_framegrabber 关闭指定的图像获取设备。 3. get_framegrabber_lut 查找图像获取设备的查询表。 4. get_framegrabber_param 查找一个图像获取设备的指定参数。 5. grab_data 从指定的图像获取设备获取图像和预处理图像数据。 6. grab_data_async 从指定的图像获取设备获取图像和预处理图像数据并且开始下 一个异步获取。 7. grab_image 从指定的图像获取设备获取一个图像。 8. grab_image_async 从指定的图像获取设备获取一个图像并且开始下一个异步获取。 9. grab_image_start 从指定的图像获取设备开始下一个异步获取。 10. info_framegrabber 从指定的图像获取设备查找信息。 11. open_framegrabber 打开并配置一个图像获取设备。 12. set_framegrabber_lut 设置图像获取设备查询表。 13. set_framegrabber_param 设置一个图像获取设备的指定参数。 7.3 Channel 1. access_channel 获取一个多通道图像的一个通道。 2. append_channel 把附加模型(通道)添加到图像上。 3. channels_to_image 把单通道图像转变为一个多通道图像。 4. compose2 把两个图像转变为一个两通道图像。 5. compose3 把三个图像转变为一个三通道图像。 6. compose4 把四个图像转变为一个四通道图像。 7. compose5 把五个图像转变为一个五通道图像。 8. compose6 把六个图像转变为一个六通道图像。

9. compose7 把七个图像转变为一个七通道图像。 10. count_channels 计算图像的通道。 11. decompose2 把一个两通道图像转变为两个图像。 12. decompose3 把一个三通道图像转变为三个图像。 13. decompose4 把一个四通道图像转变为四个图像。 14. decompose5 把一个五通道图像转变为五个图像。 15. decompose6 把一个六通道图像转变为六个图像。 16. decompose7 把一个七通道图像转变为七个图像。 17. image_to_channels 把一个多通道图像转变为一个通道图像。 7.4 Creation 1. copy_image 复制一个图像并为它分配新内存。 2. gen_image1 从像素的一个指针创建一个图像。 3. gen_image1_extern 从带存储管理的像素的一个指针创建一个图像。 4. gen_image1_rect 从像素(带存储管理)的指针创建一个矩形区域的图像。 5. gen_image3 从像素(红、绿、蓝)的三个指针创建一个图像。 6. gen_image_const 创建一个固定灰度值的图像。 7. gen_image_gray_ramp 创建一个灰度值阶梯。 8. gen_image_interleaved 从交叉像素的一个指针创建一个三通道图像。 9. gen_image_proto 创建一个指定的固定灰度值的图像。 10. gen_image_surface_first_order 创建一阶多项式的一个弯曲灰度表面。 11. gen_image_surface_second_order 创建二阶多项式的一个弯曲灰度表面。 12. region_to_bin 把一个区域转变为一个二进制字节图像。 13. region_to_label 把区域转变为一个标签图像。 14. region_to_mean 用它们的平均灰度值绘制区域。 7.5 Domain 1. add_channels 把两个灰度值添加到区域中。 2. change_domain 改变一个图像的定义区间。 3. full_domain 把一个图像的区域扩大到最大值。 4. get_domain 获取一个图像的区域。 5. rectangle1_domain 把一个图像的区域缩小到一个矩形。 6. reduce_domain 缩小一个图像的区域。 7.6 Features 1. area_center_gray 计算一个灰度值图像的区域面积和重心。 2. cooc_feature_image 计算一个同时出现的矩阵并得出相关灰度值特征。 3. cooc_feature_matrix 从一个同时出现的矩阵计算灰度值特征。 4. elliptic_axis_gray 在一个灰度值图像中计算一个区域的方位和主轴。 5. entropy_gray 确定一个图像的熵和各向异性。 6. estimate_noise 从一个单一图像估计图像噪声。 7. fit_surface_first_order 通过一个一阶表面(平面)计算灰度值力矩和近似值。 8. fit_surface_second_order 通过一个二阶表面(平面)计算灰度值力矩和近似值。 9. fuzzy_entropy 确定区域的模糊熵。 10. fuzzy_perimeter 计算一个区域的模糊周长。 11. gen_cooc_matrix 在一个图像中计算一个区域中同时出现的矩阵。 12. gray_histo 计算灰度值分布。

13. gray_histo_abs 计算灰度值分布。 14. gray_projections 计算水平和垂直灰度值预测。 15. histo_2dim 计算两通道灰度值图像的直方图。 16. intensity 计算灰度值的平均值和偏差。 17. min_max_gray 计算区域内的最大和最小灰度值。 18. moments_gray_plane 通过一个平面计算灰度值力矩和近似值。 19. plane_deviation 从近似像平面计算灰度值的偏差。 20. select_gray 选择基于灰度值特征的区域。 21. shape_histo_all 用极限值确定特征的一个直方图。 22. shape_histo_point 用极限值确定特征的一个直方图。 7.7 Format 1. change_format 改变图像大小。 2. crop_domain 去掉确定的灰度值。 3. crop_domain_rel 去掉和定义域有关的图像区域。 4. crop_part 去掉一个矩形图像区域。 5. crop_rectangle1 去掉一个矩形图像区域。 6. tile_channels 把多重图像拼成一个大图像。 7. tile_images 把多重图像目标拼成一个大图像。 8. tile_images_offset 把多重图像目标拼成一个有确定的位置信息的大图像。 7.8 Manipulation 1. overpaint_gray 重新绘制一个图像的灰度值。 2. overpaint_region 重新绘制一个图像的区域。 3. paint_gray 把一个图像的灰度值画在另一个图像上。 4. paint_region 把区域画在一个图像中。 5. paint_xld 把 XLD 目标画在一个图像中。 6.set_grayval 在一个图像中设置单灰度值。 7.9 Type-Conversion 1. complex_to_real 把一个复杂图像转变为两个实际图像。 2. convert_image_type 转变一个图像的类型。 3. real_to_complex 把两个实际图像转变为一个复杂图像。 4. real_to_vector_field 把两个实值图像转变为一个矢量域图像。 5. vector_field_to_real 把一个矢量域图像转变为两个实值图像。

HALCON 算子函数(九) Matching
9.1 Component-Based 1. clear_all_component_models 释放所有组件模型的内存。 2. clear_all_training_components 释放所有组件训练结果的内存。 3. clear_component_model 释放一个组件模型的内存。 4. clear_training_components 释放一个组件训练结果的内存。 5. cluster_model_components 把用于创建模型组件的新参数用于训练结果。 6. create_component_model 基于确定的指定组件和关系准备一个匹配的组件模型。 7. create_trained_component_model 基于训练过的组件准备一个匹配的组件模型。 8. find_component_model 在一个图像中找出一个组件模型的最佳匹配。

9. gen_initial_components 提取一个组件模型的最初组件。 10. get_component_model_params 返回一个组件模型的参数。 11. get_component_model_tree 返回一个组件模型的查找树。 12. get_component_relations 返回包含在训练结果内的模型组件间的关系。 13. get_found_component_model 返回一个组件模型的一个创建例子的组件。 14. get_training_components 在一个特定的图像中返回初始值或者模型组件。 15. inspect_clustered_components 检查从训练获取的刚性的模型组件。 16. modify_component_relations 修改一个训练结果中的关系。 17. read_component_model 从一个文件中读取组件模型。 18. read_training_components 从一个文件中读取组件训练结果。 19. train_model_components 为基于组件的匹配训练组件和关系。 20. write_component_model 把一个组件模型写入一个文件中。 21. write_training_components 把一个组件训练结果写入一个文件中。 9.2 Correlation-Based 1. clear_all_ncc_models 释放 NCC 模型的内存。 2. clear_ncc_model 释放 NCC 模型的内存。 3. create_ncc_model 为匹配准备一个 NCC 模型。 4. find_ncc_model 找出一个图像中的一个 NCC 模型的最佳匹配。 5. get_ncc_model_origin 返回一个 NCC 模型的原点(参考点)。 6. get_ncc_model_params 返回一个 NCC 模型的参数。 7. read_ncc_model 从一个文件中读取一个 NCC 模型。 8. set_ncc_model_origin 设置一个 NCC 模型的原点(参考点)。 9. write_ncc_model 向一个文件中写入 NCC 模型。 9.3 Gray-Value-Based 1. adapt_template 把一个模板用于一个图像的大小。 2. best_match 寻找一个模板和一个图像的最佳匹配。 3. best_match_mg 在金字塔中寻找最佳灰度值匹配。 4. best_match_pre_mg 在预生成的金字塔中寻找最佳灰度值匹配。 5. best_match_rot 寻找一个模板和一个旋转图像的最佳匹配。 6. best_match_rot_mg 寻找一个模板和一个旋转金字塔的最佳匹配。 7. clear_all_templates 所有模板的内存分配。 9. clear_template 一个模板的内存分配。 10. create_template 为模板匹配准备一个格式。 11. create_template_rot 为旋转模板匹配准备一个格式。 12. fast_match 寻找一个模板和一个图像的所有好的匹配。 13. fast_match_mg 在金字塔中寻找所有好的灰度值匹配。 14. read_template 从一个文件中读取一个模板。 15. set_offset_template 模板的灰度值偏差。 16. set_reference_template 为一个匹配模板定义参考位置。 17. write_template 向一个文件中写入模板。 9.4 Shape-Based 1. clear_all_shape_models 释放所有轮廓模型的内存。 2. clear_shape_model 释放一个轮廓模型的内存。 3. create_aniso_shape_model 为各向异性尺度不变匹配准备一个轮廓模型。

4. create_scaled_shape_model 为尺度不变匹配准备一个轮廓模型。 5. create_shape_model 为匹配准备一个轮廓模型。 6. determine_shape_model_params 确定一个轮廓模型的参数。 7. find_aniso_shape_model 在一个图像中找出一个各向异性尺度不变轮廓的最佳匹配。 8. find_aniso_shape_models 找出多重各向异性尺度不变轮廓模型的最佳匹配。 9. find_scaled_shape_model 在一个图像中找出一个尺度不变轮廓模型的最佳匹配。 10. find_scaled_shape_models 找出多重尺度不变轮廓模型的最佳匹配。 11. find_shape_model 在一个图像中找出一个轮廓模型的最佳匹配。 12. find_shape_models 找出多重轮廓模型的最佳匹配。 13. get_shape_model_contours 返回一个轮廓模型的轮廓表示。 14. get_shape_model_origin 返回一个轮廓模型的原点(参考点)。 15. get_shape_model_params 返回一个轮廓模型的参数。 16. inspect_shape_model 创建一个轮廓模型的表示。 17. read_shape_model 从一个文件中读取一个轮廓模型。 18. set_shape_model_origin 设置一个轮廓模型的原点(参考点)。 19. write_shape_model 向一个文件中写入一个轮廓模型。

HALCON 算子函数(十) Matching-3D
(2012-12-16 17:04:49)

1. affine_trans_object_model_3d 把一个任意有限 3D 变换用于一个 3D 目标模型。 2. clear_all_object_model_3d 释放所有 3D 目标模型的内存。 3. clear_all_shape_model_3d 释放所有 3D 轮廓模型的内存。 4. clear_object_model_3d 释放一个 3D 目标模型的内存。 5. clear_shape_model_3d_释放一个 3D 轮廓模型的内存。 6. convert_point_3d_cart_to_spher 把直角坐标系中的一个 3D 点转变为极坐标。 7. convert_point_3d_spher_to_cart 把极坐标中的一个 3D 点转变为直角坐标。 8. create_cam_pose_look_at_point 从摄像机中心和观察方向创建一个 3D 摄像机位置。 9. create_shape_model_3d 为匹配准备一个 3D 目标模型。 10. find_shape_model_3d 在一个图像中找出一个 3D 模型的最佳匹配。 11. get_object_model_3d_params 返回一个 3D 目标模型的参数。 12. get_shape_model_3d_contours 返回一个 3D 轮廓模型视图的轮廓表示。 13. get_shape_model_3d_params 返回一个 3D 轮廓模型的参数。 14. project_object_model_3d 把一个 3D 目标模型的边缘投影到图像坐标中。 15. project_shape_model_3d 把一个 3D 轮廓模型的边缘投影到图像坐标中。 16. read_object_model_3d_dxf 从一个 DXF 文件中读取一个 3D 目标模型。 17. read_shape_model_3d 从一个文件中读取一个 3D 轮廓模型。 18. trans_pose_shape_model_3d 把一个 3D 目标模型的坐标系中的位置转变为一个 3D 轮廓模型的参考 坐标系中的位置,反之亦然。 19. write_shape_model_3d 向一个文件写入一个 3D 轮廓模型。

HALCON 算子函数(十一) Morphology

(2012-12-16 17:04:53)

11.1 Gray-Values 1. dual_rank 打开、取中值和关闭圆和矩形掩码。 2. gen_disc_se 为灰度形态学生成椭圆结构基础。 3. gray_bothat 执行一个图像的一个灰度值 bottom_hat 变换(原图像和它的闭 之间的差)。 4. gray_closing 关闭一个图像的一个灰度值。 5. gray_closing_rect 关闭带矩形掩码的灰度值。 6. gray_cl_osing_shape 关闭带选择掩码的灰度值。 7. gray_dilation 扩大一个图像上的灰度值。 8. gray_dilation_rect 确定一个矩形的最小灰度值。 9. gray_dilation_shape 确定一个选择的掩码的最大灰度值。 10. gray_erosion 腐蚀一个图像的灰度值。 11. gray_erosion_rect 确定一个矩形的最小灰度值。 12. gray_erosion_shape 确定一个选择的掩码的最小灰度值。 13. gray_opening 打开一个图像的灰度值。 14. gray_opening_rect 打开一个矩形掩码的灰度值。 15. gray_openin_g_shape 打开一个选择的掩码的灰度值。 16. gray_range_rect 确定一个矩形的灰度值范围。 17. gray_tophat 执行一个图像的一个灰度值 top_hat 变换(原图像和它的开之间的差)。 18. read_gray_se 为灰度形态学下载一个结构基础。 11.2 Region 1. bottom_hat 计算区域的 bottom_hat(原图像和它的闭之间的差)。 2. boundary 把一个区域减小到它的边界。 3. closing 关闭一个区域。 4. closing_circle 关闭一个圆形结构基础的一个区域。 5. closing_golay 关闭格雷字母表中的元素的一个区域。 6. closing_rectangle1 关闭一个矩形结构基础的一个区域。 7. dilation1 扩大一个区域。 8. dilation2 扩大一个区域(使用一个参考点)。 9. dilation_circle 扩大一个圆形结构基础的一个区域。 10. dilation_golay 扩大格雷字母表的元素的一个区域。 11. dilation_rectangle1 扩大一个矩形结构基础的一个区域。 12. dilation_seq 顺序地扩大一个区域。 13. erosion1 腐蚀一个区域。 14. erosion2 腐蚀一个区域(使用参考点)。 15. erosion_circle 腐蚀一个圆形结构基础的一个区域。 16. erosion_golay 腐蚀格雷字母表的一个元素的一个区域。 17. erosion_rectangle1 腐蚀一个矩形结构基础的一个区域。 18. erosion_seq 按顺序腐蚀一个区域。 19. fitting 执行多重结构基础的打开后关闭。 20. gen_struct_elements 生成一个标准结构基础。 21. golay_elements 生成格雷字母表的结构基础。 22. hit_or_miss 区域的 Hit-or-miss 运行。

23. hit_or_miss_golay 使用格雷字母表的区域的 Hit-or-miss 运行。 24. hit_or_miss_seq 使用格雷字母表的区域的 Hit-or-miss 运行(按顺序)。 25. minkowski_add1 执行一个区域的 Minkowski 添加。 26. minkowski_add2 扩大一个区域(使用参考点)。 27. minkowski_sub1 腐蚀一个区域。 28. minkowski_sub2 腐蚀一个区域(使用参考点)。 29. morph_hat 计算 bottom_hat_和 top_hat 的联合。 30. morph_skeleton 计算一个区域的形态学框架。 31. morph_skiz 缩小一个区域。 32. opening 打开一个区域。 33. opening_circle 打开一个圆形结构基础的一个区域。 34. opening_golay 打开格雷字母表的一个元素的一个区域。 35. opening_rectangle1 打开一个矩形结构基础的一个区域。 36. opening_seg 分离重叠区域。 37. pruning 去掉一个区域的分支。 38. thickening 把一个 Hit-or-miss 运行的结果添加到一个区域。 39. thickening_golay 把一个 Hit-or-miss 运行的结果添加到一个区域中(使用一个 Golay 结构基础)。 40. thickening_seq 把一个 Hit-or-miss 运行的结果添加到一个区域中(按顺序)。 41. thinning 从一个区域移去一个 Hit-or-miss 运行的结果。 42. thinning_golay 从一个区域移去一个 Hit-or-miss 运行的结果(使用一个 Golay 结构基础)。 43. thinning_seq 从一个区域移去一个 Hit-or-miss 运行的结果(按顺序)。 44. top_hat 计算区域的 top_hat(原图像和它的开之间的差)。

HALCON 算子函数(十二) OCR
(2012-12-16 17:04:55)

12.1 Hyperboxes 1. close all ocrs 删除所有光字符,释放存储空间,但会丢失所有的测试数据。 2. close ocr_重新分配拥有 OcrHandle 数目的分级器的存储,但所有相应的数据会丢失,不过这些数据 可由 write ocr 事先保存。 3. create ocr class box 创建新的 OCR 分级器。 4. do ocr multi 给每一个 Character(字符)分配一个类。 5. do ocr single 给一些 Character(字符)分配一些类。 6. info ocr class box 反馈 ocr 的有关信息。 7. ocr change char 为字符建立新的查阅表。 8. ocr get features 计算给定 Character(字符)的特征参数。 9. read ocr 从文件的 FileName(文件名)读取 OCR 分级器。 10. testd ocr class box 测试给定类中字符的置信度。 11. traind ocr class box 通过一幅图像的特定区域直接测试分级器。 12. trainf ocr class box 根据指定测试文件测试分级器的 OCRHandle。 13. write ocr 将 OCR 分级器的 OCRHandle 写入文件的 FileName(文件名)。 12.2 Lexica 1.clear_all_lexica 清除所有的词汇(词典),释放它们的资源。 2. clear lexicon 清除一个词汇(词典),释放相应的资源。

3. create lexicon 根据一些 Words(单词)的元组创建一个新的词汇(词典)。 4.Import lexicon 通过 FileName(文件名)选定的文件中的一系列单词创建一个新的词典。 5. inspect lexicon 返回 Words 参数的词典中所有单词的元组。 6. lookup lexicon 检查 Word(单词)是否在词典的 LexiconHandle 中,若在返回 1 否则返回 0。 7. suggest lexicon 将 Word(单词)与词典中所有词汇相比较,计算出将 Word 从词典中导入单词中所 需的足校的编辑操作符 NUMcorrections。 12.3 Neural-Nets(神经网络) 1. clear all ocr class mlp 清除所有的 create ocr class mlp 创建的 OCR 分级器,释放分级器占据的存储空 间。 2. clear ocr class mlp 清除所有的由 OCRHandle 给定的且由 create ocr class mlp 创建的 OCR 分级器, 释放所有的分级器占据的存储空间。 3. create ocr class mlp 利用 MLP(多层感知器)创建一个新的 OCR 分级器。 4. do ocr multi class mlp 为根据给定区域字符和 OCR 分级器 OCRHandle 的灰度图像值而给定的每个字 符计算出最好的类,将类返回到 Class 中,且将类的置信度返回到 Confidence 中。 5. do ocr single class mlp 为根据给定区域字符和 OCR 分级器 OCRHandle 的灰度图像值而给定的字符计 算出最好的 Num 类,将类返回到 Class 中,且将类的置信度返回到 Confidence 中。 6. do ocr word mlp 功能与 do ocr multi class mlp 相同,只是 do ocr word mlp 将字符组作为一个实体。 7.get_features_ocr_class_mlp 为根据 OCR 分级器 OCRHandle 确定的字符计算其特征参数,并将它们返 回到 Features。 8. get params ocr class mlp 返回一个 OCR 分级器的参数只有当分级器由 do ocr multi classmlp 创建时。 9. get prep info ocr class mlp 计算 OCR 分级器预设定矢量特性的信息。 10. read ocr class mlp 从一个文件中读取 OCR 分级器。 11. trainf ocr class mlp 测试 OCR 分级器的 OCRHandle,根据存储在 OCR 文件中的测试特性 12. write ocr class mlp 将 OCR 分级器的 OCRHandle 写入由文件名确定的文件中。 12.4 Support-Vector-Machines_(支持矢量机) 1. clear_all ocr class svm 清除所有的基于 OCR 分级器的 SVM,释放相应的存储空间。 2. clear ocr class svm 清除基于 OCR 分级器的一个 SVM,释放相应的存储空间。 3. create ocr class svm 利用支持向量机创建一个 OCR 分级器。 4. do ocr multi class svm 根据基于 OCR 分级器的 SVM 将大量字符分类。 5. do ocr single class svm 根据基于 OCR 分级器的 SVM 将单个字符分类。 6. do ocr word svm 利用 OCR 分级器将一系列相关字符分类。 7. get features ocr class svm 计算一个字符的特征。 8. get params ocr class svm 返回一个 OCR 分级器的参数。 9. get prep info ocr class svm 计算基于 OCR 分级器的 SVM 的预定义特征矢量的信息内容。 10. get support vector num ocr class svm 返回 OCR 分级器支持的矢量的数目。 11. get support vector ocr class svm 返回基于支持向量机的已测试 OCR 分级器中支持向量的索引。 12. read ocr class svm 从文件中读取基于 OCR 分级器的 SVM。 13. reduce ocr class svm 根据一个减小的 SVM 来接近一个基于 OCR 分级器的 SVM。 14.Trainf ocr class svm 测试一个 OCR 分级器。 15. write ocr class svm 将一个 OCR 分级器写入文件。 12.5 Tools

1.Segment characters 将一副图像给定区域的字符分割。 2. select characters 从一个给定区域中选择字符。 3.text line orientation 决定一个文本行或段落的定向(定位)。 4.text_line slant 决定一个文本行或段落的字符的倾斜。 12.6 Training-Files 1. append ocr trainf 将字符添加到一个测试文件中。 2. concat ocr trainf 合并测试文件。 3.read_ocr trainf 从文件中读取字符,将其转换到图像中。 4. read ocr trainf names 查询哪些字符存储在测试文件中。 5.read ocr trainf_select 从文件中读取测试特定字符,将其转换到图像中。 6. write ocr trainf 将已测试的字符存储到文件中。 7. write ocr trainf image 将字符写入正在测试的文件中。

HALCON 算子函数(十三) Object
(2012-12-16 17:04:56)

13.1 Information 1. count_obj 统计一个元组中的对象。 2. get_channel_info 一幅目标图像组成部分的信息。 3. get_obj_class 一副目标图像类的名称。 4.test_equal_obj 比较目标图像的平等性。 5. test_obj_def 测试目标是否被删除。 13.2 Manipulation 1. clear_obj 将一个对象的图标从 HALCON 数据库中删除。 2. concat_obj 连接两个目标元组的图标。 3. copy_obj 复制一个 HALCON 数据库中对象的图标_。 4. gen_empty_obj 创建一个空的目标元组。 5.integer_to_obj 将一个整型数转换为一个图标。 6. obj_to_integer 将一个图标转换为一个整型数。 7. select_obj 从一个目标元组中选择目标。

HALCON

算子函数(十四)

Regions

14.1 Access 1. get_region_chain 一个对象的轮廓(contour)作为链式码。 2. get_region_contour 查询一个目标的轮廓(contour)。 3. get_region_convex 查询突起的外表作为轮廓(contour)。 4. get_region_points 查询一个区域的像素数。 5. get_region_polygon 用一个多边形近似获取区域。 6. get_region_runs 查询一个区域的扫描宽度编码。 14.2 Creation 1. gen_checker_region 创建一个方格式区域。 2. gen_circle 创建一个圆周。

3. gen_ellipse 创建一个椭圆。 4. gen_empty_region 创建一个空的区域。 5. gen_grid_region 根据行或像素数创建一个区域_。 6. gen_random_region 创建一个随机区域。 7. gen_random_regions 创建随机区域如圆周,矩形和椭圆。 8. gen_rectangle1 创建一个与坐标轴平行的长方形。 9. gen_rectangle2 创建任意方向的矩形。 10. gen_region_contour_xld 从 XLD 元组中创建一个区域。 11. gen_region_histo 将一个直方图转换为一个区域。 12. gen_region_hline 将 Hesse 正规形状中描述的输入线存储为区域。 13. gen_region_line 将输入线以区域形式存储。 14. gen_region_points 将个别的像素存储为图像区域。 15. gen_region_polygon 将一个多边形存储为一个目标图像。 16. gen_region_polygon_filled 将一个多边形存储为一个已填充区域。 17. gen_region_polygon_xld 创建一个 XLD 多边形中的区域。 18. gen_region_runs 创建一个扫描宽度编码中的图像区域。 19. label_to_region 提取一幅图像中灰度值相同的区域。 14.3 Features 1. area center 一个区域的面积(大小)和中心。 2. circularity 影响一个区域与圆的相似度的形状系数。 3. compactness 影响一个区域致密度的形状系数。 4. connect and_holes 连接部分和中断的数目。 5. contlength 描述一个区域轮廓(contour)的长度。 6. convexity 影响一个区域凸性的形状系数。 7. diameter region 一个区域两个边界点的最大距离。 8. eccentricity 来源于椭圆参数的形状系数。 9. elliptic axis 相似椭圆的参数。 10.euler number 计算 Euler 数目。 11. find neighbors 搜寻直接邻域。 12. get region_index 包括给定像素在内的所有的区域的索引。 13. get region_thickness 查询主轴附近区域的宽度(厚度)。 14. hamming distance 两个区域间的汉明距离。 15. hamming_distance_norm 两个区域间的归一化汉明距离。 16. inner circle 一个区域内部最大的圆周。 17. inner_rectangle1 一个区域内部最大的矩形。 18. moments_region_2nd 区域的某时刻几何特性,。 19. moments_region_2nd invar 区域的某时刻几何特性。 20. moments_region_2nd rel_invar 计算相关时刻参数。 21. moments_region 3rd 区域的某时刻几何特性。 22. moments_region_3rd invar 区域的某时刻几何特性。 23. moments_region_central 区域的某时刻几何特性。 24. moments_region_central_invar 区域的某时刻几何特性。 25. orientation_region 一个区域的定向。 26. rectangularity 影响一个区域矩形相似度的形状系数。

27. roundness 轮廓中获取的形状系数。 28.runlength_distribution 一个区域扫描宽度编码所需的顺串的分配。 29. runlength_features 区域扫描宽度编码的特征值。 30. select_region_point 选择包括给定像素在内的所有区域。 31. select_region_spatial 讨论区域的关联性。 32. select_shape 根据图形特征选择区域。 33. select_shape_proto 选择彼此有某种关系的区域。 34. select_shape_std 选择给定形状的区域。 35. smallest_circle 一个区域的最小周长。 36. smallest_rectangle1 平行于坐标轴的包围某区域的矩形。 37. smallest_rectangle2 任意方向包围某区域的最小矩形。 38. spatial_relation 根据坐标轴方向左、右、上、下排列相关区域。 14.4 Geometric-Transformations 1. affine_trans_region 对区域进行任意的二维变换。 2. mirror_region 反馈一个平行于 X 或 Y 坐标轴的区域。 3. move_region 对区域进行变换。 4. polar_trans_region 将一个环状弧内的区域转换为极坐标。 5. polar_trans_region_inv 将极坐标中的区域转换为笛卡尔坐标中的区域。 6. projective_trans_region 对一个区域进行射影变换。 7. transpose_region 翻译关于一个点的一个区域。 8. zoom_region 缩放一个区域。 14.5 Sets 1. complement 返回一个区域的补码。 2. difference 计算两个区域的差距(不同)。 3. intersection 计算两个区域的交集。 4. symm_difference 计算两个区域对称差异。 5. union1 返回所有输入区域的并集。 6. union2 返回两个区域的并集。 14.6 Tests 1. test_equal_region 检测两个目标区域是否相同。 2. test_subset_region 检测一个区域是否包含在另一个区域中。 14.7 Transformation 1. background_seg 决定给定区域背景相连的部分。 2. clip_region 将一个区域修改为矩形。 3. clip_region rel 根据大小修改一个区域。 4. connection 计算一个区域相连接的部分。 5. distance transform 计算一个区域的距离变换。 6. eliminate runs 消除一个给定宽度的顺串。 7. expand region 填充区域间的间隙或分离互相重叠的区域。 8.fill up 填充区域中的中断(裂缝等)。 9. fill_up_shape 填充拥有给定图形特征区域的中断。 10. hamming_change_region 创建一个有给定汉明距离的区域。 11. interjacent 利用给定区域分割图像。 12. junctions_skeleton 找到框架中的结点和终点。

13. merge_regions_line_scan 从行扫描图像合并区域。 14.partition dynamic 在较小垂直范围的位置水平分割一个区域。 15. partition_dynamic 将一个区域分割为等大的矩形。 16. rank_region 给对区域的操作归类。 17. remove noise region 去除一个区域内的噪声。 18. shape_trans 改变一个区域的形状。 19. skeleton 计算一个区域的框架。 20. sort region 根据相邻位置归类区域。 21. split_skeleton_lines 用一个像素宽,没有分支的线来分离线。 22. split_skeleton_region 用一个像素宽,没有分支的区域来分离线。

Halcon 学习(一)读取多张图片
第一种方法 ImagePath:=[] ImagePath[0]:='E:/images1/a000.bmp' ImagePath[1]:='E:/images1/a001.bmp' ImagePath[2]:='E:/images1/a002.bmp' ImagePath[3]:='E:/images1/a003.bmp' ImagePath[4]:='E:/images1/a004.bmp' ImagePath[5]:='E:/images1/a005.bmp' ImagePath[6]:='E:/images1/a006.bmp' ImagePath[7]:='E:/images1/a007.bmp' for i:=0 to 7 by 1 read_image(Image,ImagePath[i]) endfor 2 种方法 for i:=0 to 7 by 1 read_image(Image,'E:/images1/'+i+'.bmp') endfor 第三种方法 NumImages :=8 for I :=1 to NumImages-1 by 1 read_image (Image, ' E:/images1/a ' + I$'03d') endfor 第四种方法 (读取一个文件夹下的所有图片) 【助手】》【打开新的 image acquisition 】》【图像助手】》【选择路径】》【代码生成】》【插入 代码】

Halcon 学习(二)图像获取与相关参数
(2012-12-16 23:29:28)

图像获取程序例 1.

1.set_system( : : SystemParameter, Value : ) 设置系统参数 2.open_framegrabber ( : : Name, HorizontalResolution,VerticalResolution, ImageWidth, ImageHeight, StartRow, StartColumn,Field, BitsPerChannel, ColorSpace, Generic, ExternalTrigger,CameraType, Device, Port, LineIn : AcqHandle ) 打开并配置图像采集设备 输入控制: Name:图像采集设备的名称 HorizontalResolution 和 VerticalResolution:预期的图像采集接口的水平分辨率和垂直分辨率 ImageWidth 和 ImageHeight:指预期图像的宽度部分和高度部分。 StartRow 和 StartColumn:指显示预期图像的开始坐标 Field:预期图像是一半的图像或者是完整图像 BitsPerChannel:每像素比特数和图像通道 ColorSpace:获取图像的输出形式{gray、raw、rgb、yuv、default} Generic:通用参数与设备细节部分的具体意义。 ExternalTrigger:是否有外部触发 CameraType:使用相机的类型 Device:图像获取设别连接到的设备 Port:图像获取设别连接到的端口 LineIn :相机输入的多路转接器 AcqHandle:图像获取设备的 Handle 3.grab_image( : Image : AcqHandle : ) 从 AcqHandle 指定的图像获取设备中获取图像,输出为获得的图像 4.set_framegrabber_param( : : AcqHandle, Param, Value : ) 为 AcqHandle 指定的图像获取设备设置参数 Param : 'color_space', 'continuous_grabbing', 'external_trigger', 'grab_timeout', 'image_height', 'image_width', 'port', 'start_column', 'start_row', 'volatile' 注意:能够设置的参数不仅仅是上述建议的参数。也可以一次设定多个参数值。 例如:set_framegrabber_param (AcqHandle, 'port', Port0) set_framegrabber_param (AcqHandle, ['image_width','image_height'], [256, \256]) 对 DaHengCams 能设置的常用额外参数包括: 'adc_level' ---设置 A/D 转换的级别; 'color_space' ---设置颜色空间 'gain' ---设置相机增益 'grab_timeout' ---设置采集超时终止的时间 'resolution' ---设定相机的采相分辨率,MOD0 为最大的分辨率。 'shutter' ---设定相机的曝光时间。 'shutter_unit' ---设定相机曝光时间的单位。 'white_balance' ---相机是否打开白平衡模式,默认为关闭白平衡 5.info_framegrabber( : : Name, Query : Information, ValueList)查询指定的图像采集接口的信息。 Name 为图像采集设备的名称 Query 为需要查询的参数名称 Information 是指输出的文本信息 ValueList 为该图像采集接口的参数值

6.get_image_pointer1(Image : : : Pointer, Type, Width, Height)获取一个图像通道的指针, 输出指针以及图 像类型和尺寸。 7.dev_set_part( : : Row1, Column1, Row2, Column2 : )修改图像显示部分的尺寸。 8.close_all_framegrabbers( : : : )关闭图像采集设备。 9.count_seconds( : : : Seconds)测试算子实行时间 * general configuration of HDevelop set_system ('do_low_error', 'true') //设置系统参数,在输出窗口只立即显示图像// dev_update_window ('off') stop () * step 1: connect to the image acquisition device * -> Please adapt the following lines for your own image acquisition device. AcqName := 'DaHengCam' open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'gray', -1, 'false', 'ntsc', 'default', -1, -1, AcqHandle) //打开并配置图像采集设备// stop () * step 2: grab a first image and adjust the window size grab_image (Image, AcqHandle) //获取图像// get_image_pointer1 (Image, Pointer, Type, Width, Height) //获取图像通道指针// dev_close_window () dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle) //开新窗口// dev_set_part (0, 0, Height-1, Width-1) dev_display (Image) stop () * step 3: grab and process images in a loop (exit with left mouse button) dev_open_window (0, Width/2 + 8, Width/2, Height/2, 'black', WindowHandleProcess) dev_set_colored (12) dev_open_window (Height/2 + 68, 0, Width/2, Height/16, 'light gray', WindowHandleButton) dev_set_part (0, 0, Height/16 - 1, Width/2 -1) write_string (WindowHandleButton, ' click here with left mouse button to exit loop')//写字符 进入窗口// dev_set_window (WindowHandle) dev_set_part (0, 0, Height-1, Width-1) Button := 0 while (Button # 1) grab_image (Image, AcqHandle) dev_set_window (WindowHandle) dev_display (Image) * -> process image (segment with an automatically determined threshold) auto_threshold (Image, Regions, 4)//高斯平滑图像并利用直方图分割图像输出区域// connection (Regions, ConnectedRegions)2.Insert : 对数组中的某一个值进行赋值。 Tuple1 := [1,0,3,4,5,6,7,8,9] Tuple1[3]:=2 显示结果为:[1, 0, 3, 2, 5, 6, 7, 8, 9],即对索引 3 后面元素,数组 Tuple1 中第 4 个元素赋值 2. example:

read_image (Mreut, 'mreut') //读入图像 threshold (Mreut, Region, 190, 255) //阈值化,输出阈值在 190-255 的 Regions Areas := [] //定义数组 Areas for Radius := 1 to 50 by 1 //循环 dilation_circle (Region, RegionDilation, Radius) //利用半径为 Radius 的圆对 Region 进行膨胀运算,输出 RegionDilation,输出形式仍然为 Region。 area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标 Areas[Radius-1] := Area //对数组 Areas 的第 Radius-1 个元素进行赋值 endfor 3.基本数组操作极其对应的算子 t := [t1,t2] t1,t2 连接成新的数组 对应算子:tuple_concat i := |t| 得到数组长度 tuple_length v := t[i] 选取第 i 个元素 0<= i < |t| tuple_select t := t[i1:i2] 选取 i1 到 i1 的元素 tuple_select_range t := subset(t,i) 选取数组 t 中的第 i 个元素 tuple_select t := remove(t,i) 去除数组 t 中的第 i 个元素 tuple_remove i := find(t1,t2) 找到 t2 数组在 t1 数组中出现位置索引 (or -1 if no match) tuple_find t := uniq(t) 在 t 数组中把连续相同的值只保留一个 tuple_uniq 4.创建数组 (1)gen_tuple_const 函数 tuple := gen_tuple_const(100,4711) //创建一个具有 100 个元素的,每个元素都为 4711 的数据 tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的数据 上面的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711 (2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值 例如:tuple := [] //创建空数组 for i := 1 to 100 by 1 //建立步长为 1 的循环 tuple := [tuple,i*i] //将 i 方的值赋给数组的第 i 个元素 endfor //循环结束 dev_set_window (WindowHandleProcess) dev_display (ConnectedRegions) * -> check for a click into the window (error handling switched off, otherwise the cursor must always be in the window) dev_set_check ('~give_error') get_mposition (WindowHandleButton, Row, Column, Button) dev_set_check ('give_error') endwhile dev_set_window (WindowHandleButton) dev_close_window () dev_set_window (WindowHandleProcess) dev_close_window () stop () * clean up dev_update_window ('on')

close_all_framegrabbers ()

Halcon 学习(三)赋值与数组操作
(2012-12-17 17:10:40)

assign : 对数据赋值,对数组的初始化。但不能对数组中的某一个值进行赋值。 举例:Tuple1 := [1,0,3,4,5,6,7,8,9] // 对数组进行初始化 Val := sin(1.2) + cos(1.2) // 对某一个值进行赋值 Tuple2 := [] // 数组定义 assign_at : 对数组中的某一个值进行赋值。 举例:Tuple1[1] := 2 // 将 Input 和 Result 赋值为 Tuple1

2.Insert : 对数组中的某一个值进行赋值。 Tuple1 := [1,0,3,4,5,6,7,8,9] Tuple1[3]:=2 显示结果为:[1, 0, 3, 2, 5, 6, 7, 8, 9],即对索引 3 后面元素,数组 Tuple1 中第 4 个元素赋 值 2. example: read_image (Mreut, 'mreut') //读入图像 threshold (Mreut, Region, 190, 255) //阈值化,输出阈值在 190-255 的 Regions Areas := [] //定义数组 Areas for Radius := 1 to 50 by 1 //循环 dilation_circle (Region, RegionDilation, Radius) //利用半径为 Radius 的圆对 Region 进行膨胀 运算,输出 RegionDilation,输出形式仍然为 Region。 area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标 Areas[Radius-1] := Area //对数组 Areas 的第 Radius-1 个元素进行赋值 endfor 3.基本数组操作极其对应的算子 t := [t1,t2] t1,t2 连接成新的数组 对应算子:tuple_concat i := |t| 得到数组长度 tuple_length v := t[i] 选取第 i 个元素 0<= i < |t| tuple_select t := t[i1:i2] 选取 i1 到 i1 的元素 tuple_select_range t := subset(t,i) 选取数组 t 中的第 i 个元素 tuple_select t := remove(t,i) 去除数组 t 中的第 i 个元素 tuple_remove i := find(t1,t2) 找到 t2 数组在 t1 数组中出现位置索引 (or -1 if no match) tuple_find t := uniq(t) 在 t 数组中把连续相同的值只保留一个 tuple_uniq 4.创建数组 (1)gen_tuple_const 函数 tuple := gen_tuple_const(100,4711) //创建一个具有 100 个元素的,每个元素都为 4711 的数 据 tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的数据 上面的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711 (2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值

例如:tuple := [] for i := 1 to 100 by 1 tuple := [tuple,i*i] endfor

//创建空数组 //建立步长为 1 的循环 //将 i 方的值赋给数组的第 i 个元素 //循环结束

Halcon 学习(四)区域连通
(2012-12-17 17:22:31)
Halcon 中的区域连通算子( 区域连通算法,将图象被分割为区域 ): regiongrowing(Image : Regions : Row, Column, Tolerance, MinSize : ) Row:被测试的区域的垂直距离 Column:被测试的区域的水平距离 Tolerance:两个点之间的最大的灰度差距:|g_1 - g_2| < Tolerance MinSize:最小的输出区域(记输出的连通区域的尺寸) 例 :regiongrowing (Image, Regions, 3, 3, 6, 100) 均值滤波算子 mean_image(Image : ImageMean : MaskWidth, MaskHeight : ) 程序如下:(mean_image read_image(Image,'E:/halcon 图像/die_03.png') mean_image(Image,Mean,7,7) regiongrowing(Mean,Result,7,7,6.0,200)

Halcon 学习(五)获取特征点
(2012-12-17 19:05:13)

这个例程是要检查图中焊接点,并获取焊接点的直径。 处理过程: 首先,分离比较明亮的区域,然后将找出来的结果,转换成最小的平行矩形,即获得了图 像处理的 ROI。 这里采用了阈值分割:将图像中的灰度值处于某一指定灰度值范围内全部点选到输出 区域中。threshold (Bond, Bright, 100, 255) 然后,在 ROI 区域内选择比较暗的区域,移除不适合的区域(利用形状,面积等参数), 把物体抽出变成一个独立的物,找出圆形物体,并且排列物体即可。

程序如下:
dev_close_window () dev_open_window(0, 0, -1, -1, 'black', WindowID) read_image(Die, 'E:/halcon 图像/die_03.png') dev_display(Die) threshold(Die, Brightregion,100,255) shape_trans(Brightregion, ROI, 'rectangle2') reduce_domain(Die, ROI, DieROI) threshold(DieROI, RawSegmentation,0,50) fill_up_shape(RawSegmentation, Wires, 'area', 1, 100) opening_circle(Wires, BallRegion, 15.5) connection(BallRegion, Balls) select_shape(Balls, FinalBalls, 'circularity', 'and', 0.85, 1.0) count_obj(FinalBalls,NumBalls) smallest_circle(FinalBalls, Row, Column, Radius) meanRadius := sum(Radius)/|Radius| area_center(FinalBalls, Area, RowCenter, Colcenter) minArea := min(Area) disp_circle(WindowID, Row, Column, Radius)

所用到的算子如下: threshold(Image : Region : MinGray, MaxGray : ) 阈值处理算子, MinGray <= g <= MaxGray,halcon 软件将 g 所在的范围变成红色。 shape_trans(Region : RegionTrans : Type : )

threshold 的参数 100 及 255,即可产生一个合理的 raw segmentation,然后把这个区 域转成一个 ROI, 做为 bonding balls 侦测之用。 选用 shapr_trans, 以"Brightregion" 为输入区域,参数用"rectangle2",来找出一个包含"Brightregion"最小的平行四边型。 输出的 region 取名为"ROI",差不多就是电路板的大小了。再来用 reduce_domain,把 原始影像约化成包含 ROI 的范围。 reduce_domain(Image, Region : ImageReduced : : ) 裁剪区域算子 fill_up_shape(Region : RegionFillUp : Feature, Min, Max : ) 填充满足给定的图形特征的区 域。 opening_circle(Region : RegionOpening : Radius : ) 打开具有圆形结构的区域
connection(Region : ConnectedRegions : : )区域连通 select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )选择满足要求的区域 count_obj(Objects : : : Number) 计数 smallest_circle(Regions : : : Row, Column, Radius) 包含一 region 的最小圆,圆心位置以及半径 *注意,'||'中求的不是绝对值,而是 tuple 数据的数目,这个例子中就是7。 area_center(Regions : : : Area, Row, Column) 计算圆心 disp_circle( : : WindowHandle, Row, Column, Radius : )将几个圆显示在原始图像中

Halcon 学习(六)计数与排序
(2012-12-17 19:55:11)

在 Halcon 里面计算个数的算子有两个: 1、count_obj ( Objects : : : Number ) 主要用法是计算 objects 的个数。 2、assign ( : : Input : Result ) 给控制变量分配新值 例: NumBalls := |Radius| 区别 是 Count_obj 主要是用来计算被识别出来的区域的个数 Assign 主要是用来识别数组中的值 在众多区域中选择输出的算子是 select_obj ( Objects : ObjectSelected : Index : ) Index 是指编号,且从 1 开始 计数 在 halcon 学习(三)种加入 select_obj 算子,并显示第三个焊接点所在的圆的位置。 这里我们发现一个问题。圆不是按坐标位置排列的。可以考虑算子 程序如下: reduce_domain(Die, ROI, DieROI) threshold(DieROI, RawSegmentation,0,50) fill_up_shape(RawSegmentation, Wires, 'area', 1, 100) opening_circle(Wires, BallRegion, 15.5) connection(BallRegion, Balls) select_shape(Balls, FinalBalls, 'circularity', 'and', 0.85, 1.0) count_obj(FinalBalls,NumBalls) select_obj (FinalBalls, ObjectSelected,3) smallest_circle(ObjectSelected, Row, Column, Radius) meanRadius := sum(Radius)/|Radius| area_center(FinalBalls, Area, RowCenter, Colcenter)

minArea := min(Area) disp_circle (WindowID, Row, Column, Radius) 这里我们发现一个问题。圆不是按坐标位置排列的。我们想显示的是第 3 个圆,可是显 示的是第 5 个圆。可以考虑算子 sort_region(Regions : SortedRegions : SortMode, Order, RowOrCol : ) 根据他们的位置关系进行排序 修改程序如下: dev_close_window () dev_open_window(0, 0, -1, -1, 'black', WindowID) read_image(Die, 'E:/halcon 图像/die_03.png') dev_display(Die) threshold(Die, Brightregion,100,255) shape_trans(Brightregion, ROI, 'rectangle2') reduce_domain(Die, ROI, DieROI) threshold(DieROI, RawSegmentation,0,50) fill_up_shape(RawSegmentation, Wires, 'area', 1, 100) opening_circle(Wires, BallRegion, 15.5) connection(BallRegion, Balls) select_shape(Balls, FinalBalls, 'circularity', 'and', 0.85, 1.0) sort_region (FinalBalls, SortedRegions, 'upper_left', 'true', 'column') count_obj(SortedRegions,NumBalls) select_obj (SortedRegions, ObjectSelected,3) smallest_circle(ObjectSelected, Row, Column, Radius) meanRadius := sum(Radius)/|Radius| area_center(SortedRegions, Area, RowCenter, Colcenter) minArea := min(Area) disp_circle (WindowID, Row, Column, Radius) 显示效果如下:

Halcon 学习(七)图像中显示文字
(2012-12-17 20:47:03)

在图像中显示文字,数字等文本。 * ball.hdev: Inspection of Ball Bonding dev_update_window ('off') dev_close_window () dev_open_window (0, 0, 728, 512, 'black', WindowID) read_image (Bond, 'die/die_03') dev_display (Bond) set_display_font (WindowID, 14, 'mono', 'true', 'false') disp_continue_message (WindowID, 'black', 'true') stop () threshold (Bond, Bright, 100, 255) shape_trans (Bright, Die, 'rectangle2')

dev_set_color ('green') dev_set_line_width (3) dev_set_draw ('margin') dev_display (Die) disp_continue_message (WindowID, 'black', 'true') stop () reduce_domain (Bond, Die, DieGrey) threshold (DieGrey, Wires, 0, 50) fill_up_shape (Wires, WiresFilled, 'area', 1, 100) dev_display (Bond) dev_set_draw ('fill') dev_set_color ('red') dev_display (WiresFilled) disp_continue_message (WindowID, 'black', 'true') stop () opening_circle (WiresFilled, Balls, 15.5) dev_set_color ('green') dev_display (Balls) disp_continue_message (WindowID, 'black', 'true') stop () connection (Balls, SingleBalls) select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0) sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column') dev_display (Bond) dev_set_colored (12) dev_display (FinalBalls) disp_continue_message (WindowID, 'black', 'true') stop () smallest_circle (FinalBalls, Row, Column, Radius) NumBalls := |Radius| Diameter := 2 * Radius meanDiameter := sum(Diameter) / NumBalls mimDiameter := min(Diameter) dev_display (Bond) disp_circle (WindowID, Row, Column, Radius) dev_set_color ('white') for i := 1 to NumBalls by 1 if (fmod(i,2) == 1) disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false') else disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] + 1.2 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false') endif

endfor dev_set_color ('green') dev_update_window ('on') disp_continue_message (WindowID, 'black', 'true') stop () dev_close_window () 注释: dev_update_window ('off') 和 dev_close_window ()的区别: dev_update_window ('off'):关闭图像窗口的内容,不关闭图形窗口 dev_close_window ():关闭图形窗口 dev_open_window (0, 0, 728, 512, 'black', WindowID):打开一个原点在(0,0)的,宽 728,高 512,背 景为黑色的图形窗口 dev_display (Bond):显示图像,和 matlab 的 imshow 一样。 set_display_font (WindowID, 14, 'mono', 'true', 'false'):设置显示的字体 disp_continue_message (WindowID, 'black', 'true'):显示“Press Run (F5) to continue” dev_set_color ('green'):设置显示的颜色 dev_set_line_width (3) :设置显示线条的宽度 dev_set_draw ('margin'):设置所画图形的形状 if (fmod(i,2) == 1):判断 i/2 的余数是否为 1 disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false'):在图像的(Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0])的这个位置 显示“D:半径”

Halcon 学习(八)文本操作
(2012-12-17 21:22:06)

1.open_file( : : FileName, FileType : FileHandle) FileType: 'output':创建文本 ?append':在原有的文本基础上写入该文件 'input':打开文件 2.fwrite_string( : : FileHandle, String : )写入文件 3.fnew_line( : : FileHandle : )换行 4.close_file( : : FileHandle : )关闭文件 5.fread_char( : : FileHandle : Char)读入字符
6.fread_line( : : FileHandle : OutLine, IsEOF)行读取,IsEOF:判断是否到了文本文件的末尾 7.fread_string( : : FileHandle : OutString, IsEOF)读入字符串 程序如下: open_file ('E:/halcon 图像/新建文本文档.txt', 'output', FileHandle) fwrite_string (FileHandle, 'hallo') fnew_line (FileHandle) close_file (FileHandle) open_file ('E:/halcon 图像/新建文本文档.txt', 'input', FileHandle) * fread_char (FileHandle, Char)

* fread_line (FileHandle, OutLine, IsEOF) fread_string (FileHandle, OutString, IsEOF1) 注意最后三行显示的内容不一样

Halcon 学习(九)两幅图像之间处理
(2012-12-17 21:51:40)

1.sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : ) 对两幅图像做减法 g' := (g1 - g2) * Mult + Add 程序如下: read_image (Scene00, 'autobahn/scene_00') read_image (Scene01, 'autobahn/scene_01') sub_image (Scene00, Scene01, ImageSub1, 1, 0) dev_display(ImageSub1) 2.abs_image(Image : ImageAbs : : )计算图像的绝对值模型 3.crop_part(Image : ImagePart : Row, Column, Width, Height : )剪切出一个长方形的图像 4.add_image(Image1, Image2 : ImageResult : Mult, Add : ) 两图像相叠 加 g' := (g1 + g2) * Mult + Add 5.max_image(Image1, Image2 : ImageMax : : )计算两幅图像每个像素点的最大值 6.min_image(Image1, Image2 : ImageMin : : )计算两幅图像每个像素点的最小值 7.div_image(Image1, Image2 : ImageResult : Mult, Add : ) 两幅图像相 除 g' := g1 / g2 * Mult + Add 8.mult_image(Image1, Image2 : ImageResult : Mult, Add : )两幅图像相 乘 g' := g1 * g2 * Mult + Add

Halcon 学习(十)边缘检测(一)
边缘检测的定义 :使用数学方法提取图像像元中具有亮度值(灰度)空间方向梯度大的 边、线特征的过程。 边缘 是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。图像的边缘对应着 图像灰度的不连续性。 显然图像的边缘很少是从一个灰度跳到另一个灰度这样的理想状况。 真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。边缘的锐利程度由图像灰 度的梯度决定。梯度是指灰度变化的最快的方向和数量。 常见的边缘点有三种 :第一种是阶梯形边缘 (Step-edge), 即从一个灰度到比它高好多 的另一个灰度。 第二种是屋顶型边缘 (Roof-edge), 它的灰度是慢慢增加到一定程度然后 慢慢减小。 还有一种是线性边缘 (Line-edge), 它的灰度从一级别跳到另一个灰度级别之 后然后回来。 边缘检测的方法主要有以下几种: 第一种检测梯度的最大值。 由于边缘发生在图像灰度值变化比较大的地方 ,对应连续情形 就是说是函数梯度较大的地方, 所以研究比较好的求导算子就成为一种思路。 Roberts 算 子、 Prewitt 算子和 Sobel 算子等就是比较简单而常用的例子。 还有一种比较直观的方 法就是利用当前像素邻域中的一些像素值拟合一个曲面 , 然后求这个连续曲面在当前像

素处梯度。 从统计角度来说 , 我们可以通过回归分析得到一个曲面 , 然后也可以做类似 的处理。 第二种是检测二阶导数的零交叉点。 这是因为缘处的梯度取得最大值 ( 正的或者负的 ), 也就是灰度图像的拐点是边缘。从分析学上我们知道 , 拐点处函数的二阶导数是 0 。 第三种, 统计型方法。 比如说利用假设检验来检测边缘中利用对二阶零交叉点的统计分析 得到了图像中各个像素是边缘的概率,并进而得到边缘检测的方案。

1.sobel_amp(Image : EdgeAmplitude : FilterType, Size : )图像的一次导数计算图像的边缘根据 程序如下:
read_image (Image, 'fabrik')
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3) threshold (EdgeAmplitude, Region, 10, 255) skeleton (Region, Skeleton) dev_display (Image) dev_set_color ('white') dev_display (Skeleton) Image EdgeAmplitude Region Skeleton

Halcon 学习(十一)边缘检测(二)
2.close_edges(Edges, EdgeImage : RegionResult : MinAmplitude : ) 程序如下: read_image (Image, 'fabrik') dev_close_window () get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowID) sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3) threshold (EdgeAmplitude, Edges, 30, 255) close_edges (Edges, EdgeAmplitude, EdgesExtended, 15) dev_set_color ('green') dev_display (EdgesExtended) dev_set_color ('red') dev_display (Edges) Image EdgeAmplitude Edges EdgesExtended

Halcon 学习(十二)边缘检测(三)

sobel_amp ( Image : EdgeAmplitude : FilterType, Size : ) 根据图像的一次导数计 算图像的边缘 close_edges ( Edges, EdgeImage : RegionResult : MinAmplitude : ) close_edges_length ( Edges, Gradient : ClosedEdges : MinAmplitude, MaxGapLength : ) 使用边缘高度 图像关闭边缘间隙。输出的区域包含杯关闭的区域。(感觉是对边缘的扩充) derivate_gauss ( Image : DerivGauss : Sigma, Component : ) watersheds ( Image : Basins, Watersheds : : ) 从图像中提取风水岭。 zero_crossing ( Image : RegionCrossing : : ) 零交点(二次导数) diff_of_gauss ( Image : DiffOfGauss : Sigma, SigFactor : ) 近似日志算子( 拉普 拉斯高斯) 。 laplace_of_gauss ( Image : ImageLaplace : Sigma : ) 拉普拉斯高斯 edges_color_sub_pix ( Image : Edges : Filter, Alpha, Low, High : ) 精确的亚像素边缘提取(彩色图像) edges_sub_pix ( Image : Edges : Filter, Alpha, Low, High : ) 精确边缘提取的亚 像素(灰度图像) edges_color ( Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : ) 根据 颜色进行边缘提取 edges_image ( Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : ) 边缘 提取 skeleton ( Region : Skeleton : : ) 计算区域的框架 Skeleton == Region frei_amp ( Image : ImageEdgeAmp : : ) Frei-chen 模板进行边缘检测(振幅) frei_dir ( Image : ImageEdgeAmp, ImageEdgeDir : : ) Frei-chen 模板进行边缘检测 (振幅和方向) nonmax_suppression_dir ( ImgAmp, ImgDir : ImageResult : Mode : ) 使用方向图像 抑制所有的超过给定最大值的图像灰度值的点 gen_contours_skeleton_xld ( Skeleton : Contours : Length, Mode : ) 将系统框架 转换成 XLD 轮廓 laplace ( Image : ImageLaplace : ResultType, MaskSize, FilterMask : ) 使用有限 差分计算拉普拉斯变换 info_edges ( : : Filter, Mode, Alpha : Size, Coeffs ) 估计滤波器的宽度 kirsch_dir ( Image : ImageEdgeAmp, ImageEdgeDir : : ) 使用 Kirsch 算子计算出边 缘(振幅和方向) prewitt_amp ( Image : ImageEdgeAmp : : ) 使用 Prewitt 算子计算出边缘(振幅) kirsch_amp ( Image : ImageEdgeAmp : : ) 使用 Kirsch 算子计算出边缘(振幅) highpass_image ( Image : Highpass : Width, Height : ) 从高频成分提取的图像。 sobel_amp ( Image : EdgeAmplitude : FilterType, Size : )使用 Sobel 算子计算出 边缘(振幅) robinson_amp ( Image : ImageEdgeAmp : : ) 使用 Robinson 算子计算出边缘(振幅) roberts ( Image : ImageRoberts : FilterType : ) 使用 Robert 算子计算边缘

Halcon 学习(十三)参数和数据结构
(2012-12-23 11:46:09)

HALCON 有两种基本的数据型态 : 图像数据 (iconic ,例如影像 ) 以及控制数据 ( control ,例如 变量,整数,字符串, handle 等等 ) 。所有运算子的参数都是以相 同的方式排列:输入图像,输出图像,输入控制,输出控制。 当然,并非所有的运算子 都具有上列四类参数,不过参数排列的次序依旧相同。 ROI :影像中要处理的数据范围。 region 即是一堆像元的集合。 region 中的像元不一定要相连,如果要让相连接的像 元成为一个 region ,只要呼叫运算子 connection 即可。 XLD 包含了所有等值线以及多边型的数据。。 XLD 对象中除了点坐标数据,还包含了全 域或区域属性,例如 edge 方向,或是分割时的 regression 参数等等。 Tuples 就像一个数组,其中的数据型态可为整数,浮点数或是字符串。当我们计算一个 region 的某些特征时,会传回一个 结果,如果计算的是一群 region ,会传回一个 tuple ,其中含有每个 region 的特征计算结果。 Control tuple 的指标由0开始。

Halcon 学习(十四)绘图
halcon 提供的算子进行简单形状的图形绘制。 同时学习一下 gen_rectangle1 和 gen_rectangle2 的两个算子之间的区别。 程序如下: dev_update_off () Dark := 100 Background := 175 Light := 250 gen_image_const (Image, 'byte', 256, 280) scale_image (Image, Image, 1, Background) gen_rectangle1 (Rectangle, 81, 81, 121, 121) overpaint_region (Image, Rectangle, Light, 'fill') gen_rectangle1 (Rectangle, 40, 81, 80, 121) overpaint_region (Image, Rectangle, Dark, 'fill') gen_rectangle1 (Rectangle, 81, 40, 121, 80) overpaint_region (Image, Rectangle, Dark, 'fill') gen_circle (Circle, 160, 40, 2) overpaint_region (Image, Circle, Dark, 'fill') gen_circle (Circle, 160, 100, 4) overpaint_region (Image, Circle, Dark, 'fill') gen_circle (Circle, 160, 160, 6) overpaint_region (Image, Circle, Dark, 'fill') gen_circle (Circle, 220, 40, 6) overpaint_region (Image, Circle, Light, 'fill') gen_circle (Circle, 220, 100, 4) overpaint_region (Image, Circle, Light, 'fill') gen_circle (Circle, 220, 160, 2) overpaint_region (Image, Circle, Light, 'fill') gen_rectangle1 (Rectangle, 140, 220, 240, 222) overpaint_region (Image, Rectangle, Light, 'fill')
(2012-12-24 12:01:14)用

gen_rectangle1 (Rectangle, 200, 180, 202, 240) overpaint_region (Image, Rectangle, Light, 'fill') gen_rectangle2 (Rectangle, 60, 200, rad(45), 40, 10) overpaint_region (Image, Rectangle, Dark, 'fill') gen_rectangle2 (Rectangle, 60, 200, rad(-45), 40, 10) overpaint_region (Image, Rectangle, Dark, 'fill') dev_display(Image) 如图所示: 所用到的算子: 1.gen_image_const( : Image : Type, Width, Height : )产生一个图形常量 2.scale_image(Image : ImageScaled : Mult, Add : )注释:g' := g * Mult + Add 3.gen_rectangle1( : Rectangle : Row1, Column1, Row2, Column2 : )产生一个平行坐标轴的矩形 4.overpaint_region(Image, Region : : Grayval, Type : )绘制矩形 5.gen_circle( : Circle : Row, Column, Radius : )产生一个圆 6.gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )产生一个任意的矩形(和坐标轴 倾斜 Phi 角度的一个矩形)

Halcon 学习(十五)角点检测
* This program compares the result of different operators * which detect points of interest dev_update_off () Dark := 100 Background := 175 Light := 250 Angle := rad(45) Size := 3 create_test_image (Image, Background, Light, Dark) dev_close_window () get_image_size (Image, Width, Height) dev_open_window (0, 0, 512, 512, 'black', WindowHandle) set_display_font (WindowHandle, 16, 'mono', 'true', 'false') dev_set_color ('black') dev_set_line_width (3) * Foerstner interest points detector points_foerstner (Image, 1, 2, 3, 200, 0.3, 'gauss', 'true', RowJunctions, ColJunctions, CoRRJunctions, CoRCJunctions, CoCCJunctions, RowArea, ColArea, CoRRArea, CoRCArea, CoCCArea) gen_cross_contour_xld (CrossFoerstner, RowJunctions, ColJunctions, Size, Angle) dev_display (Image) dev_display (CrossFoerstner) disp_message (WindowHandle, 'Foerstner interest points detector', 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * Harris interest points detector

points_harris (Image, 0.7, 2, 0.04, 0, RowHarris, ColHarris) gen_cross_contour_xld (CrossHarris, RowHarris, ColHarris, Size, Angle) dev_display (Image) dev_display (CrossHarris) disp_message (WindowHandle, 'Harris interest points detector', 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * Harris binomial interest points detector points_harris_binomial (Image, 5, 15, 0.04, 1000, 'on', RowHarrisBinomial, ColHarrisBinomial) gen_cross_contour_xld (CrossHarrisBinom, RowHarrisBinomial, ColHarrisBinomial, Size, Angle) dev_display (Image) dev_display (CrossHarrisBinom) disp_message (WindowHandle, 'Harris binomial interest points detector', 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * Sojka interest points detector points_sojka (Image, 9, 2.5, 0.75, 30, 90, 0.5, 'true', RowSojka, ColSojka) gen_cross_contour_xld (CrossSojka, RowSojka, ColSojka, Size, Angle) dev_display (Image) dev_display (CrossSojka) disp_message (WindowHandle, 'Sojka interest points detector', 'window', 12, 12, 'black', 'true') disp_continue_message (WindowHandle, 'black', 'true') stop () * Lepetit interest points detector points_lepetit (Image, 3, 1, 20, 35, 'interpolation', RowLepetit, ColLepetit) gen_cross_contour_xld (CrossLepetit, RowLepetit, ColLepetit, Size, Angle) dev_display (Image) dev_display (CrossLepetit) disp_message (WindowHandle, 'Lepetit interest points detector', 'window', 12, 12, 'black', 'true') 红色的 create_test_image (Image, Background, Light, Dark)这个函数为外部函数(即自己所写函数) 具体的过程创建见下一节。halcon 学习(十六)函数调用 create_test_image 函数 程序如下: gen_image_const (Image, 'byte', 256, 280) scale_image (Image, Image, 1, Background) gen_rectangle1 (Rectangle, 40, 40, 80, 80) overpaint_region (Image, Rectangle, Light, 'fill') gen_rectangle1 (Rectangle, 81, 81, 121, 121) overpaint_region (Image, Rectangle, Light, 'fill') gen_rectangle1 (Rectangle, 40, 81, 80, 121) overpaint_region (Image, Rectangle, Dark, 'fill') gen_rectangle1 (Rectangle, 81, 40, 121, 80) overpaint_region (Image, Rectangle, Dark, 'fill') gen_circle (Circle, 160, 40, 2) overpaint_region (Image, Circle, Dark, 'fill')

gen_circle (Circle, 160, 100, 4) overpaint_region (Image, Circle, Dark, 'fill') gen_circle (Circle, 160, 160, 6) overpaint_region (Image, Circle, Dark, 'fill') gen_circle (Circle, 220, 40, 6) overpaint_region (Image, Circle, Light, 'fill') gen_circle (Circle, 220, 100, 4) overpaint_region (Image, Circle, Light, 'fill') gen_circle (Circle, 220, 160, 2) overpaint_region (Image, Circle, Light, 'fill') gen_rectangle1 (Rectangle, 140, 220, 240, 222) overpaint_region (Image, Rectangle, Light, 'fill') gen_rectangle1 (Rectangle, 200, 180, 202, 240) overpaint_region (Image, Rectangle, Light, 'fill') gen_rectangle2 (Rectangle, 60, 200, rad(45), 40, 10) overpaint_region (Image, Rectangle, Dark, 'fill') gen_rectangle2 (Rectangle, 60, 200, rad(-45), 40, 10) overpaint_region (Image, Rectangle, Dark, 'fill') return ()

Halcon 学习(十六)函数调用
上一节遇到函数调用的问题。本节将学习函数调用。也就是创建新的过程以及调用。 创建新的过程有以下几种方法: 第一种: 第二种 创建完过程之后,就可以编辑新的过程了。包括名称,参数设置等等。设置完成后,应用,确定。 最后编辑完 main 函数后记得保存。

Halcon 学习(十七)标定板的规格
(2012-12-24 16:29:10)

30*30 规格的标定板的规格 黑色圆点行数: 7 黑色圆点列数: 7 外边框长度: 30mm*30mm 内边框长度: 28.125mm*28.125mm 即: 黑色边框线宽 为一个圆点半径(0.9375) 黑色圆点半径: 0.9375mm 圆点中心间距: 3.75mm 裁剪宽度: 30.75mm*30.75mm 即: 由黑色边框向外 延伸 0.375mm 边角: 由黑色外边框向内缩进一个中心边距的长度

40*40 规格的标定板的规格 黑色圆点行数: 7 黑色圆点列数: 7 外边框长度: 40mm*40mm 内边框长度: 37.5mm*37.5mm 即:黑色边框线宽为一个圆点半径(0.125) 黑色圆点半径: 0.125mm 圆点中心间距: 5mm 裁剪宽度: 21mm*21mm 即:由黑色边框向外延伸 0.5mm 边角: 由黑色外边框向内缩进一个中心边距的长度 50*50 规格的标定板的规格 黑色圆点行数: 7 黑色圆点列数: 7 外边框长度: 50mm*50mm 内边框长度: 46.875mm*46.875mm 即:黑色边框线宽为一个圆点半径(1.5625) 黑色圆点半径: 1.5625mm 圆点中心间距: 6.25mm 裁剪宽度: 51.25mm*51.25mm 即:由黑色边框向外延伸 0.625mm 边角: 由黑色外边框向内缩进一个中心边距的长度 60*60 规格的标定板的规格 黑色圆点行数: 7 黑色圆点列数: 7 外边框长度: 60mm*60mm 内边框长度: 56.25mm*56.25mm 即:黑色边框线宽为一个圆点半径(1.875) 黑色圆点半径: 1.875mm 圆点中心间距: 7.5mm 裁剪宽度: 61.5mm*61.5mm 即:由黑色边框向外延伸 0.75mm 边角: 由黑色外边框向内缩进一个中心边距的长度

Halcon 学习(十八)如何制作标定板
(2012-12-24 16:30:46)

下面我具体介绍一下,如何制作 halcon 的标准标定板 方法一:用 halcon 软件自动生成的.ps 文件来制作标定板。 这个也是最简单有效的方法。 打开 halcon 的 HDevelop 软件,调用算子: gen_caltab( : : XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile : ) XNum 每行黑色标志圆点的数量。 YNum 每列黑色标志圆点的数量。 MarkDist 两个就近黑色圆点中心之间的距离。 DiameterRatio 黑色圆点半径与圆点中心距离的比值。 CalTabDescrFile 标定板描述文件的文件路径(.descr)。 CalTabPSFile 标定板图像文件的文件路径(.ps),如图 1 然后复位(F2),点击运行(F5)通过软件 Gsview 打开,按 1:1 比例打印,OK! 备注一个 30*30 的标准标定板的 halcon 源代码。

gen_caltab(7,7,0.00375,0.5,'F:/halcon 程 序 /gencaltab/30_30.descr','F:/halcon 程 序 /gencaltab/40_40.ps') 规格的标定板的规格 黑色圆点行数: 7 黑色圆点列数: 7 外边框长度: 30mm*30mm 内边框长度: 28.125mm*28.125mm 即:黑色边框线宽为一个圆点半径(0.9375) 黑色圆点半径: 0.9375mm 圆点中心间距: 3.75mm 裁剪宽度: 30.75mm*30.75mm 即:由黑色边框向外延伸 0.375mm 边角: 由黑色外边框向内缩进一个中心边距的长度 方法二:用 halcon 软件自动生成的.descr 文件来制作标定板。 打开 halcon 的 HDevelop 软件,调用算子: gen_caltab 生成一个.descr 的文件,用写字板打开(注意要用写字板,记事本打开会有一些数据不可 见,一般 windowsXP 在 C:\Program Files\Windows NT\Accessories 就有写字板软件 wordpad.exe) 打开后的文件基本如下: 以 40*40 为例: # Plate Description Version 2 # HALCON Version 10.0 -- Mon Dec 19 11:08:07 2011 # Description of the standard calibration plate 标准标定板的描述 # used for the CCD camera calibration in HALCON # (generated by gen_caltab) (由)gen_caltab 算子生成 # # # 7 rows x 7 columns 7 行*7 列 # Width, height of calibration plate [meter]: 0.04, 0.04 标定板的宽和高:0.04 米,0.04 米 # Distance between mark centers [meter]: 0.005 标志圆点中心间距:0.005 米 # Number of marks in y-dimension (rows) r7 Y 方向标志圆点的数量。 # Number of marks in x-dimension (columns) c7 X 方向标志圆点的数量。 # offset of coordinate system in z-dimension [meter] (optional): z0 Z 坐标偏移 # Rectangular border (rim and black frame) of calibration plate 标定板的矩形边框(边缘和黑色边框) # rim of the calibration plate (min x, max y, max x, min y) [meter]: o -0.0205 0.0205 0.0205 -0.0205 标定板的剪切边缘【-0.0205 0.0205 0.0205 -0.0205】(以标定板中心为坐标圆点) # outer border of the black frame (min x, max y, max x, min y) [meter]:

i -0.02 0.02 0.02 -0.02 黑色边框的外边缘【-0.02 0.02 0.02 -0.02】 # triangular corner mark given by two corner points (x,y, x,y) [meter] # (optional): t -0.02 -0.015 -0.015 -0.02 三角形标志【-0.02 -0.015 -0.015 -0.02】 # width of the black frame [meter]: w 0.00125 黑色边框线的宽度:0.00125 米。 # calibration marks: x y radius [meter] 一下是各个矫正板黑色圆点在标定板上的坐标(共 7*7 个) # calibration marks at y = -0.015 m -0.015 -0.015 0.00125 -0.01 -0.015 0.00125 -0.005 -0.015 0.00125 0 -0.015 0.00125 0.005 -0.015 0.00125 0.01 -0.015 0.00125 0.015 -0.015 0.00125 # calibration marks at y = -0.01 m -0.015 -0.01 0.00125 -0.01 -0.01 0.00125 -0.005 -0.01 0.00125 0 -0.01 0.00125 0.005 -0.01 0.00125 0.01 -0.01 0.00125 0.015 -0.01 0.00125 # calibration marks at y = -0.005 m -0.015 -0.005 0.00125 -0.01 -0.005 0.00125 -0.005 -0.005 0.00125 0 -0.005 0.00125 0.005 -0.005 0.00125 0.01 -0.005 0.00125 0.015 -0.005 0.00125 # calibration marks at y = 0 m -0.015 0 0.00125 -0.01 0 0.00125 -0.005 0 0.00125 0 0 0.00125 0.005 0 0.00125 0.01 0 0.00125 0.015 0 0.00125 # calibration marks at y = 0.005 m

-0.015 0.005 0.00125 -0.01 0.005 0.00125 -0.005 0.005 0.00125 0 0.005 0.00125 0.005 0.005 0.00125 0.01 0.005 0.00125 0.015 0.005 0.00125 # calibration marks at y = 0.01 m -0.015 0.01 0.00125 -0.01 0.01 0.00125 -0.005 0.01 0.00125 0 0.01 0.00125 0.005 0.01 0.00125 0.01 0.01 0.00125 0.015 0.01 0.00125 # calibration marks at y = 0.015 m -0.015 0.015 0.00125 -0.01 0.015 0.00125 -0.005 0.015 0.00125 0 0.015 0.00125 0.005 0.015 0.00125 0.01 0.015 0.00125 0.015 0.015 0.00125

Halcon 学习(十九)标定文件的生成
(2012-12-24 16:34:36)

Halcon 标定文件的生成,需要有以下几个步骤: 1.创建一个标定数据模板,由 create_calib_data 算来完成。 2.指定相机的类型,初始化相机内部参数,由 set_calib_data_cam_param 算子来完成。 3.指定标定板的描述文件,由 set_calib_data_calib_object 算子完成。 4.收集观察数据,有算子 set_calib_data_observ_points 完成。也就是收集标定板上圆点的中心坐标, 跟各个校正板的位置姿态。 5.配置校正过程。由算子 set_calib_data 完成。 6.将数据整合进行标定计算。calibrate_cameras 7.获得标定参数。get_calib_data 8.记录标定参数,write_cam_par StartCamPar := [0.016, 0, 0.0000074, 0.0000074, 326, 247, 652, 494] 解释一下这个数组的意思。 面阵相机有 14 或 18 个参数(根据想相机的畸变模式),对于线阵相机有 17 个参数。这些参数可以 分开为内部相机参数、外部相机参数。 面阵相机(division 模式): Focus(焦距):远焦镜头镜头焦距的长度 Kappa:扭曲系数

Sx,Sy:两像素间距 Cx,Cy:中心点坐标 Whith,Height:图像的宽高 面阵相机(polynomia 模式): Focus(焦距):远焦镜头镜头焦距的长度 K1, K2, K3, P1,P2:扭曲系数 Sx,Sy:两像素间距 Cx,Cy:中心点坐标 Whith,Height:图像的宽高 线阵相机不做具体介绍

Halcon 学习(二十)摄像机标定常用函数(一)
(2012-12-24 16:34:26)

在 HALCON 所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控 制输出,其中四个参数任意一个可以为空。控制输入量可以是变量、常量、表达式,控制 输出以及图像输入和输入必须是变量,以存入算子计算结果中。 1.caltab_points:从标定板中读取 marks 中心坐标,该坐标值是标定板坐标系统里的坐标 值,该坐标系统以标定板为参照,向右为 X 正,下为 Y 正,垂直标定板向下为 Z 正。该 算子控制输出为标定板中心 3D 坐标。 2.create_calib_data:创建 Halcon 标定数据模型。输出一个输出数据模型句柄。 3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和 类型。设置索引,类型,以及相机的原始内参数等。 4.set_calib_data_calib_object:在标定模型中设定标定对象。设定标定对象句柄索引, 标定板坐标点储存地址。 5.find_caltab:分割出图像中的标准标定板区域。输出为标准的标定区域,控制 6.find_marks_and_pose: 抽取标定点并计算相机的内参数。 输出 MARKS 坐标数组, 以及估算的相机外参数。 即标定板在相机坐标系中的位姿,由 3 个平移量和 3 个旋转量构成。 7.set_calib_data_observ_points( : : CalibDataID, CameraIdx, Cali bObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose : ) 收集算子 6 的标定数据, 将标定数据储存在标定数据模型中。 输入控制分别为标定数据模 型句柄,相机索引,标定板索引,位姿索引,行列坐标,位姿。 8.calibrate_cameras( : : CalibDataID : Error) 标定一台或多台相机,依据 CalibDataID 中的数据。控制输出平均误差。 9.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : Da

taValue) 获得标定数据。 依靠索引号和数据名称来返回输出的数据值。 可查询与模型相关的数据, 与相机相关的数 据(包括相机的内外参数等),与标定对象相关的数据,与标定对象的姿态相关的数据。 控制输出是要查询的标定数据。 如:get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) //查询相机的位姿 get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) // 查询标定 板位姿 10.write_cam_par( : : CameraParam, CamParFile : ) 记录相机的内参数,输 入控制为内参数,输出控制为 存取相机内参数的文件名。 11.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin) 设置新的坐标原点, 控制输入为原始的位姿和沿着世界坐标系的三个坐标轴的平移量, 控 制输出为新的位姿。

Halcon 学习(二十一)摄像机标定常用函数(二)
(2012-12-24 16:36:31) 1.read_cam_par( : : CamParFile : CameraParam) 从文件夹中读取相机的内参数。 2.disp_caltab( : : WindowHandle, CalTabDescrFile, CameraParam, CaltabPose, ScaleFac : ) 利用相机内外参数,把标定板模型投影到图像平面,显示标定点和连接线,X,Y 轴也被显示出来。 3.vector_to_pose( : : WorldX, WorldY, WorldZ, ImageRow, ImageColumn, CameraParam,Method, QualityType : Pose, Quality) 计算世界坐标和图像坐标之间关系的绝对位姿参数。其中世界坐标至少选择不在同一条直线上的三个 点。世界坐标上的点如果在一个平面上,应该选择'planar_analytic' 作为 Method 的参数。输出位姿和 位姿质量。 4.write_pose( : : Pose, PoseFile : ) 把位姿写入 TXT 文件。 5.get_mbutton( : : WindowHandle : Row, Column, Button) 返回鼠标点击的图像点像素坐标,以及鼠标按钮值,左键 0,中间键 2,右键 4. 6.image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X,Y) 把图像坐标转化成 Z=0 平面的世界坐标,输出为世界坐标的 X,Y 7.pose_to_hom_mat3d( : : Pose : HomMat3D) 把 3D 位姿转化成齐次变换矩阵。 8.affine_trans_point_3d( : : HomMat3D, Px, Py, Pz : Qx, Qy, Qz) 进行两个坐标系之间的 3D 坐标的仿射变换。 / Qx \ / Px \ | Qy | = HomMat3D * | Py | | Qz | | Pz | \1/\1/ 9.project_3d_point( : : X, Y, Z, CameraParam : Row, Column) 把 3D 点映射到图像坐标系,返回图像坐标系中该点的行列坐标。

10.smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2) 返回包含一个区域的最小环绕矩形。 11.gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height,Interpolation : Measure Handle) 返回和矩形边垂直的边缘。 12.measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select :RowEdgeFirst, ColumnEdge First, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond,AmplitudeSecond, IntraDistance, InterDistance) 抽取和矩形边垂直的边缘对。返回各测量对之间的距离。 13.close_measure( : : MeasureHandle : ) 删除测量句柄。 14.gen_region_polygon_filled( : Region : Rows, Columns : ) 创建多边形填充区域,输出为一个区域。 15.gen_region_polygon_filled( : Region : Rows, Columns : ) 提取直线极其宽度,输出为 XLD 形式数组。 16.hom_mat3d_compose( : : HomMat3DLeft, HomMat3DRight : HomMat3DCompose) 输出两个齐次矩阵的乘积。 17.hom_mat3d_translate_local( : : HomMat3D, Tx, Ty, Tz : HomMat3DTranslate) 相对于新坐标系统,增加一个平移量到齐次矩阵 HomMat3D 中,输出为新的齐次矩阵。 18.hom_mat3d_rotate_local( : : HomMat3D, Phi, Axis : HomMat3DRotate) 相对于新坐标系统, 增加一个绕着某个坐标轴的旋量到齐次矩阵 HomMat3D 中, 输出为新的齐次矩阵。 17.contour_to_world_plane_xld(Contours : ContoursTrans : CameraParam, WorldPose,Scale : ) 转换 XLD 轮廓进入 Z=0 的世界坐标平面,输出形式为 xld_cont(-array) → object 18.get_contour_xld(Contour : : : Row, Col) 返回轮廓点的行列坐标。 19.tuple_mean( : : Tuple : Mean) 返回数组的平均值 20.map_image(Image, Map : ImageMapped : : ) 对图像进行校正,输出为校正后的图像。 附:摄像机校正和利用校正后的结果进行测量以及图像校正的程序段 * Attention: * This program reads the interior camera parameters from the file * 'camera_parameters.dat', which, e.g., could be generated by the program * 'camera_calibration_interior.hdev' ImgPath := '3d_machine_vision/calib/' dev_close_window () dev_open_window (0, 0, 652, 494, 'black', WindowHandle) dev_update_off () dev_set_draw ('margin') dev_set_line_width (1) set_display_font (WindowHandle, 14, 'courier', 'true', 'false') * Read the interior camera parameters from file read_cam_par ('camera_parameters.dat', CamParam) * Determine the exterior camera parameters and world coodinates from image points * The exterior camera parameters can be determined from an image, where the

* calibration plate is positioned directly on the measurement plane read_image (Image, ImgPath+'calib_11') dev_display (Image) * parameter settings for find_caltab and find_marks_and_pose SizeGauss := 3 MarkThresh := 200 MinDiamMarks := 10 StartThresh := 128 DeltaThresh := 10 MinThresh := 18 Alpha := 0.9 MinContLength := 15 MaxDiamMarks := 100 CaltabName := 'caltab_30mm.descr' find_caltab (Image, Caltab, CaltabName, SizeGauss, MarkThresh, MinDiamMarks) dev_set_color ('green') dev_display (Caltab) * Here, the final camera parameters are already known and can be used instead of the starting values * used in the program 'camera_calibration_interior.hdev' find_marks_and_pose (Image, Caltab, CaltabName, CamParam, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoord, CCoord, PoseForCalibrationPlate) dev_set_color ('red') disp_caltab (WindowHandle, CaltabName, CamParam, PoseForCalibrationPlate, 1) dev_set_line_width (3) disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5)) * caltab_points (CaltabName, X, Y, Z) * camera_calibration (X, Y, Z, RCoord, CCoord, CamParam, InitialPoseForCalibrationPlate, 'pose', CamParamUnchanged, FinalPoseFromCalibrationPlate, Errors) * To take the thickness of the calibration plate into account, the z-value * of the origin given by the camera pose has to be translated by the * thickness of the calibration plate. * Deactivate the following line if you do not want to add the correction. set_origin_pose (PoseForCalibrationPlate, 0, 0, 0.00075, PoseForCalibrationPlate) disp_continue_message (WindowHandle, 'black', 'true') stop () * Alternatively, the exterior camera parameters can be determined from * at least three point correspondances between the WCS and the pixel coordinate system read_image (Image, ImgPath+'caliper_01') dev_display (Image) * Set the world coordinates of three points on the rule X := [0,50,100,80] Y := [5,0,5,0] Z := [0,0,0,0] * Set the respective image plane coordinates of the three points

RCoord := [414,227,85,128] CCoord := [119,318,550,448] disp_cross (WindowHandle, RCoord, CCoord, 6, 0) * create_pose (-50, 25, 400, 0, 0, -30, 'Rp+T', 'gba', 'point', InitialPose) vector_to_pose (X, Y, Z, RCoord, CCoord, CamParam, 'iterative', 'error', FinalPose, Errors) * camera_calibration (X, Y, Z, RCoord, CCoord, CamParam, InitialPose, 'pose', CamParamUnchanged, FinalPose, Errors) write_pose (FinalPose, 'pose_from_three_points.dat') * Now, transform a point measured interactively into the WCS dev_update_window ('on') dev_display (Image) while (1) disp_message (WindowHandle, 'Measure one point: left mouse button', 'window', 12, 12, 'red', 'false') disp_message (WindowHandle, 'Exit measure mode: right mouse button', 'window', 36, 12, 'red', 'false') get_mbutton (WindowHandle, Row, Column, Button) if (Button = 4) break endif dev_display (Image) dev_set_color ('green') disp_cross (WindowHandle, Row, Column, 6, 0) image_points_to_world_plane (CamParam, FinalPose, Row, Column, 1, X1, Y1) disp_message (WindowHandle, 'X = '+X1, 'window', 320, 400, 'red', 'false') disp_message (WindowHandle, 'Y = '+Y1, 'window', 340, 400, 'red', 'false') endwhile * Apply the measure tool and transform the resulting point coordinates * into the WCS dev_set_color ('red') dev_display (Image) * Set the world coordinates of four points defining a ROI for the measure tool ROI_X_WCS := [-2,-2,112,112] ROI_Y_WCS := [0,0.5,0.5,0] ROI_Z_WCS := [0,0,0,0] * Determine the transformation matrix from the WCS into the CCS pose_to_hom_mat3d (FinalPose, CCS_HomMat_WCS) * Transform the point coordintes into the image coordinate system affine_trans_point_3d (CCS_HomMat_WCS, ROI_X_WCS, ROI_Y_WCS, ROI_Z_WCS, CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ) project_3d_point (CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ, CamParam, RectangleRow, RectangleCol) gen_region_polygon_filled (ROI, RectangleRow, RectangleCol) smallest_rectangle2 (ROI, RowCenterROI, ColCenterROI, PhiROI, Length1ROI, Length2ROI) * Create a measure gen_measure_rectangle2 (RowCenterROI, ColCenterROI, PhiROI, Length1ROI, Length2ROI, 652, 494,

'bilinear', MeasureHandle) measure_pairs (Image, MeasureHandle, 0.4, 5, 'all_strongest', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance) close_measure (MeasureHandle) dev_display (Image) disp_message (WindowHandle, 'Measuring the position of the pitch lines', 'window', 450, 25, 'red', 'false') dev_set_color ('green') RowPitchLine := (RowEdgeFirst+RowEdgeSecond)/2.0 ColPitchLine := (ColumnEdgeFirst+ColumnEdgeSecond)/2.0 disp_cross (WindowHandle, RowPitchLine, ColPitchLine, 6, 0) image_points_to_world_plane (CamParam, FinalPose, RowPitchLine, ColPitchLine, 1, X1, Y1) for i := 1 to |X1| by 1 set_tposition (WindowHandle, RowEdgeFirst[i-1]+5, ColumnEdgeFirst[i-1]-20) if (i=|X1|) set_tposition (WindowHandle, RowEdgeFirst[i-1], ColumnEdgeFirst[i-2]) endif write_string (WindowHandle, X1[i-1]$'.3f'+'mm') endfor disp_continue_message (WindowHandle, 'black', 'true') stop () dev_display (Image) * Apply a line extraction and transform the resulting xld contours * into the WCS * Set the world coordinates of four points defining a ROI ROI_X_WCS := [11,11,13,13] ROI_Y_WCS := [4,6,6,4] ROI_Z_WCS := [0,0,0,0] * Transform the point coordinates into the image coordinate system affine_trans_point_3d (CCS_HomMat_WCS, ROI_X_WCS, ROI_Y_WCS, ROI_Z_WCS, CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ) project_3d_point (CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ, CamParam, RectangleRow, RectangleCol) * Visualize the square in the original image disp_polygon (WindowHandle, [RectangleRow,RectangleRow[0]], [RectangleCol,RectangleCol[0]]) dev_display (Image) * create the ROI gen_region_polygon_filled (ROI, RectangleRow, RectangleCol) reduce_domain (Image, ROI, ImageReduced) * Extract the lines lines_gauss (ImageReduced, Lines, 1, 3, 8, 'dark', 'true', 'bar-shaped', 'true') * Adapt the pose of the measurement plane to the tilted plane of the vernier RelPose := [0,3.2,0,-14,0,0,0] pose_to_hom_mat3d (FinalPose, HomMat3D) pose_to_hom_mat3d (RelPose, HomMat3DRel)

hom_mat3d_compose (HomMat3D, HomMat3DRel, HomMat3DAdapted) * Alternatively, the adaption can be done using the operators * hom_mat3d_translate_local and hom_mat3d_rotate_local * as shown in the following to lines hom_mat3d_translate_local (HomMat3D, 0, 3.2, 0, HomMat3DTranslate) hom_mat3d_rotate_local (HomMat3DTranslate, rad(-14), 'x', HomMat3DAdapted) hom_mat3d_to_pose (HomMat3DAdapted, PoseAdapted) * Transform the xld contour to the WCS using the adapted pose contour_to_world_plane_xld (Lines, ContoursTrans, CamParam, PoseAdapted, 1) get_contour_xld (ContoursTrans, YOfContour, XOfContour) tuple_mean (XOfContour, MeterReading) dev_display (Lines) disp_message (WindowHandle, 'Meter reading: '+MeterReading$'.3f'+'mm', 'window', 400, 180, 'green', 'false') disp_continue_message (WindowHandle, 'black', 'true') stop () dev_close_inspect_ctrl (YOfContour) dev_close_inspect_ctrl (XOfContour) * Now, transform the whole image WidthMappedImage := 652 HeightMappedImage := 494 dev_display (Image) * First, determine the scale for the mapping * (here, the scale is determined such that in the * surroundings of the points P0 and P1, the image scale of the * mapped image is similar to the image scale of the original image) distance_pp (X[0], Y[0], X[1], Y[1], DistP0P1WCS) distance_pp (RCoord[0], CCoord[0], RCoord[1], CCoord[1], DistP0P1PCS) Scale := DistP0P1WCS/DistP0P1PCS * Then, determine the parameter settings for set_origin_pose such * that the point given via get_mbutton will be in the center of the * mapped image dev_display (Image) disp_message (WindowHandle, 'Define the center of the mapped image', 'window', 12, 12, 'red', 'false') get_mbutton (WindowHandle, CenterRow, CenterColumn, Button1) image_points_to_world_plane (CamParam, FinalPose, CenterRow, CenterColumn, 1, CenterX, CenterY) set_origin_pose (FinalPose, CenterX-Scale*WidthMappedImage/2.0, CenterY-Scale*HeightMappedImage/2.0, 0, PoseNewOrigin) gen_image_to_world_plane_map (Map, CamParam, PoseNewOrigin, 652, 494, WidthMappedImage, HeightMappedImage, Scale, 'bilinear') map_image (Image, Map, ImageMapped) dev_clear_window () dev_display (ImageMapped) * In case, only one image has to be mapped, the operator

* image_to_world_plane can be used instead of the operators * gen_image_to_world_plane_map together with map_image. image_to_world_plane (Image, ImageMapped, CamParam, HeightMappedImage, Scale, 'bilinear')

PoseNewOrigin,

WidthMappedImage,

Halcon 学习(二十二)摄像机标定(函数详解)
(2012-12-24 16:40:54)

基于 halcon 摄像机标定(函数详解)

作者:骑蚂蚁上高速

本文为作者骑蚂蚁上高速所写。如有问题,可以留言。希望大家多多指 点。
摄像机标定程序: 注意:E:/calibration_image :为标定图像文件路径 'E:/calibration_description/caltab_123mm.descr:为标定描述文件路径 *作者:骑蚂蚁上高速 *程序开始 list_files ('E:/calibration_image', 'files', ImageFiles) TmpCtrl_AllMarkRows := [] TmpCtrl_AllMarkColumns := [] TmpCtrl_StartPoses := [] TmpCtrl_ReferenceIndex := 0 StartParameters := [0.008,0,5.2e-006,5.2e-006,640,512,1280,1024] for Index := 0 to |ImageFiles|-1 by 1 read_image (Image, ImageFiles[Index]) find_caltab (Image, TmpObj_PlateRegion, 'E:/calibration_description/caltab_123mm.descr', 3, 112, 5) find_marks_and_pose (Image, TmpObj_PlateRegion, 'E:/calibration_description/caltab_123mm.descr', StartParameters, 128, 10, 18, 0.9, 15, 100, TmpCtrl_MarkRows, TmpCtrl_MarkColumns, TmpCtrl_EstimatedPose) TmpCtrl_AllMarkRows := [TmpCtrl_AllMarkRows, TmpCtrl_MarkRows] TmpCtrl_AllMarkColumns := [TmpCtrl_AllMarkColumns, TmpCtrl_MarkColumns] TmpCtrl_StartPoses := [TmpCtrl_StartPoses, TmpCtrl_EstimatedPose] endfor caltab_points ('E:/calibration_description/caltab_123mm.descr', TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z) camera_calibration (TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z, TmpCtrl_AllMarkRows, TmpCtrl_AllMarkColumns, StartParameters, TmpCtrl_StartPoses, 'all', CameraParameters, TmpCtrl_FinalPoses, TmpCtrl_Errors) tuple_select_range (TmpCtrl_FinalPoses, 7*TmpCtrl_ReferenceIndex, 7*TmpCtrl_ReferenceIndex + 6, CameraPose) set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose) stop () 一、读入图像,函数如下 list_files ('E:/calibration_image', 'files', ImageFiles) for Index := 0 to |ImageFiles|-1 by 1

read_image(Image, ImageFiles[Index]) endfor 注释:'E:/calibration_image':为图像路径,图像文件索引是从 0 开始的,所以|ImageFiles|(文件数量) 减去 1。 算子:read_image(:Image :FileName):读取名称为 FileName 的图像 Image。 二、提取图像 Images 中标定板上的圆形标志来确定标定板的有效区域,算子如下: find_caltab(Image:Caltab:CalTabDescrFile,SizeGauss,MarkThresh,MinDiamMarks:) 确定标定板上圆形标志点的二维坐标,并得到摄像机外部参数的初始值,算子如下: find_marks_and_pose ( Image , CalTabRegion: :CalTabDescrFile , StartCamParam , StartThresh , DeltaThresh , MinThresh , Alpha , MinContLength , MaxDiamMarks:Rcoord,Ccoord, StartPose) 注释:函数 find_caltab 在图像中寻找标定板是基于标定板的特征——在一个亮的区域中存在黑色标定 点。首先使用高斯滤波器进行图像平滑。参数 SizeGauss 确定高斯滤波器的尺寸。SizeGauss 值越大进 行图像平滑的幅度就越大,这在图像噪声比较大时是必要的。在进行图像平滑操作后,为了寻找标定 板的位置,我们进行一个阈值分割,可以参考灰度直方图,灰度值范围由最小值 MarkThresh 到最大值 255,因此,MarkThresh 必须小于标定板上白色区域的灰度值,并且最好大于图像中其他大范围较亮 的区域的灰度值。在阈值分割得到的多个区域中,其中包含孔的数量最符合标定板上标定点数量的凸 状区域被选中。为了减少噪声影响,直径小于 MinDiamMarks 的孔将被除去。标志点的数量可以从标 定板描述文件(CalTabDescrFile)中读出。 函数 find_marks_and_pose 提取标定板上各个标志点,并精确得到它们在图像坐标系中的坐标。上面 我们已经通过函数 find_caltab 找到了标定板的区域 , 这时我们首先在输入图像 Image 的这个区域 (CalTabRegion)中应用边缘检测。这个边缘检测通过参数 Alpha 进行控制。Alpha 的值越大 ,边缘检测 的灵敏度也就越高,这将使边缘检测时找到更多的细节,但同时对噪声的抑制能力下降。在边缘图像中, 提取出封闭的轮廓线。 为了更准确的寻找轮廓线,对边缘的振幅进行一个阀值操作。 所有振幅高的点(标 定点的边界)都被选中。首先,这个阀值设置为 StartTh resh 。如果寻找封闭轮廓线或估计位姿失败 ,这个阀值接连地减 DeltaThresh 直到阀值降低到最小值 MinThresh。 闭合的轮廓线的数量必须与标定板描述文件 (CalTabDescrFile)中描述的标志点的数量一致 ,并且这 些闭合轮廓线的形状必须是椭圆状的。长度比 MinContLength 短的轮廓线或者轮廓线形成区域的直径 大 MaxDiamMarks(如标定板的外框)的,这些轮廓线将被忽略抛弃。 三、保存坐标值 TmpCtrl_AllMarkRows := [] TmpCtrl_AllMarkColumns := [] TmpCtrl_StartPoses := [] TmpCtrl_AllMarkRows := [TmpCtrl_AllMarkRows, TmpCtrl_MarkRows] TmpCtrl_AllMarkColumns := [TmpCtrl_AllMarkColumns, TmpCtrl_MarkColumns] TmpCtrl_StartPoses := [TmpCtrl_StartPoses, TmpCtrl_EstimatedPose] 注释:标定点的在图像坐标系中的坐标存储 在两个数组中,第一个数组存储所有点的行 坐标,第二个数组存储所有点的列坐标,并 且要保证两个数组的值一一对应。这些数组 的长度取决于标定板上标定点的个数以及 拍摄的标定图像的数量。它们的存储顺序是 按照图像顺序排列的,也就是说刚开始的 m

个值存储的是第一幅图像中 m 个标定点的 坐标值,这个顺序和函数 caltab_points 返回 的数组 X,Y,Z 中的存储顺序是一致的。 四、摄像机标定输入参数 StartParameters := [0.008,0,5.2e-006,5.2e-006,640,512,1280,1024] 初始值摄像机标定是一个非常复杂的非线性优化的问题,因此就需要为摄像机的参数提供尽量精确 的初始值。 摄像机内部参数的初始值主要由 CCD 传感器和镜头的说明书确定。 面阵摄像机的内参初始 值可以输入一个 数 组 [f,k,Sx,Sy,Cx,Cy,NumColumns,NumRows]也就是说 ,不仅要提供摄像机的初始内参,还要提供图 像的宽(NumColumns)和高(NumRows)。 五、确定摄像机的内参,误差分析,算子如下 camera_calibration ( : :NX , NY , NZ , Nrow , Ncol , StartCamParam, NstartPose, EstimateParams:CamParam, NfinalPose,Errors) 函数如下: caltab_points ('E:/calibration_description/caltab_123mm.descr', TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z) camera_calibration (TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z, TmpCtrl_AllMarkRows, TmpCtrl_AllMarkColumns, StartParameters, TmpCtrl_StartPoses, 'all', CameraParameters, TmpCtrl_FinalPoses, TmpCtrl_Errors)

在给定了摄像机的内外参数的初始值之后 ,已知三维位置的标定点可以转换到摄像机 坐标系中。然后,寻求一组摄像机的参数可以使通过计算投影到图像上的标定点坐标和直 接从图像中提取出的标定点的坐标的距离最小。 这个最小化的过程将返回相当精确的摄像 机参数。 然而,为了获得最高精度的摄像机参数,需要拍摄标定板的多幅图像,在拍摄时,标定 板被放置在图像的不同位置并且旋转的角度也不同,以致于使用外部方位的所有自由度。 如果拍摄一幅包含标定板的图像,最优化的参数包括摄像机的内参和一组外参。此时,最优 化的目标是确定所有这些参数能够满足每幅图中通过投影计算得到的点坐标和图像中直 接提取的坐标值距离最小。在 HALCON 中 ,使用 camera_calibration 函数就是实现这个 功能。
六、选择某幅图像作为参考位姿,确定摄像机外参 TmpCtrl_ReferenceIndex := 0 注释:TmpCtrl_ReferenceIndex:为将要设置为参考位姿势的图像。0 代表第一张。1 代表第二张。以 此类推。 tuple_select_range (TmpCtrl_FinalPoses, 7*TmpCtrl_ReferenceIndex, 7*TmpCtrl_ReferenceIndex + 6, CameraPose) set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose) 注释:tuple_select_range:进行数组选择。 set_origin_pose :计算摄像机外部参数。 参考文献:“基于 halcon 软件的摄像机标定” 闫霞,牛建强 (河南科技大学电子信息工程学院)

Halcon 学习(二十三)标定助手
(2012-12-24 16:41:03)本文采用

halcon 标定助手进行标定。

作者:骑蚂蚁上高速

第一步:打开标定助手。

第二步:对描述文件进行修改 具体:打开算子窗口,输入 gen_caltab,进行描述文件修改。 参数 XNum 和 YNum 为 7 行*7 列的圆,Markdist 为圆的直径,单位为米。DiameterRatio 为圆的直径 与两个相邻的圆之间的距离比。修改完之后,应用,输入。存放在一个文件下。之后将描述文件改成 此描述文件。描述文件最右面靠近边框有个文件夹形状的图标。点击即可。 第三步: 根据单个的像元 宽和高进行修改, 该参数 可在相机的自带文件中 或官方数据中查到。 这个 值将影响焦距。 第四步:标定,图像采集 助手。 输入要标定的图像 文件或实时采集。 提示: 图像采集助手右面 有个方形小图标。 点击即 可。 注意: 可以修改参考位姿。 本文采用的第一张图片 作为参考坐标系。 第五步: 点击标定。 即可。 总结: 标定板与采集的图 片质量对标定精度影响 很大。 采集到的图片不宜 过少,光线不宜过量。角 度和旋转度要满足图像

检测质量要求。

Halcon 学习(二十四)总结(一)
(2013-01-21 10:00:31) 好久没有写篇文章了。写一篇总结吧。 1、Halcon 的自我描述 Program Logic ? Each program consists of a sequence of HALCON operators ? The program can be structured into procedures ? The sequence can be extended by using control operators like if, for, repeat, or while ? The results of the operators are passed via variables ? No implicit data passing is applied ? Input parameters of operators can be variables or expressions ? Output parameters are always variables ? HDevelop has no features to design a graphical user interface ? An HDevelop program is considered as a prototypic solution of the vision part of an application ? HDevelop is typically not used for the final application 由此可以看出,Halcon 的定位是一个类库,有着完整、快速实现函数,同时提供了 HDevelop 作为快速 开发的图形化(IDE)界面;但是,Halcon 程序并不是一个完整的最终应用软件,它没有用户界面,也 不提供显示的数据(公用的数据格式) 。 Halcon 的初学者也应当从参考 Halcon 的程序入手, 熟悉 Halcon 类库, 也即 HDevelop-Based Programming; 在此基础上,进入 ORClass-Oriented Programming。这也是 Halcon 推荐的开发方式: The vision part is solved with HDevelop,and the application is developed with C++ or Visual Basic。 2、HDevelop 界面的学习 通过阅读 Halcon 的 PPT,学到了下面一些有用的信息: ? 文件——浏览示例,可以看到很多有用的例子; ? 程序窗体中,可以浏览与编辑 Procedues(过程) ,这个其实就是自定义函数咯~还可以自己修改这 些过程,并添加说明文档; ? F4——将函数语句注释掉;F3——激活; ? 本地过程(Local Procedue)与外部过程(Externel Procedue) 3、基本语法结构 Halcon 的语法结构 类似于 Pascal 与 Visual Basic, 大部分的语句是 Halcon 提供的算子, 此外也包含了少部分的控制语句; 不允许单独声明变量; 提供自动的内存管理(初始化、析构及 OverWrite) ,但句柄则需要显示释放; C++(算子模式) 通过代码导出,以 C++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下,全部函 数声明为全局类型,数据类型只需要用 Hobject、HTuple 两类类型进行声明; C++(面向对象) 可以以面向对象的方式重写代码,也即利用类及类的成员函数; 在这种模式下,控制变量的类型仍未 HTuple,而图形数据可以由多种类型,如 HImage 等; 其他语言(略) 4、Halcon 数据结构

两类参数: 图形参数 Iconic (image, region, XLD)与控制参数 Control (string, integer, real, handle), 在 Halcon 算子的参数中,依次为:输入图形参数、输出图形参数、输入控制参数、输出控制参数;并且其输入 参数不会被算子改变。 图形参数 Iconic: Images ? Multiple channels ? Arbitrary region of interest ? Multiple pixel types(byte, (u)int1/2/4,real, complex, direction, cyclic, vector_field) byte, uint2 //灰度图像的标准编码 int1, int2 //Difference of two images or derivates with integer precision(??)int4 //两幅灰度图的频谱 direction //图片边缘的梯度方向 real //边缘提取及特定灰度值的轮廓 complex //图片频率分布 cyclic //Assigning one "gray" value to each color(??) vector_field //连续图形的光学流分布 Regions ? Efficient data structure (runlength encoding) ? Extensive set of operators ? Fastest morphology on the market 图形编码中,需要了解 row 和 run 两个术语;也是 Halcon Region 存储的方式 Extended Line Description (XLD) ? Subpixel accurate line and edge detection ? Generic point list based data structure ? Handling of contours, polygons, lines, parallels, etc. 此外,Halcon 支持的类型还包括图形元组、控制变量元组及句柄: 元组的概念,使得可以用一个变量传递数个对象,可以由重载后的函数来进行处理;图形元组的下标 从 1 开始,控制变量元组下标从 0 开始;句柄则可以用来描述窗体、文件等等,句柄不能是常量。 5、Halcon 语言 输入控制参数可以是表达式,但图形参数、输出参数均应为变量; String 类型变量由单引号’括起来;此外还有一些特殊字符; Boolean 型变量包括 true ( = 1 )、 false ( = 0 ) ;不为零的整数将被认为 true;但绝大多数的 Halcon 函 数接受字符串型的表达:’true’‘false’,而非逻辑型表达; 函数返回常量用于标识错误: ? H_MSG_TRUE no error 2 ? H_MSG_FALSE logical false 3 ? H_MSG_FAIL operator did not succeed 5 可以放在 try…catch…endtry 块中,也可以用 dev_error_var()与 dev_set_check() 来捕获; 控制语句结构: (与一般语言略有不同,它们也有输入输出变量) ? if ... endif / if ... else ... endif / if ... elseif ... else ... endif ? for ... endfor ? while ... endwhile ? repeat ... until 此外,也有关键字 break、continue、return、exit、stop 用来控制语句的执行; 赋值语句在 Halcon 中也被当作函数来使用:

标准赋值 ? assign(Expression, ResultVariable) //编辑形式,永远都是输入在前,输出在后 ? ResultVariable := Expression //代码形式 元组插入赋值 ? insert(Tuple, NewValue, Index, Tuple) //编辑形式 ? Tuple[Index] := NewValue //代码形式 控制变量元组操作 ? [t,t] concatenation of tuples ? |t| number of elements ? t[i] selection of an element ? t[i:j] selection of a part of a tuple ? subset(t1,t2) selection from t1 by indices in t2 图形元组操作对应函数 ? [] gen_empty_obj () ? |t| count_obj (p, num) ? [t1,t2] concat_obj (p1, p2, q) ? t[i] select_obj (p, q, i+1) ? t[i:j] copy_obj (p, q, i+1, j-i+1) ? subset(t1,t2) select_obj (p, q, t2+1) 元组的数学运算,如:A * B,令 m = |A|, n = |B|; 若 m、n 不相等,且都大于 1,则错误;否则返回三种情况: ? m=n=1,返回一个值; ? m=n>1,返回一个包含 m 个数的元组,值为两元组各对于值的操作结果; ? m>1,n=1,返回一个包含 m 个数的元组,值为第二个数与第一元组各值的操作结果; Halcon 的数学运算 算术运算 ? a / a division ? a % a rest of the integer division ? a * a multiplication ? v + v addition and concatenation of strings ? a - a subtraction ? -a negation 位运算 ? lsh(i,i) left shift ? rsh(i,i) right shift ? i band i bit-wise and ? i bor i bit-wise or ? i bxor i bit-wise xor ? bnot i bit-wise complement 字符串操作 ? v$s conversion to string //字符串的格式化,有很丰富的参数 ? v + v concatenation of strings and addition ? strchr(s,s) search character in string ? strstr(s,s) search substring

? ? ? ? ? ?

strrchr(s,s) search character in string (reverse) strrstr(s,s) search substring (reverse) strlen(s) length of string s{i} selection of one character s{i:i} selection of substring split(s,s) splitting to substrings

比较操作符 ? t < t less than ? t > t greater than ? t <= t less or equal ? t >= t greater or equal ? t = t equal ? t # t not equal 逻辑操作符 ? not l negation ? l and l logical ’and’ ? l or l logical ’or’ ? l xor l logical ’xor’ 数学函数 ? sin(a) sine of a ? cos(a) cosine of a ? tan(a) tangent of a ? asin(a) arc sine of a in the interval [-p/2, p/ 2], a ?[-1, 1] ? acos(a) arc cosine a in the interval [-p/2, p/2], a ?[-1, 1] ? atan(a) arc tangent a in the interval [-p/2, p/2], a ?[-1, 1] ? atan2(a,b) arc tangent a/b in the interval [-p, p] ? sinh(a) hyperbolic sine of a ? cosh(a) hyperbolic cosine of a ? tanh(a) hyperbolic tangent of a ? exp(a) exponential function ? log(a) natural logarithm, a> 0 ? log10(a) decade logarithm, a> 0 ? pow(a1,a2) power ? ldexp(a1,a2) a1 pow(2,a2) 其他操作(统计、随机数、符号函数等) ? min(t) minimum value of the tuple ? max(t) maximum value of the tuple ? min2(t1,t2) element-wise minimum of two tuples ? max2(t1,t2) element-wise maximum of two tuples ? find(t1,t2) indices of all occurrences of t1 within t2 ? rand(i) create random values from 0..1 (number specified by i) ? sgn(a) element-wise sign of a tuple ? sum(t) sum of all elements or string concatenation ? cumul(t) cumulative histogram of a tuple

? mean(a) mean value ? deviation(a) standard deviation ? sqrt(a) square root of a ? deg(a) convert radians to degrees ? rad(a) convert degrees to radians ? real(a) convert integer to real ? int(a) convert a real to integer ? round(a) convert real to integer ? number(v) convert string to a number ? is_number(v) test if value is a number ? abs(a) absolute value of a (integer or real) ? fabs(a) absolute value of a (always real) ? ceil(a) smallest integer value not smaller than a ? floor(a) largest integer value not greater than a ? fmod(a1,a2) fractional part of a1/a2, with the same sign as a1 ? sort(t) sorting in increasing order ? uniq(t) eliminate duplicates of neighboring values(typically used in combination with sort) ? sort_index(t) return index instead of values ? median(t) Median value of a tuple (numbers) ? select_rank(t,v) Select the element (number) with the given rank ? inverse(t) reverse the order of the values ? subset(t1,t2) selection from t1 by indices in t2 ? remove(t1,t2) Remove of values with the given indices ? environment(s) value of an environment variable ? ord(a) ASCII number of a character ? chr(a) convert an ASCII number to a character ? ords(s) ASCII number of a tuple of strings ? chrt(i) convert a tuple of integers into a string 6、Halcon 名称解释 ? Operator: A procedure of the HALCON library used in HDevelop or one of the language interfaces. ? Procedure (of HDevelop): A subroutine defined for the use inside HDevelop. ? Region: Result of a segmentation like threshold. In other systems called blob, area, binary image, or island. Implemented using runlength encoding. ? XLD: Extended Line Description. Universal data structure used to handle contour based data. Mainly used in the context of subpixel precise measurement. ? Domain: Part of the image which is used for processing. In other systems called ROI (region of interest). ? Channel: One image matrix of a multi-spectral image. One example is the red channel of an RGB image. ? Iconic data: Overall term for images, regions, and XLD data. In object oriented languages (C++ and COM) and in HDevelop iconic data is represented by a polymorphic data type. In object oriented languages iconic data is also called iconic object. ? Control data: All non iconic data. Examples are single values (integer, real, and string), coordinates, arrays of values. ? Tuple: an array of values where each element can be of a different type. One can have both iconic and control tuples.

? HALCON object: Synonym for Iconic object / data ? Image acquisition interface: Interface between the frame grabber /camera driver (SDK) and the HALCON library. The Image acquisition interface is a DLL which is dynamically loaded when calling open_framegrabber. ? Language interface: Software that enables the programmer to use the HALCON library in a given language (e.g., C++). ? Extension Package: A mechanism that enables the user to fully integrate user-defined procedures into the HALCON environment. The extension package concept gives full access to the internal data structures of HALCON. ? License file: File “license.dat“ in the directory “license“. This file is used together with hardware components (dongle or Ethernet card) to check if a correct license is available. ? Help files: Files in the directory “help“ which are used to get online information about all HALCON operators. This is extensively used by HDevelop. ? Shape-Based Matching: Finding of an object in an image based on a predefined model. The shape based matching uses features to quickly locate objects very precisely. ? Variation Model: A method to do print checking by presenting multiple good patterns to the system. The variation model learns the normal variation a good pattern and based on this information can detect real defects. ? Measure Tool: A set of operators to find the exact location of edges along lines or circular arcs. Other systems call the similar tool, e.g., caliper. ? Accuracy: The deviation from the true value ? Precision: The standard deviation of the measurement 7、Halcon 函数 典型函数 ? Filtering (noise, smoothing, edge, bit, arithmetic, enhancement) ? Segmentation (thresholding, topology, region growing, classification, comparison) ? Region processing ? Morphology ? Feature extraction ? Edge detection ? Color processing and classification ? OCR / OCV ? Bar code / data code ? Measurement ? Rectification ? Gray value matching 8、Halcon HDevEngine HDevEngine 允许用户在应用程序中直接调用 Halcon 程序(*.hdvp) ,适用范围包括 C++、COM、.NET 语言。具体功能为: ? 载入并执行 Halcon 程序(HDevelop programs) ? 载入、删除、执行 HDevelop 过程(HDevelop procedures) ? 查询以载入的 HDevelop 过程的接口 ? 将正确的参数值传递给 HDevelop 过程,执行并获得结果 ? 重新实现了 HDevelop 的某些内部算子(operator) ,例如 dev_display

? HDevEngine 错误处理 在 C++中,使用 HDevEngine 需要包括头文件#include "HDevEngineCpp.h",并包含附加的可执行文件 hdevenginecpp.lib,具体见示例。 利用 HDevEngine,可以很方便得实现多线程。 9、Halcon 数据结构(2) Halcon 中,Image = Channel + Domain , 像素点存放在 Channel 矩阵中,根据 ROI 来描述 Image。 Image 相关操作: ? 输入:从文件、从设备 ? 生成:外部图像数据、空内存区域; ? 显示: disp_image()图像首通道灰度图; disp_color() 彩色图; disp_channel()某特定通道; disp_obj() 自 动判别类别; ? 缩放:set_part() 设置显示区域;set_part_style() 设置显示参数; ? 3D 显示: (略) Rules to Display Gray Images 没特别懂 边界点的处理:镜像、常数、延续、周期(略) : 域的局限性:一些算子总是要处理周围的矩形区域,比如 mean_image(),并且总是先处理小的区域; 测量工具中的 ROIs 比较特殊,这种 ROIs 并不依附于 Image 上,而是在算子 gen_measure_*()后产生, 并且也只能是任意朝向的矩形、圆弧形区域; 处理多通道图像: ? 分割:Gray operators 仅适用第一通道,Color operators: 使用前三个通道,Multi channel operator 会 使用全部通道; //对“Gray operators 仅适用第一通道”的解释:实际上,灰度图,就是用第一通道(Red)像素点值 所构建出来的那幅图。 ? 过滤:所有通道被处理时均使用相同的参数,并且结果的通道数与处理的图片相同; ? 可以将域的处理结果,与原图像结合在一起作为输入图像; ? 通 道 处 理 : count_channels(),decompose*(), compose*(), access_channel(), append_channel(), channels_to_image(), image_to_channels() 图像金字塔中,第一个图像为最大的图像,各图像有各自的区域 标准图形(Shape) :circle、ellipse、rectangle1、rectangle2、line、polygon 特殊区域图形:gen_grid_region(): grid、lines、points, gen_checker_region() 图像处理: ? 修改:set_grayval() : Modify one or more pixels of the input image;paint_gray(): Paint part of an image into another image; overpaint_gray(): Paint part of an image into the input image; paint_region(): Paint the region with a constant gray value into an image; overpaint_region() : Paint the region with a constant gray value into the input image ? 复制:crop_part(): Crop a rectangle, given by upper left corner and size; crop_rectangle1(): Crop a rectangle, given by upper left and lower right corner; crop_domain(): Crop area of the smallest rectangle1 of the domain; crop_domain_rel(): Like crop_domain but with the possibility to change the size of bounding box; change_format(): Limit the size of the image at the lower or the right part; get_grayval(): Access one or multiple pixel values ? Tile: tile_images(), tile_images_offset(), tile_channels() 10、Halcon 数据结构(3) 区域运算: ? 并:union1()、union2();

? 交:intersection(); ? 差:difference(); ? 补:complement(); 图形显示参数设置: ? 显示模式:set_draw(); 参数:margin、filled ? 线宽线形:set_line_width(); set_line_style(); ? 颜色:set_color(); set_colored(); set_rgb(); set_gray(); ? 显示图形:set_shape(); 参数:original、outer circle、inner circle、rectangle1、rectangle2、ellipse、 icon ? set_icon 11、Halcon 数据结构(4) 关于 XLD,简要写一下: 图像均用像素点保存,而像素点是整型的,不连续的;Halcon 做了拓展,定义了亚像素(subpixel)的 对象:xld;其实 xld 已经用过了,比如提取边缘、构建轮廓等等,xld 在模板匹配、图形校准等多方面 有重要的用途。 12、色彩 color 在视网膜底部,有三类感光细胞,它们分别探测不同频率的光,产生 RGB 神经冲动,并把这些神经冲 动传递下去;经过另外的细胞的处理,转换成 1 个亮度通道、两个色彩通道。 ? The RGB stimulus is converted to a luminance and 2 chrominance channels 所以,RGB 图是原始的感光图,而人眼的感觉,却不是 RGB 三通道的叠加;更直观地描述人的感觉, 需要用到其他的色彩空间,比如 hsv 空间。 不同频率的光,会产生不同的颜色;而光只有三种颜色,这是因为人眼只有三种光感受器。 所以有,任何光产生的颜色,都能够由这三种纯色来合成,这就是光的三元色。 对于相机来说,能够检测到的光谱范围比人眼要宽泛,比如红外相机等;为了获得人眼类似的图像, 可以加上过滤装置,滤去超出 400-700nm 范围的光线。 13、色彩空间及 Halcon 颜色处理 CCD 彩色相机有 R、G、B 三种感光芯片,捕捉不同颜色,然后转换为 RGB 三通道。 颜色空间: ? RGB Red、Green、Blue 三色通道,对光来说,犹如在黑暗中点亮各分色。 ? CMY Cyan、Magenta、Yellow 三颜色通道,犹如在白纸上图颜料 ? YUV、YIQ Y 描述亮度、其余两通道描述颜色(的差值) ,用于电视转播 ? ARgYb 与上类似,A 描述亮度,其余两者描述颜色差值 ? I1i2i3 与上类似,i1 描述亮度 ? HSI Hue、Saturation、Intensity 分别描述颜色、饱和度、亮度 ? HSV 与上类似,这里的 V 描述亮度,方法与上不同 ? HSL 与 HSI 类似,L 描述亮度,但 Hue 与之不同 ? HIS 与 HIS 类似 ? Uniform Color Space、CIE uv 用二维图描述色彩 ? CIE Lab 高级色彩空间,较少使用 颜色空间的转换,依靠 GPU 进行运算:trans_from_rgb(),速度快 Scale_image() 可以对单通道(RGB、或 HSV 中的)进行重新渲染; 颜色的选取,通过对 Hue 通道进行 threshold() 2D Histogram 可用来描述两通道(RGB、HSV 等中的)相应值对应关系,可用来选取颜色相近区域: histo_2dim()

N 维像素分类:learn_ndim_norm()、learn_ndim_box() LUT:MLP、SVM、GMM 彩色过滤器:用于彩色图像的分割等:edges_color()、edges_color_sub_pix()、lines_color() 14、Halcon 窗体 Halcon 窗体的坐标系统:(Row, Column) (Width, Height) 图形:可以显示灰度图、彩色图、3D;定义要显示的区域,插值 区域:绘图模式(Fill、Margin),边界、线宽,定义色彩模式,自动图形转换 绘图:点、线、xld 等

一.halcon 单摄像机标定
(2012-04-19 10:45:56)

说明: In the reference manual,operator signatures are visualized in the following way: operator ( iconic input : iconic output : control input : control output ) 在 HALCON 所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控制输出,其 中四个参数任意一个可以为空。控制输入量可以是变量、常量、表达式,控制输出以及图像输入和输 入必须是变量,以存入算子计算结果中。 1.caltab_points:从标定板中读取 marks 中心坐标,该坐标值是标定板坐标系统里的坐标值,该坐标系 统以标定板为参照,向右为 X 正,下为 Y 正,垂直标定板向下为 Z 正。该算子控制输出为标定板中心 3D 坐标。 2.create_calib_data:创建 Halcon 标定数据模型。输出一个输出数据模型句柄。 3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和类型。设置 索引,类型,以及相机的原始内参数等。 4.set_calib_data_calib_object:在标定模型中设定标定对象。设定标定对象句柄索引,标定板坐标点 储存地址。 5.find_caltab:分割出图像中的标准标定板区域。输出为标准的标定区域,控制 6.find_marks_and_pose:抽取标定点并计算相机的内参数。输出 MARKS 坐标数组,以及估算的 相机外参数。 即标定板在相机坐标系中的位姿,由 3 个平移量和 3 个旋转量构成。 7.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx, CalibObjPoseIdx, Row, Column, Index, Pose : ) 收集算子 6 的标定数据,将标定数据储存在标定数据模型中。输入控制分别为标定数据模型句柄,相 机索引,标定板索引,位姿索引,行列坐标,位姿。 8.calibrate_cameras( : : CalibDataID : Error) 标定一台或多台相机, 依据 CalibDataID 中的数据。控制输出平均误差。 9.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue) 获 得标定数据。 依靠索引号和数据名称来返回输出的数据值。可查询与模型相关的数据,与相机相关的数据(包括相 机的内外参数等) ,与标定对象相关的数据,与标定对象的姿态相关的数据。控制输出是要查询的标定 数据。 如:get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) //查询相机的位姿 get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) //查询标定板位姿 10.write_cam_par( : : CameraParam, CamParFile : ) 记录相机的内参数,输入控制为内

参数,输出控制为 存取相机内参数的文件名。 11.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin) 设置新的坐标原点,控制输入为原始的位姿和沿着世界坐标系的三个坐标轴的平移量,控制输出为新 的位姿。

二.halcon 基本语句---HDevelop language
(2012-04-19 19:22:14)

1.Assign 算子:assign(Input, Result),对变量以及表达式或数组赋值 assign(sin(x) + cos(y), u) which is displayed in the program window as: 程序窗等价为 u := sin(x) + cos(y) Tuple1 := [1,0,3,4,5,6,7,8,9] // 对数组进行初始化 Val := sin(1.2) + cos(1.2) // 对某一个值进行赋值 Tuple2 := [] // 数组定义 2.Insert : 对数组中的某一个值进行赋值。 Tuple1 := [1,0,3,4,5,6,7,8,9] Tuple1[3]:=2 显示结果为:[1, 0, 3, 2, 5, 6, 7, 8, 9],即对索引 3 后面元素,数组 Tuple1 中第 4 个元素赋值 2. example: read_image (Mreut, 'mreut') //读入图像 threshold (Mreut, Region, 190, 255) //阈值化,输出阈值在 190-255 的 Regions Areas := [] //定义数组 Areas for Radius := 1 to 50 by 1 //循环 dilation_circle (Region, RegionDilation, Radius) //利用半径为 Radius 的圆对 Region 进行膨胀运算,输出 RegionDilation,输出形式仍然为 Region。 area_center (RegionDilation, Area, Row, Column) //输出区域的面积和中心像素坐标 Areas[Radius-1] := Area //对数组 Areas 的第 Radius-1 个元素进行赋值 endfor 3.基本数组操作极其对应的算子 t := [t1,t2] t1,t2 连接成新的数组 对应算子:tuple_concat i := |t| 得到数组长度 tuple_length v := t[i] 选取第 i 个元素 0<= i < |t| tuple_select t := t[i1:i2] 选取 i1 到 i1 的元素 tuple_select_range t := subset(t,i) 选取数组 t 中的第 i 个元素 tuple_select t := remove(t,i) 去除数组 t 中的第 i 个元素 tuple_remove i := find(t1,t2) 找到 t2 数组在 t1 数组中出现位置索引 (or -1 if no match) tuple_find t := uniq(t) 在 t 数组中把连续相同的值只保留一个 tuple_uniq 4.创建数组 (1)gen_tuple_const 函数 tuple := gen_tuple_const(100,4711) //创建一个具有 100 个元素的,每个元素都为 4711 的数据 tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的数据

上面的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711 (2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值 例如:tuple := [] //创建空数组 for i := 1 to 100 by 1 //建立步长为 1 的循环 tuple := [tuple,i*i] //将 i 方的值赋给数组的第 i 个元素 endfor

三.HALCON 标定后的二维测量
(2012-04-20 14:20:00)

1.gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle) 产生测量矩形句柄,控制输入为测量矩形范围的坐标中心,矩形长轴和水平方向夹角范围的弧度,矩 形边长的一半,测量图片的宽和高度,输出为测量句柄。 2.measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance) 抽取和矩形主轴垂直的直线,返回第一类和第二类边缘点的行列坐标值,边缘分类由 Transition 的灰 度差分决定。控制输出还有,一个边缘对之间的距离;以及一类边缘对相继边缘之间的距离。 3.image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y) 把像素坐标转化到世界坐标系中的 Z=0 平面中的 X,Y 坐标。控制输入为,相机内参数,标定的世界 坐标位姿,测量单位,像素坐标,输出为 Z=0 平面的 X,Y 坐标。 4.distance_pp( : : Row1, Column1, Row2, Column2 : Distance) 利用两点距离公式计算两点之间的距离。 注意用法:distance_pp (X1[0:4], Y1[0:4], X1[1:5], Y1[1:5], Distance) 5.tuple_mean( : : Tuple : Mean) 返回数组的平均值。 6.tuple_deviation( : : Tuple : Deviation) 返回数组中所有元素的标准差。 对 应 的 HALCON 单 相 机 标 定 后 的 测 量 程 序 段 如 下 : (solution_guide/3d_vision/camera_calibration_multi_image.hdev 部分) : calibrate_cameras (CalibDataID, Errors) get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) NumImage := 11 get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) * To take the thickness of the calibration plate into account, the z-value * of the origin given by the camera pose has to be translated by the * thickness of the calibration plate. * Deactivate the following line if you do not want to add the correction. set_origin_pose (Pose, 0, 0, 0.00075, Pose) * measure the distance between the pitch lines gen_measure_rectangle2 (195, 226, -0.526627271434, 174, 3, 652, 494, 'bilinear', MeasureHandle) measure_pairs (Image, MeasureHandle, 0.5, 5, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

Row := (RowEdgeFirst+RowEdgeSecond)/2.0 Col := (ColumnEdgeFirst+ColumnEdgeSecond)/2.0 disp_cross (WindowHandle, Row, Col, 6, 0) image_points_to_world_plane (CamParam, Pose, Row, Col, 'mm', X1, Y1) distance_pp (X1[0:4], Y1[0:4], X1[1:5], Y1[1:5], Distance) tuple_mean (Distance, MeanDistance) tuple_deviation (Distance, DeviationDistance) disp_message (WindowHandle, 'Mean distance: '+MeanDistance$'.3f'+'mm '+DeviationDistance$'.3f'+'mm', 'window', 30, 150, 'yellow', 'false') close_measure (MeasureHandle) clear_calib_data (CalibDataID)

+/-

四.由标定板得到测量平面位姿
(2012-04-20 21:54:48)

如图:由标定板位姿获取测量板位姿 1.pose_to_hom_mat3d( : : Pose : HomMat3D) 把三维位姿转化为齐次变换矩阵 2.hom_mat3d_translate_local( : : HomMat3D, Tx, Ty, Tz : HomMat3DTranslate) 相对于新坐标系的平移变换 / 1 0 0 HomMat3DTranslate = HomMat3D * | 0 1 0 t | t = | Ty | | 0 0 1 | \ Tz / \ / Tx \

\ 0 0 0 1 / 返回值为 HomMat3DTranslate 矩阵。 3.hom_mat3d_rotate_local( : : HomMat3D, Phi, Axis : HomMat3DRotate) 相对于新坐标系的旋转变换,输出为原 HomMat3D 右乘旋转矩阵后的齐次变换矩阵。 4.hom_mat3d_to_pose( : : HomMat3D : Pose) 把齐次矩阵转化为 3D 位姿态。利用 0 类代码,即先平移顺序 RPT,旋转 gba,以点的形式表达位姿。

五.HALCON 摄像机标定
(2012-04-20 23:01:09) 1.read_cam_par( : : CamParFile : CameraParam) 从文件夹中读取相机的内参数。 2.disp_caltab( : : WindowHandle, CalTabDescrFile, CameraParam, CaltabPose, ScaleFac : ) 利用相机内外参数,把标定板模型投影到图像平面,显示标定点和连接线,X,Y 轴也被显示出来。 3.vector_to_pose( : : WorldX, WorldY, WorldZ, ImageRow, ImageColumn, CameraParam, Method, QualityType : Pose, Quality) 计算世界坐标和图像坐标之间关系的绝对位姿参数。其中世界坐标至少选择不在同一条直线上的三个 点。 世界坐标上的点如果在一个平面上,应该选择'planar_analytic' 作为 Method 的参数。输出位姿和位姿 质量。 4.write_pose( : : Pose, PoseFile : )

把位姿写入 TXT 文件。 5.get_mbutton( : : WindowHandle : Row, Column, Button) 返回鼠标点击的图像点像素坐标,以及鼠标按钮值,左键 0,中间键 2,右键 4. 6.image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y) 把图像坐标转化成 Z=0 平面的世界坐标,输出为世界坐标的 X,Y 7.pose_to_hom_mat3d( : : Pose : HomMat3D) 把 3D 位姿转化成齐次变换矩阵。 8.affine_trans_point_3d( : : HomMat3D, Px, Py, Pz : Qx, Qy, Qz) 进行两个坐标系之间的 3D 坐标的仿射变换。 / Qx \ / Px \ | Qy | = HomMat3D * | Py | | Qz | | Pz | \1/\1/ 9.project_3d_point( : : X, Y, Z, CameraParam : Row, Column) 把 3D 点映射到图像坐标系,返回图像坐标系中该点的行列坐标。 10.smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2) 返回包含一个区域的最小环绕矩形。 11.gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle) 返回和矩形边垂直的边缘。 12.measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance) 抽取和矩形边垂直的边缘对。返回各测量对之间的距离。 13.close_measure( : : MeasureHandle : ) 删除测量句柄。 14.gen_region_polygon_filled( : Region : Rows, Columns : ) 创建多边形填充区域,输出为一个区域。 15.gen_region_polygon_filled( : Region : Rows, Columns : ) 提取直线极其宽度,输出为 XLD 形式数组。 16.hom_mat3d_compose( : : HomMat3DLeft, HomMat3DRight : HomMat3DCompose) 输出两个齐次矩阵的乘积。 17.hom_mat3d_translate_local( : : HomMat3D, Tx, Ty, Tz : HomMat3DTranslate) 相对于新坐标系统,增加一个平移量到齐次矩阵 HomMat3D 中,输出为新的齐次矩阵。 18.hom_mat3d_rotate_local( : : HomMat3D, Phi, Axis : HomMat3DRotate) 相对于新坐标系统, 增加一个绕着某个坐标轴的旋量到齐次矩阵 HomMat3D 中, 输出为新的齐次矩阵。 17.contour_to_world_plane_xld(Contours : ContoursTrans : CameraParam, WorldPose, Scale : ) 转换 XLD 轮廓进入 Z=0 的世界坐标平面,输出形式为 xld_cont(-array) → object 18.get_contour_xld(Contour : : : Row, Col) 返回轮廓点的行列坐标。 19.tuple_mean( : : Tuple : Mean) 返回数组的平均值 20.map_image(Image, Map : ImageMapped : : ) 对图像进行校正,输出为校正后的图像。

附:摄像机校正和利用校正后的结果进行测量以及图像校正的程序段 * Attention: * This program reads the interior camera parameters from the file * 'camera_parameters.dat', which, e.g., could be generated by the program * 'camera_calibration_interior.hdev' ImgPath := '3d_machine_vision/calib/' dev_close_window () dev_open_window (0, 0, 652, 494, 'black', WindowHandle) dev_update_off () dev_set_draw ('margin') dev_set_line_width (1) set_display_font (WindowHandle, 14, 'courier', 'true', 'false') * Read the interior camera parameters from file read_cam_par ('camera_parameters.dat', CamParam) * Determine the exterior camera parameters and world coodinates from image points * The exterior camera parameters can be determined from an image, where the * calibration plate is positioned directly on the measurement plane read_image (Image, ImgPath+'calib_11') dev_display (Image) * parameter settings for find_caltab and find_marks_and_pose SizeGauss := 3 MarkThresh := 200 MinDiamMarks := 10 StartThresh := 128 DeltaThresh := 10 MinThresh := 18 Alpha := 0.9 MinContLength := 15 MaxDiamMarks := 100 CaltabName := 'caltab_30mm.descr' find_caltab (Image, Caltab, CaltabName, SizeGauss, MarkThresh, MinDiamMarks) dev_set_color ('green') dev_display (Caltab) * Here, the final camera parameters are already known and can be used instead of the starting values * used in the program 'camera_calibration_interior.hdev' find_marks_and_pose (Image, Caltab, CaltabName, CamParam, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoord, CCoord, PoseForCalibrationPlate) dev_set_color ('red') disp_caltab (WindowHandle, CaltabName, CamParam, PoseForCalibrationPlate, 1) dev_set_line_width (3) disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5)) * caltab_points (CaltabName, X, Y, Z) * camera_calibration (X, Y, Z, RCoord, CCoord, CamParam, InitialPoseForCalibrationPlate, 'pose', CamParamUnchanged, FinalPoseFromCalibrationPlate, Errors)

* To take the thickness of the calibration plate into account, the z-value * of the origin given by the camera pose has to be translated by the * thickness of the calibration plate. * Deactivate the following line if you do not want to add the correction. set_origin_pose (PoseForCalibrationPlate, 0, 0, 0.00075, PoseForCalibrationPlate) disp_continue_message (WindowHandle, 'black', 'true') stop () * Alternatively, the exterior camera parameters can be determined from * at least three point correspondances between the WCS and the pixel coordinate system read_image (Image, ImgPath+'caliper_01') dev_display (Image) * Set the world coordinates of three points on the rule X := [0,50,100,80] Y := [5,0,5,0] Z := [0,0,0,0] * Set the respective image plane coordinates of the three points RCoord := [414,227,85,128] CCoord := [119,318,550,448] disp_cross (WindowHandle, RCoord, CCoord, 6, 0) * create_pose (-50, 25, 400, 0, 0, -30, 'Rp+T', 'gba', 'point', InitialPose) vector_to_pose (X, Y, Z, RCoord, CCoord, CamParam, 'iterative', 'error', FinalPose, Errors) * camera_calibration (X, Y, Z, RCoord, CCoord, CamParam, InitialPose, 'pose', CamParamUnchanged, FinalPose, Errors) write_pose (FinalPose, 'pose_from_three_points.dat') * Now, transform a point measured interactively into the WCS dev_update_window ('on') dev_display (Image) while (1) disp_message (WindowHandle, 'Measure one point: left mouse button', 'window', 12, 12, 'red', 'false') disp_message (WindowHandle, 'Exit measure mode: right mouse button', 'window', 36, 12, 'red', 'false') get_mbutton (WindowHandle, Row, Column, Button) if (Button = 4) break endif dev_display (Image) dev_set_color ('green') disp_cross (WindowHandle, Row, Column, 6, 0) image_points_to_world_plane (CamParam, FinalPose, Row, Column, 1, X1, Y1) disp_message (WindowHandle, 'X = '+X1, 'window', 320, 400, 'red', 'false') disp_message (WindowHandle, 'Y = '+Y1, 'window', 340, 400, 'red', 'false') endwhile * Apply the measure tool and transform the resulting point coordinates * into the WCS dev_set_color ('red')

dev_display (Image) * Set the world coordinates of four points defining a ROI for the measure tool ROI_X_WCS := [-2,-2,112,112] ROI_Y_WCS := [0,0.5,0.5,0] ROI_Z_WCS := [0,0,0,0] * Determine the transformation matrix from the WCS into the CCS pose_to_hom_mat3d (FinalPose, CCS_HomMat_WCS) * Transform the point coordintes into the image coordinate system affine_trans_point_3d (CCS_HomMat_WCS, ROI_X_WCS, ROI_Y_WCS, ROI_Z_WCS, CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ) project_3d_point (CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ, CamParam, RectangleRow, RectangleCol) gen_region_polygon_filled (ROI, RectangleRow, RectangleCol) smallest_rectangle2 (ROI, RowCenterROI, ColCenterROI, PhiROI, Length1ROI, Length2ROI) * Create a measure gen_measure_rectangle2 (RowCenterROI, ColCenterROI, PhiROI, Length1ROI, Length2ROI, 652, 494, 'bilinear', MeasureHandle) measure_pairs (Image, MeasureHandle, 0.4, 5, 'all_strongest', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance) close_measure (MeasureHandle) dev_display (Image) disp_message (WindowHandle, 'Measuring the position of the pitch lines', 'window', 450, 25, 'red', 'false') dev_set_color ('green') RowPitchLine := (RowEdgeFirst+RowEdgeSecond)/2.0 ColPitchLine := (ColumnEdgeFirst+ColumnEdgeSecond)/2.0 disp_cross (WindowHandle, RowPitchLine, ColPitchLine, 6, 0) image_points_to_world_plane (CamParam, FinalPose, RowPitchLine, ColPitchLine, 1, X1, Y1) for i := 1 to |X1| by 1 set_tposition (WindowHandle, RowEdgeFirst[i-1]+5, ColumnEdgeFirst[i-1]-20) if (i=|X1|) set_tposition (WindowHandle, RowEdgeFirst[i-1], ColumnEdgeFirst[i-2]) endif write_string (WindowHandle, X1[i-1]$'.3f'+'mm') endfor disp_continue_message (WindowHandle, 'black', 'true') stop () dev_display (Image) * Apply a line extraction and transform the resulting xld contours * into the WCS * Set the world coordinates of four points defining a ROI ROI_X_WCS := [11,11,13,13] ROI_Y_WCS := [4,6,6,4] ROI_Z_WCS := [0,0,0,0] * Transform the point coordinates into the image coordinate system

affine_trans_point_3d (CCS_HomMat_WCS, ROI_X_WCS, ROI_Y_WCS, ROI_Z_WCS, CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ) project_3d_point (CCS_RectangleX, CCS_RectangleY, CCS_RectangleZ, CamParam, RectangleRow, RectangleCol) * Visualize the square in the original image disp_polygon (WindowHandle, [RectangleRow,RectangleRow[0]], [RectangleCol,RectangleCol[0]]) dev_display (Image) * create the ROI gen_region_polygon_filled (ROI, RectangleRow, RectangleCol) reduce_domain (Image, ROI, ImageReduced) * Extract the lines lines_gauss (ImageReduced, Lines, 1, 3, 8, 'dark', 'true', 'bar-shaped', 'true') * Adapt the pose of the measurement plane to the tilted plane of the vernier RelPose := [0,3.2,0,-14,0,0,0] pose_to_hom_mat3d (FinalPose, HomMat3D) pose_to_hom_mat3d (RelPose, HomMat3DRel) hom_mat3d_compose (HomMat3D, HomMat3DRel, HomMat3DAdapted) * Alternatively, the adaption can be done using the operators * hom_mat3d_translate_local and hom_mat3d_rotate_local * as shown in the following to lines hom_mat3d_translate_local (HomMat3D, 0, 3.2, 0, HomMat3DTranslate) hom_mat3d_rotate_local (HomMat3DTranslate, rad(-14), 'x', HomMat3DAdapted) hom_mat3d_to_pose (HomMat3DAdapted, PoseAdapted) * Transform the xld contour to the WCS using the adapted pose contour_to_world_plane_xld (Lines, ContoursTrans, CamParam, PoseAdapted, 1) get_contour_xld (ContoursTrans, YOfContour, XOfContour) tuple_mean (XOfContour, MeterReading) dev_display (Lines) disp_message (WindowHandle, 'Meter reading: '+MeterReading$'.3f'+'mm', 'window', 400, 180, 'green', 'false') disp_continue_message (WindowHandle, 'black', 'true') stop () dev_close_inspect_ctrl (YOfContour) dev_close_inspect_ctrl (XOfContour) * Now, transform the whole image WidthMappedImage := 652 HeightMappedImage := 494 dev_display (Image) * First, determine the scale for the mapping * (here, the scale is determined such that in the * surroundings of the points P0 and P1, the image scale of the * mapped image is similar to the image scale of the original image) distance_pp (X[0], Y[0], X[1], Y[1], DistP0P1WCS) distance_pp (RCoord[0], CCoord[0], RCoord[1], CCoord[1], DistP0P1PCS)

Scale := DistP0P1WCS/DistP0P1PCS * Then, determine the parameter settings for set_origin_pose such * that the point given via get_mbutton will be in the center of the * mapped image dev_display (Image) disp_message (WindowHandle, 'Define the center of the mapped image', 'window', 12, 12, 'red', 'false') get_mbutton (WindowHandle, CenterRow, CenterColumn, Button1) image_points_to_world_plane (CamParam, FinalPose, CenterRow, CenterColumn, 1, CenterX, CenterY) set_origin_pose (FinalPose, CenterX-Scale*WidthMappedImage/2.0, CenterY-Scale*HeightMappedImage/2.0, 0, PoseNewOrigin) gen_image_to_world_plane_map (Map, CamParam, PoseNewOrigin, 652, 494, WidthMappedImage, HeightMappedImage, Scale, 'bilinear') map_image (Image, Map, ImageMapped) dev_clear_window () dev_display (ImageMapped) * In case, only one image has to be mapped, the operator * image_to_world_plane can be used instead of the operators * gen_image_to_world_plane_map together with map_image. image_to_world_plane (Image, ImageMapped, CamParam, PoseNewOrigin, WidthMappedImage, HeightMappedImage, Scale, 'bilinear')

六.Halcon 控制循环算子
(2012-04-20 23:40:44) 条件<condition> ,<condition> 内为计算成 an integer or boolean value 的表达式。 表达式的值 1 则条件为真,否则为假。 1.if(<condition>)。。。 endif:条件为真时,执行条件后的内容,否则转到 endif. 2.if (<condition>)...else...endif:条件为真, 执行 if...else 部分, 否则执行 else...endif,典型的选择条件语句。 3.elseif:相当于算子 2 的 else 部分,但是它允许测试一个附件条件。 例如:if (<condition1>)...elseif (<condition2>)...endif 当条件 1 为假条件 2 为真时,执行条件 2 后面的部 分。在语法结构上等价于:if (<condition1>) ... else if (<condition2>) ... endif endif 循环控制语句 1.while (<condition>)... endwhile:循环控制结构,当条件为真时,执行循环体。可以利用 operator continue 和 break 操作来重新开始或立刻终止循环。 2.repeat...until (<condition>):循环体至少被执行一次,直到满足条件时退出。 3.for <index> := <start> to <end> by <step>...endfor halcon 最重要的循环结构,呵呵不细说了~同样,可以利用 operator continue 和 break 操作来重新开始

或立刻终止循环。 例如: old_x := 0 old_y := 0 dev_set_color ('red') dev_set_part(0, 0, 511, 511) for x := 1 to 511 by 1 y := sin(x / 511.0 * 2 * 3.1416 * 3) * 255 disp_line (WindowID, -old_y+256, old_x, -y+256, x) old_x := x old_y := y endfor 4.continue:强制执行下一个循环。 例如:i := |Images| while (i) Image := Images[i] count_channels (Image, Channels) if (Channels # 3) continue endif * extensive processing of color image follows endwhile 5.break:强制退出循环。 例 1. Number := |Regions| AllRegionsValid := 1 * check whether all regions have an area <= 30 for i := 1 to Number by 1 ObjectSelected := Regions[i] area_center (ObjectSelected, Area, Row, Column) if (Area > 30) AllRegionsValid := 0 break () endif endfor 例 2. while (1) grab_image (Image, FGHandle) dev_error_var (Error, 1) dev_set_check ('~give_error') get_mposition (WindowHandle, R, C, Button) dev_error_var (Error, 0) dev_set_check ('give_error') if ((Error = H_MSG_TRUE) and (Button # 0))

break () endif endwhile 其他 1.stop:终止后面的循环,点击 Step Over or Run button 继续。 2.exit:终止 Hdevelop 程序段。 3.return:从当前的程序返回到正在呼叫的算子。 4.try ... catch ... endtry:异常算子处理句柄 5.throw:允许处理用户定义的意外情况。

七.图像校正 Halcon
(2012-04-24 16:38:37)

1.get_image_size(Image : : : Width, Height) 返回图像的尺寸。 2.parameters_image_to_world_plane_centered (CamParam, Pose, CenterRow, CenterCol, WidthMappedImage, HeightMappedImage, ScaleForCenteredImage, PoseForCenteredImage) Halcon 内部程序,输出为图像的比率和姿态。 3.gen_image_to_world_plane_map( : Map : CameraParam, WorldPose, WidthIn, HeightIn, WidthMapped, HeightMapped, Scale, MapType : ) 产生一个投影映射,该映射描述图像平面与 Z=O 的世界平面之间的关系,输出为图像 MAP,是一个 多通道的图像 包含了映射数据。 4.map_image(Image, Map : ImageMapped : : ) 利用映射变换校正图像,输出为矫正后的图像。 5.image_to_world_plane(Image : ImageWorld : CameraParam, WorldPose, Width, Height, Scale, Interpolation : ) 把校正后的图像转换到 Z=0 的世界平面。 6.image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y) 把图像上的点转换到 Z=0 的世界平面,输出为点坐标。 * This program provides procedures for the determination of the * parameters Pose and Scale of the operators image_to_world_plane * and gen_image_to_world_plane_map. * Read the image ImgPath := '3d_machine_vision/calib/' read_image (Image, ImgPath+'caliper_01') * Set the camera parameters for the image CamParam := [0.0160728,-631.843,7.40077e-006,7.4e-006,326.369,246.785,652,494] Pose := [-41.2272,26.763,398.682,359.655,359.202,322.648,0] * Reopen the window appropriately get_image_size (Image, WidthOriginalImage, HeightOriginalImage) dev_open_window_fit_image (Image, 0, 0, WidthOriginalImage, HeightOriginalImage, WindowHandle) set_display_font (WindowHandle, 14, 'mono', 'true', 'false') dev_set_color ('red')

WidthMappedImage := 652 HeightMappedImage := 494 * Transform the image such that a given point appears in the * center of the rectified image and the the scale of the rectified image * is similar to the scale of the original image (in the surroundings * of the given point) * Define the point that will appear in the center of the rectified image dev_display (Image) disp_message (WindowHandle, 'Define the center of the mapped image', 'window', 12, 12, 'white', 'false') get_mbutton (WindowHandle, CenterRow, CenterCol, Button) * Determine scale and pose such that the given point appears * in the center of the rectified image and that the * scale of the two images is similar (in the surroundings * of the given point). parameters_image_to_world_plane_centered (CamParam, Pose, CenterRow, CenterCol, WidthMappedImage, HeightMappedImage, ScaleForCenteredImage, PoseForCenteredImage) * Rectify the image gen_image_to_world_plane_map (Map, CamParam, PoseForCenteredImage, WidthOriginalImage, HeightOriginalImage, WidthMappedImage, HeightMappedImage, ScaleForCenteredImage, 'bilinear') map_image (Image, Map, ImageMapped) dev_open_window_fit_image (ImageMapped, 0, 0, WidthMappedImage, HeightMappedImage, WindowHandleMapped) set_display_font (WindowHandleMapped, 14, 'mono', 'true', 'false') dev_set_color ('red') dev_display (ImageMapped) * In case, only one image has to be mapped, the operator * image_to_world_plane can be used instead of the operators * gen_image_to_world_plane_map together with map_image. image_to_world_plane (Image, ImageMapped, CamParam, PoseForCenteredImage, WidthMappedImage, HeightMappedImage, ScaleForCenteredImage, 'bilinear') * Display the center point image_points_to_world_plane (CamParam, PoseForCenteredImage, CenterRow, CenterCol, ScaleForCenteredImage, CenterX, CenterY) disp_cross (WindowHandleMapped, CenterY, CenterX, 6, rad(45)) disp_message (WindowHandleMapped, 'The selected point appears in the center', 'window', 12, 12, 'white', 'false') disp_message (WindowHandleMapped, 'of the rectified image', 'window', 36, 12, 'white', 'false') disp_continue_message (WindowHandleMapped, 'black', 'true') stop () * Now determine scale and pose such that the entire image * fits into the rectified image. parameters_image_to_world_plane_entire (Image, CamParam, Pose, WidthMappedImage, HeightMappedImage, ScaleForEntireImage, PoseForEntireImage) * Rectify the image

image_to_world_plane (Image, ImageMapped, CamParam, PoseForEntireImage, WidthMappedImage, HeightMappedImage, ScaleForEntireImage, 'bilinear') dev_clear_window () dev_display (ImageMapped) disp_message (WindowHandleMapped, 'The entire image is visible in the rectified image', 'window', -1, -1, 'white', 'false')

八.依据点关系计算物体三维位姿 Halcon
(2012-04-24 17:20:32)

1.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin) 平移 POSEIN 的原点,输出为新的原点。注意,平移沿着 OBJ 的坐标新进行,而非沿着摄像机的坐 标系进行。 2.disp_3d_coord_system (WindowHandle, CamParam, Pose, 0.02) 内部函数,显示世界坐系的坐标轴 3.determine_control_points (Image, Intersection, RowCenter, ColCenter) 内部函数,找到两个圆形洞,一个矩形洞的交点中心坐标。 4.gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : ) 在输出点处产生十字交叉的 XLD 轮廓。 5.dev_clear_window( : : : ) 关闭活动窗口 6.affine_trans_point_3d( : : HomMat3D, Px, Py, Pz : Qx, Qy, Qz) 点到点的三维变换,输入控制为其次变换矩阵,输出为新坐标系下的点坐标。 7.project_3d_point( : : X, Y, Z, CameraParam : Row, Column) 把摄像机坐标下的点投影到图像坐标系,输出为图像坐标系下的行列坐标。 * Set image path and name ImgPath := '3d_machine_vision/pose/' //设定读取图像的路径// ImgName := 'metal_part' //设定图像名称// * Read reference image read_image (ImageRef, ImgPath+'calib') //读取图像// * Define camera parameters (the exterior camera parameters define the world coordinate system) CamParam := [1.222445e-002,-2.610410e+003,7.395958e-006,7.400000e-006,3.031241e+002,2.341259e+002,640,480] //设定已知相机内参数// * Reopen the window to get the WindowHandle dev_close_window () get_image_size (ImageRef, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) * Define WCS find_caltab (ImageRef, Caltab, 'caltab_30mm.descr', 3, 112, 5) //输出标定板区域// find_marks_and_pose (ImageRef, Caltab, 'caltab_30mm.descr', CamParam, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, PoseOfWCS) //输出标定点的图像坐标及标定板在摄像机坐标系下的初步位姿// * Modify the pose of the WCS in order to modify the world coordinate system if (true)

* If the pose is only to be shifted, you can use set_origin_pose set_origin_pose (PoseOfWCS, -0.0568, 0.0372, 0, PoseOfWCS) * But you may also rotate the respective coordinate system, or apply other transformations. * This can be done based on homogenous transformation matrices pose_to_hom_mat3d (PoseOfWCS, camHwcs)//输出世界坐标相对于摄像机坐标的齐次变换矩阵// hom_mat3d_rotate_local (camHwcs, rad(180), 'x', camHwcs)//世界坐标绕着自身 X 轴转 180, 输出为齐 次变换矩阵// hom_mat3d_to_pose (camHwcs, PoseOfWCS)//输出世界坐标系在摄像机坐标系中的位姿// endif dev_display (ImageRef) hom_mat3d_to_pose (camHwcs, Pose))//输出世界坐标系在摄像机坐标系中的位姿// disp_3d_coord_system (WindowHandle, CamParam, Pose, 0.02)//显示世界坐系的坐标轴// * Select an image (1, 2, or 3) ImgNum := 1 read_image (Image, ImgPath+ImgName+'_'+ImgNum$'02d') * Define object coordinates of control points ShiftXObj := 5.5/1000.0 //世界坐标系中控制点距离原点 X 方向的距离// ShiftYObj := 5.15/1000.0 //世界坐标系中控制点距离原点 Y 方向的距离// ControlX := [18.73,-5.35,13.05, 0.00]/1000.0+ShiftXObj ControlY := [27.52,27.68, 0.00, 0.00]/1000.0+ShiftYObj ControlZ := [ 0.00, 0.00, 0.00, 0.00] //控制点的世界坐标// dev_set_color ('green') * Determine the image coordinates of the control points (here: via find_caltab and find_marks_and_pose) determine_control_points (Image, Intersection, RowCenter, ColCenter) * Visualize control point disp_message (WindowHandle, 'Extracted control points', 'window', -1, -1, 'green', 'false') gen_cross_contour_xld (Cross, RowCenter, ColCenter, 6, 0.785398)//在输出点坐标处输出 XLD 轮廓// dev_display (Cross) //显示 XLD 轮廓// disp_continue_message (WindowHandle, 'black', 'true')//窗口显示 F5 继续// stop () //程序暂停,等待继续执行按钮// * Determine the pose of the object ... vector_to_pose (ControlX, ControlY, ControlZ, RowCenter, ColCenter, CamParam, 'iterative', 'error', PoseOfObject, Errors) //根据 4 个控制点在世界坐标和图像坐标之间的关系,得到物体坐标系在摄像机 坐标系下的位姿// * Transform the poses into homogeneous transformation matrices pose_to_hom_mat3d (PoseOfWCS, camHwcs)//世界坐标在摄像机坐标下的齐次变换矩阵// pose_to_hom_mat3d (PoseOfObject, camHobj)//物体坐标系在摄像机坐标系下的齐次变换矩阵// * Determine the transformation matrix from object coordinates into world coordinates hom_mat3d_invert (camHwcs, wcsHcam) //求世界坐标在摄像机坐标坐标系下矩阵的逆矩阵// hom_mat3d_compose (wcsHcam, camHobj, wcsHobj)//相机对世界坐标矩阵乘以物体系对世界坐标系 矩阵,得到物体对世界坐标系的齐次变换矩阵// * Visualize the results dev_clear_window () //关闭活动窗口// dev_display (Image)

dev_set_color ('green') //设置接下来要显示部分的颜色// disp_coordinate_system_3d (WindowHandle, CamParam, camHwcs, 'WCS') //显示世界坐标系,为绿色// dev_set_color ('red') disp_coordinate_system_3d (WindowHandle, CamParam, camHobj, 'OBJ')//显示物体坐标系,红色// * Define some 3D object coordinates of points (here: the four corners of the rectangular hole) CornersXObj := [0.89, 0.77, 12.12, 12.18]/1000.0+ShiftXObj //角点物体坐标系下的 X 坐标// CornersYObj := [21.63, 8.47, 8.45, 21.51]/1000.0+ShiftYObj//角点在物体坐标系下的 Y 坐标// CornersZObj := [0,0,0,0] //角点在物体坐标系下的 Z 坐标// * Transform the 3D object coordinates into the world coordinate system affine_trans_point_3d (wcsHobj, CornersXObj, CornersYObj, CornersZObj, CornersXWCS, CornersYWCS, CornersZWCS) //转换物体坐标系中的点进入世界坐标系// * Transform the 3D object coordinates into the image coordinate system and display the respective points affine_trans_point_3d (camHobj, CornersXObj, CornersYObj, CornersZObj, CornersXCam, CornersYCam, CornersZCam) //转换物体坐标系中的点进入摄像机坐标系// project_3d_point (CornersXCam, CornersYCam, CornersZCam, CamParam, CornersRow, CornersCol) //把摄像机坐标系中的 3D 点投影到图像坐标// dev_set_color ('blue') gen_cross_contour_xld (Cross, CornersRow, CornersCol, 6, 0.785398)//在图像中 4 个角点出产生交叉线// dev_display (Cross) * Display the 3D object coordinates and the 3D coordinates in the world coordinate system CornersXObjmm := CornersXObj*1000.0 CornersYObjmm := CornersYObj*1000.0 CornersZObjmm := CornersZObj*1000.0 CornersXWCSmm := CornersXWCS*1000.0 CornersYWCSmm := CornersYWCS*1000.0 CornersZWCSmm := CornersZWCS*1000.0 //米转化成毫米单位// disp_message (WindowHandle, 'Object coordinates:', 'window', 10, 10, 'red', 'false') disp_message (WindowHandle, 'World coordinates:', 'window', 10, 200, 'green', 'false') //显示信息// for i := 1 to |CornersRow| by 1 disp_message (WindowHandle, i, 'window', CornersRow[i-1], CornersCol[i-1], 'blue', 'false') disp_message (WindowHandle, i+':', 'window', 30+i*20, 10, 'red', 'false') disp_message (WindowHandle, '('+CornersXObjmm[i-1]$'.2f'+','+CornersYObjmm[i-1]$'.2f'+','+CornersZObjmm[i-1]$'.2f'+') [mm]', 'window', 30+i*20, 30, 'red', 'false') dev_set_color ('green') disp_message (WindowHandle, i+':', 'window', 30+i*20, 200, 'green', 'false') disp_message (WindowHandle, '('+CornersXWCSmm[i-1]$'.2f'+','+CornersYWCSmm[i-1]$'.2f'+','+CornersZWCSmm[i-1]$'.2f'+') [mm]', 'window', 30+i*20, 220, 'green', 'false') endfor //分别在物体坐标系和世界坐标系下显示 4 个角点的坐标// 8.1 绿色交叉线处为控制点 8.2 最后的窗口显示结果

九.双目视觉系统空间布置
(2012-04-25 00:25:28)

利用双目立体视觉系统两个首要任务:1. 决定相机的内参数 2. 找到图像对的共轭点

To achieve a high distance resolution, the setup should be chosen such that the length b of the basis as well as the focal length f are large, and that the stereo camera system is placed as close as possible to the object. In addition, the distance resolution depends directly on the accuracy d with which the disparities can be determined. Typically, the disparities can be determined with an accuracy of 1/5 up to 1/10 pixel, which corresponds to approximately 1 μm for a camera with 7.4 μm pixel size. 注意以上视觉系统布置时,各个参数对 Z 方向分辨率的影响。

十.双目视觉系统标定
(2012-04-25 00:45:33)

1.get_image_pointer1(Image : : : Pointer, Type, Width, Height) 返回第一通道的点,图像数据类型,图像尺寸。 2.disp_image(Image : : WindowHandle : ) 在输出窗口显示灰度图像 3.visualize_results_of_find_marks_and_pose (ImageL, WindowHandle1, RCoordL, CCoordL, StartPoseL, StartCamParL) 内部函数,显示初步标定的坐标系和 MARKS 中心,MARKS 中线用十字线标出。 4.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx, CalibObjPoseIdx, Row, Column, Index, Pose : ) 储存以点为基础的标定观测值,将观测值储存与标定数据句柄中。 5.calibrate_cameras( : : CalibDataID : Error) 根据标定数据模型中的值标定摄像机。 6.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue) 查询储存或计算得到的标定模型中的数据。 7.write_cam_par( : : CameraParam, CamParFile : ) 把相机内参数写入 TXT 文件 8.write_pose( : : Pose, PoseFile : ) 把相机的位姿写入 TXT 文件 9.gen_binocular_rectification_map( : Map1, Map2 : CamParam1, CamParam2, RelPose, SubSampling, Method, MapType : CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect) 把相机参数和姿态作为输入,输出为校正图像和矫正后的参数和姿态。 10.map_image(Image, Map : ImageMapped : : ) dev_update_window ('off') * Set the image path ImgPath := '3d_machine_vision/stereo/'

* Read the first images to get their size i := 0 read_image (ImageL, ImgPath+'calib_distorted_l_'+i$'03d') read_image (ImageR, ImgPath+'calib_distorted_r_'+i$'03d') //分别读取左右目图像,编号长 3 位// * Reopen the windows with an appropriate size dev_close_window () dev_close_window () get_image_pointer1 (ImageL, PointerL, TypeL, WidthL, HeightL) get_image_pointer1 (ImageR, PointerR, TypeR, WidthR, HeightR) dev_open_window (0, 0, WidthL, HeightL, 'black', WindowHandle1) dev_open_window (0, WidthL+5, WidthL, HeightL, 'black', WindowHandle2)//为左右目各打开一个图形窗 口// * Set the calibration plate description file CaltabName := 'caltab_30mm.descr' * Set the initial values for the interior camera parameters StartCamParL := [0.0125, 0, 7.4e-6, 7.4e-6,WidthL/2.0,HeightL/2.0,WidthL,HeightL] StartCamParR := StartCamParL * parameter settings for find_caltab and find_marks_and_pose SizeGauss := 3 MarkThresh := 120 MinDiamMarks := 5 StartThresh := 128 DeltaThresh := 10 MinThresh := 18 Alpha := 0.9 MinContLength := 15 MaxDiamMarks := 100 * Create a calibration data model in which all calibration data * including the image coordinates of the calibration marks and * the observation poses of the calibration plate will be * accumulated create_calib_data ('calibration_object', 2, 1, CalibDataID) //创建标定数据模型句柄// set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamParL)//在标定模型中设置相机 的类型和原始参数// set_calib_data_cam_param (CalibDataID, 1, 'area_scan_division', StartCamParR) set_calib_data_calib_object (CalibDataID, 0, CaltabName) //定义一个标定对象// * Start the loop over the calibration images for i := 0 to 10 by 1 * Read and display the calibration images read_image (ImageL, ImgPath+'calib_distorted_l_'+i$'03d') read_image (ImageR, ImgPath+'calib_distorted_r_'+i$'03d') disp_image (ImageL, WindowHandle1) disp_image (ImageR, WindowHandle2) //读取并显示图像// * Search for the calibration plate

find_caltab (ImageL, CaltabL, CaltabName, SizeGauss, MarkThresh, MinDiamMarks) find_caltab (ImageR, CaltabR, CaltabName, SizeGauss, MarkThresh, MinDiamMarks)//输出标定板区域// disp_region (CaltabL, WindowHandle1) disp_region (CaltabR, WindowHandle2) //显示标定区域// * Extract the calibration marks and estimate an initial pose find_marks_and_pose (ImageL, CaltabL, CaltabName, StartCamParL, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoordL, CCoordL, StartPoseL) * Visualize the extracted calibration marks and the * coordinate system defined by the estimated pose. visualize_results_of_find_marks_and_pose (ImageL, WindowHandle1, RCoordL, CCoordL, StartPoseL, StartCamParL) //显示初步标定的坐标系和 MARKS 中心// * Extraction of marks and pose as well as visualization of the * results for the second image. find_marks_and_pose (ImageR, CaltabR, CaltabName, StartCamParR, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoordR, CCoordR, StartPoseR) visualize_results_of_find_marks_and_pose (ImageR, WindowHandle2, RCoordR, CCoordR, StartPoseR, StartCamParR) * Store the image coordinates of the calibration marks as well * as the estimated initial poses for all stereo pairs in the * calibration data model * - Camera 0 is the (L)eft camera * - Camera 1 is the (R)ight camera set_calib_data_observ_points (CalibDataID, 0, 0, i, RCoordL, CCoordL, 'all', StartPoseL) set_calib_data_observ_points (CalibDataID, 1, 0, i, RCoordR, CCoordR, 'all', StartPoseR) //在标定数据模型句柄中储存标定结果// endfor * Perform the actual calibration calibrate_cameras (CalibDataID, Errors) //根据标定数据模型中的值标定摄像机// * Get the calibrated camera parameters get_calib_data (CalibDataID, 'camera', 0, 'params', CamParamL) get_calib_data (CalibDataID, 'camera', 1, 'params', CamParamR) //获取摄像机参数// * Since the left camera is the reference camera for the * calib data model, the pose of the right camera is its * pose relative to the left camera get_calib_data (CalibDataID, 'camera', 1, 'pose', cLPcR) //获取右目相对于左目的位姿// * Store the results into files write_cam_par (CamParamL, 'cam_left-125.dat') write_cam_par (CamParamR, 'cam_right-125.dat') write_pose (cLPcR, 'pos_right2left.dat') //将相机参数写入文件// * Generate the rectification maps gen_binocular_rectification_map (MapL, MapR, CamParamL, CamParamR, cLPcR, 1, 'geometric', 'bilinear', RectCamParL, RectCamParR, CamPoseRectL, CamPoseRectR, RectLPosRectR) //把相机参数和姿态作为输入,输出为校正图像和矫正后的参数和姿态。// * Read in a stereo image pair, aquired with the stereo camera system,

* which has been calibrated, just now. read_image (ImageL, ImgPath+'caliper_distorted_l') read_image (ImageR, ImgPath+'caliper_distorted_r') * Rectify the stereo images and display them map_image (ImageL, MapL, ImageRectifiedL) map_image (ImageR, MapR, ImageRectifiedR) dev_set_window (WindowHandle1) dev_clear_window () dev_display (ImageRectifiedL) dev_set_window (WindowHandle2) dev_clear_window () dev_display (ImageRectifiedR) disp_continue_message (WindowHandle1, 'black', 'true') stop () dev_set_window (WindowHandle2) dev_close_window () dev_update_window ('on') dev_set_window (WindowHandle1) dev_clear_window () dev_display (ImageRectifiedL) clear_calib_data (CalibDataID)

十一.利用 30mm 标定板标定双目立体视觉系统
(2012-04-25 20:20:51)

1.caltab_points( : : CalTabDescrFile : X, Y, Z) 从标定文件中读取标定板坐标系中的标定点坐标 2.binocular_calibration( : : NX, NY, NZ, NRow1, NCol1, NRow2, NCol2, StartCamParam1, StartCamParam2, NStartPose1, NStartPose2, EstimateParams : CamParam1, CamParam2, NFinalPose1, NFinalPose2, RelPose, Errors) 计算立体视觉系统的所有参数 参数: NX, NY, NZ:标定点坐标数组; NRow1, NCol1, NRow2, NCol2:标定点的图像坐标数组; StartCamParam1, StartCamParam2:相机 1,2 的初始内参数; NStartPose1, NStartPose2:标定板在相机 1,2 的初始位姿; EstimateParams:选择将被计算的相机参数; CamParam1, CamParam2:计算得到的相机 1,2 的内参数; NFinalPose1, NFinalPose2:所有标定模型在摄像机坐标系中的位姿数组; RelPose:相机 2 相对于相机 1 的位姿; Errors:像素距离的平均错位率; 3.check_epipolar_constraint(ImageRectifiedL, ImageRectifiedR : : RectCamParR, WindowHandle1, WindowHandle2 : EpipolarError) 内部程序,检查并显示极线约束

RectCamParL,

4.gen_binocular_rectification_map( : Map1, Map2 : CamParam1, CamParam2, RelPose, SubSampling, Method, MapType : CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect) 产生变换映射,该映射描述了左右相机对到图 像校正后的基平面之间的映射。 参数: MapL, MapR:包含左右目相机映射数据的映射图。 CamParamL, CamParamR:两相机的原始参数。 RelPose:右目相对于左目的位姿。 SubSampling: 相机的二次采样因数。 Method:图像校正方法。 MapType: 映射的插值方式。 CamParamRect1, CamParamRect2: 相机图像矫正后的内外参数 CamPoseRect1, CamPoseRect2:校正前的相机在校正后相机坐标系中的位姿态 RelPoseRect:矫正后的相机 2 相对于相机 1 的位姿。 5.find_marks_and_pose(Image, CalTabRegion : : CalTabDescrFile, StartCamParam, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks : RCoord, CCoord, StartPose) 从图像中抽取标定点,计算标定板在摄像机坐标系中的位姿。 控制参数: CalTabDescrFile:标定板描述文件 StartCamParam:照相机的内参数 StartThresh :检测轮廓时的初始阈值。 DeltaThresh:检测失败时下一次比前一次减小的阈值。 MinThresh:检测循环时终止的阈值。 Alpha:边缘检测时的滤波参数,值越小平滑效果越好,但细节越模糊。 MinContLength:标定点轮廓的最小长度,小于此长度的轮廓将被去除。 MaxDiamMarks:标定点的最大直径,大于此直径的椭圆区域将被去除。 RCoord, CCoord:标定点中心坐标。 StartPose:标定板坐标系在摄像机坐标系下的位姿。 * Application program to demonstrate the calibration of a binocular stereo system. * We have a stereo setup of two cameras ('camera1 is left of camera2'). * Both cameras will be calibrated by a couple of images of a 30mm calibration plate. An image pair * will be rectified to epipolar images and the epipolar constraint will be checked. * --------------------------------------------------------* Set the image path ImgPath := 'stereo/board/' * Read the first images to get their size Index := 1 read_image (ImageL, ImgPath+'calib_l_'+Index$'02d') read_image (ImageR, ImgPath+'calib_r_'+Index$'02d') * Reopen the windows with an appropriate size dev_close_window () get_image_size (ImageL, WidthL, HeightL) dev_open_window (0, 0, WidthL, HeightL, 'black', WindowHandle1)

dev_set_draw ('margin') d

赞助商链接
相关文章:
更多相关标签: