halcon采图
- halcon.net
- halcon.dll 放到debug下
sdk1采图
采集流程
-
转正 (ROI目标区转正)仿射变换
平移
选择
缩放
分割 二值化 - >二值图
-
形态学分析
- 膨胀
- 腐蚀
- 开运算 细小腐蚀
- 闭运算 细小膨胀
-
特征提取
- 定位
- 图像预处理
- 图像分割
- 颜色
- 轮廓定位
- 定位
图像分类

二值图形态学分析
灰度图的形态学分析


放射变换






效果越好时间越长


halcon 实现仿射变换
画出区域做基础的仿射变换

* 1. 关闭之前的窗口(避免多个窗口干扰)
dev_close_window ()
* 2. 新建512x512的黑色窗口(Width=512,Height=512,背景黑色)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* 3. 手动画区域(在窗口内拖动鼠标画任意形状,右键确认)
disp_message (WindowHandle, '拖动鼠标画区域(右键确认)', 'window', 12, 12, 'white', 'true')
draw_region (Region, WindowHandle)
* 4. 显示原始区域(让你看到画的区域在哪里)
dev_display (Region)
disp_message (WindowHandle, '原始区域', 'window', 36, 12, 'green', 'true')
stop () // 暂停,按F5继续
* 5. 定义仿射变换矩阵(平移→缩放,顺序:后定义的变换先执行)
hom_mat2d_identity (HomMat2DIdentity) // 初始化单位矩阵(无任何变换)
* 5.1 平移:相对于窗口左上角(0,0),向右移64,向下移64(row=64,column=64)
hom_mat2d_translate (HomMat2DIdentity, 64, 64, HomMat2DTranslate)
* 5.2 缩放:相对于窗口左上角(0,0),x/y方向均放大2倍(scale_x=2,scale_y=2)
hom_mat2d_scale (HomMat2DTranslate, 2, 2, 0, 0, HomMat2DScale) // 最终变换矩阵:缩放+平移
* 6. 对区域执行仿射变换(关键:用最终的HomMat2DScale,不是HomMat2DTranslate)
affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')
* 7. 显示变换后的区域(清空窗口→显示原始区域→显示变换后区域,对比效果)
dev_clear_window ()
dev_display (Region) // 原始区域(黑色窗口中白色部分)
dev_set_color ('red') // 变换后的区域设为红色,方便区分
dev_display (RegionAffineTrans) // 变换后的区域(红色)
* 8. 提示信息
disp_message (WindowHandle, '黑色=原始区域 | 红色=平移+缩放后区域', 'window', 12, 12, 'white', 'true')
在图片中选出区域进仿射变换



dev_update_off () // 关闭实时更新,加快运行速度
dev_close_window () // 关闭旧窗口
* 1. 选择并加载图像
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
if (Selection == '') // 防错:用户未选图像直接取消
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
read_image (Image, Selection)
* 2. 新建窗口(适配图像大小,避免拉伸)
get_image_size (Image, ImageWidth, ImageHeight)
dev_open_window (0, 0, ImageWidth, ImageHeight, 'black', WindowHandle)
dev_display (Image)
disp_message (WindowHandle, '原始图像', 'window', 12, 12, 'white', 'true')
stop () // 暂停,按F5继续
* 3. 画矩形框选区域(水平矩形,右键确认)
disp_message (WindowHandle, '拖动鼠标画矩形(框选目标区域,右键确认)', 'window', 40, 12, 'white', 'true')
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
* 4. 生成矩形区域+抠图(两种抠图方式,按需选择)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) // 生成矩形区域
reduce_domain (Image, Rectangle, ImageReduced) // 方式1:保留原图尺寸,仅限制有效域(后续变换用这个)
crop_domain (ImageReduced, ImagePart) // 方式2:裁剪为矩形大小的独立小图像(可选)
* 显示抠图结果
dev_clear_window ()
dev_display (ImagePart) // 显示裁剪后的小图像(更直观)
disp_message (WindowHandle, '抠图后的区域', 'window', 12, 12, 'white', 'true')
stop () // 暂停,按F5继续
* 5. 计算矩形区域的中心坐标(变换基准点)
area_center (Rectangle, Area, RegionCenterRow, RegionCenterCol)
* 6. 变换1:平移+旋转组合(基于区域中心)
tuple_rad (45, RotAngle) // 目标旋转角度:45度→弧度
* 刚性变换矩阵:原始中心(RegionCenterRow,RegionCenterCol)、无旋转(0) → 新中心(上移50,右移30)、旋转45度
vector_angle_to_rigid (RegionCenterRow, RegionCenterCol, 0, RegionCenterRow-50, RegionCenterCol+30, RotAngle, HomMat2D_TransRotate)
* 对图像执行变换(constant=填充色,true=保持原图尺寸)
affine_trans_image (ImageReduced, ImageAffineTrans_TransRotate, HomMat2D_TransRotate, 'constant', 'true')
* 对区域执行变换(和图像变换一致)
affine_trans_region (Rectangle, RegionAffineTrans_TransRotate, HomMat2D_TransRotate, 'nearest_neighbor')
* 显示平移+旋转结果
dev_clear_window ()
stop ()
dev_display (Image) // 显示原图作为背景参考
stop ()
dev_display (ImageAffineTrans_TransRotate) // 变换后的图像
stop ()
dev_set_color ('red')
dev_display (RegionAffineTrans_TransRotate) // 变换后的区域(红色框)
disp_message (WindowHandle, '平移+旋转后的区域(红框)', 'window', 12, 12, 'white', 'true')
stop () // 暂停,按F5继续
* 7. 变换2:纯旋转(中心不变,仅旋转45度)
tuple_rad (45, RotAngle_Pure) // 目标旋转角度:45度→弧度
* 刚性变换矩阵:原始中心、无旋转 → 同一中心、旋转45度(无平移)
vector_angle_to_rigid (RegionCenterRow, RegionCenterCol, 0, RegionCenterRow, RegionCenterCol, RotAngle_Pure, HomMat2D_PureRotate)
* 对图像执行纯旋转
affine_trans_image (ImageReduced, ImageAffineTrans_PureRotate, HomMat2D_PureRotate, 'constant', 'true')
* 对区域执行纯旋转
affine_trans_region (Rectangle, RegionAffineTrans_PureRotate, HomMat2D_PureRotate, 'nearest_neighbor')
* 显示纯旋转结果
dev_clear_window ()
dev_display (Image) // 原图背景
stop ()
dev_display (ImageAffineTrans_PureRotate) // 纯旋转后的图像
stop ()
dev_set_color ('green')
dev_display (RegionAffineTrans_PureRotate) // 纯旋转后的区域(绿色框)
stop ()
disp_message (WindowHandle, '纯旋转后的区域(绿框)', 'window', 12, 12, 'white', 'true')
通过投影给畸变图片复原



dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, 'C:/Users/12613/Documents/xwechat_files/wxid_zh4dvw96777z22_8506/msg/file/2025-11/微信图片_20251124144244_455_151.png')
*投影变换
x:=[0,324,216,532]
y:=[0,493,111,590]
x1:=[0,0,535,535]
y1:=[0,590,0,590]
hom_vector_to_proj_hom_mat2d (x, y, [1,1,1,1], x1, y1, [1,1,1,1], 'normalized_dlt', HomMat2D)
projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')
均值化直方图

缩放直方图

让亮的更亮 暗的更暗


通过动态阈值(差值匹配图像)

代码
* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/vessel.png')
*均值化直方图
* equ_histo_image (Image, ImageEquHisto)
*缩放量的更亮暗的更暗
* scale_image (Image, ImageScaled, 1.97674, -77)
* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/datacode/ecc200/ecc200_cpu_015.png')
*处理失焦指令
* shock_filter (Image, SharpenedImage, 0.5, 10, 'canny', 1)
* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/circle_plate.png')
*均值滤波
* mean_image (Image, ImageMean, 9, 9)
*中值滤波
* median_image (ImageMean, ImageMedian, 'circle', 1, 'mirrored')
* read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/egypt1.png')
*自动阈值 直方图平滑
* auto_threshold (Image, Regions, 4)
read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-19.11-Progress/examples/images/photometric_stereo/embossed_01.png')
mean_image (Image, ImageMean, 59, 59)
dyn_threshold (Image, ImageMean, RegionDynThresh1, 15, 'not_equal')
*膨胀
closing_circle (RegionDynThresh1, RegionClosing, 8.5)
opening_circle (RegionClosing, RegionOpening, 5.5)
connection (RegionOpening, ConnectedRegions)
*最小外接圆
smallest_circle (ConnectedRegions, Row, Column, Radius)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1)
dev_display (Image)
dev_display (ContCircle)