Halcon 学习笔记五:几何定位+仿射变换+测量

简介: Halcon 学习笔记五:几何定位+仿射变换+测量

定位流程

  • blob分析
  • 模板匹配 (仿射变换成标准的形状)
  • 识别

例子一

打开这个关于仿射变换的例子

在窗口中画一个图形,左键画,右键确认

draw_region (Region, WindowID)

获得单位矩阵

hom_mat2d_identity (HomMat2DIdentity)

获得旋转矩阵

hom_mat2d_rotate (HomMat2DIdentity, -0.3, 256, 256, HomMat2DRotate)

可以看到-0.3 是旋转角,如果是正的话,就是逆时针旋转的。负的话就是顺时针旋转,

两个256分别是x,y的坐标点(旋转中心)。

通过旋转角和旋转中心可以得到旋转矩阵

图像缩放

x,y都放大1.5倍,

256,256是固定点

点(Px,Py)是变换的固定点,即当使用HomMat2DScale变换时,该点保持不变。为了获得这种行为,首先向输入变换矩阵添加平移,将固定点移动到全局坐标系的原点。然后,添加缩放,最后是将固定点移回其原始位置的平移。

hom_mat2d_scale (HomMat2DRotate, 1.5, 1.5, 256, 256, HomMat2DScale)

进行放射变换

affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')

最后可以看到变换后的结果

dev_clear_window ()
dev_set_draw ('margin')
dev_set_color ('red')
dev_display (Region)
dev_set_color ('green')
dev_display (RegionAffineTrans)

完整代码

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'white', WindowID)
dev_set_color ('black')
* Draw with the mouse an arbitrary region into the window
draw_region (Region, WindowID)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_rotate (HomMat2DIdentity, -0.3, 256, 256, HomMat2DRotate)
hom_mat2d_scale (HomMat2DRotate, 1.5, 1.5, 256, 256, HomMat2DScale)
affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')
dev_clear_window ()
dev_set_draw ('margin')
dev_set_color ('red')
dev_display (Region)
dev_set_color ('green')
dev_display (RegionAffineTrans)

补充

最终要的就是 旋转 、平移、缩放

平移 hom_mat2d_translate

旋转 hom_mat2d_rotate

缩放 hom_mat2d_scale

例子二(药片的定位)

打开示例,药片的定位

思路就是 先blob分析,然后计算区域的角度,然后仿射成标准的位置

首先是读取图片,打开窗口,设置字体,和draw方式,线宽等

dev_close_window ()
dev_update_off ()
read_image (ImageOrig, 'blister/blister_reference')
dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)

获取BGR中的第一个通道,就是B对应的单通道图像

(halcon中的三通道图像是默认BGR的)

access_channel (ImageOrig, Image1, 1)

接下来是二值化和获取轮廓(凸性)

threshold (Image1, Region, 90, 255)
shape_trans (Region, Blister, 'convex')

获得该区域的角度(与水平的夹角)

该运算符基于椭圆轴,将区域看成一个椭圆,椭圆的长轴与极轴的夹角就是这个角度Phi

orientation_region (Blister, Phi)

可以看到是负的

获得区域的中心坐标

area_center (Blister, Area1, Row, Column)

利用 起始中心点坐标和角度 到 目标中心点坐标和角度 生成 仿射矩阵

vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)

进行仿射变换

affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')

例子三(充电宝定位)

由于图片不是正的,导致测量比较麻烦

所以我们可以通过仿射变换,使得图像变正,就可以使用统一的直线测量线段了

dev_close_window ()
read_image (Image, 'C:/Users/xuheding/Desktop/图片/2.png')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 185, 247)
opening_rectangle1 (Regions, RegionOpening, 15, 15)
fill_up (RegionOpening, RegionFillUp)
* 最小外接矩形
shape_trans (RegionFillUp, RegionTrans, 'rectangle2')
* 获得角度
orientation_region (RegionTrans, Phi)
* 获得区域中心坐标
area_center (RegionTrans, Area, Row, Column)
* 获得仿射矩阵
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
* 仿射变换
affine_trans_image (GrayImage, ImageAffineTrans, HomMat2D, 'constant', 'false')

最后选择,助手->测量助手

绘制直线

设置参数后

点击代码生成

例子四(车牌定位)

将图像转为灰度图后,可以点击助手->OCR

1.先画ROI 2.输入希望读取的文本 3.点击字符是暗背景上的亮字符(因为这张图的缘故) 4.点击应用快速设置即可

1.首先读取图片,转为灰度图,然后阈值分割,开操作(去噪),计算连通域,选择特征形状

2.要排序 区域,因为后序要识别

3.载入ocr分类器(0到9,A到Z),进行预测(由于该分类器的原因,要输入黑字白底的,但是车牌是白字黑底的,所以要翻转一下,传入分类器中)

read_image (Image, 'C:/Users/xuheding/Desktop/图片/3.png')
rgb1_to_gray (Image, GrayImage)
dev_display (GrayImage)
threshold (Image, Regions, 100, 211)
opening_rectangle1 (Regions, RegionOpening, 3, 3)
connection (RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['width','height','rectangularity','column'], 'and', [0,35.78,0.20092,254.13], [63.3,71.01,0.59358,725.69])
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')
read_ocr_class_mlp ('DotPrint_0-9A-Z_NoRej.omc', OCRHandle)
invert_image (GrayImage, ImageInvert)
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)

可以看到 都识别到了

其他

测量助手使用

点击

可以通过绘制线段,检测直线

变换设置postive,选择黑到白的变化

设置negative则是,白到黑

设置all则是,都要

可以点击显示轮廓线,来显示轮廓


相关文章
|
7月前
三维手部关键点
三维手部关键点
|
6月前
|
算法 API 计算机视觉
图像处理之角点检测与亚像素角点定位
图像处理之角点检测与亚像素角点定位
77 1
|
7月前
|
存储 计算机视觉 流计算
【OpenCV】计算视频的光流并跟踪物体calcOpticalFlowPyrLK
【OpenCV】计算视频的光流并跟踪物体calcOpticalFlowPyrLK
312 0
|
7月前
|
算法 计算机视觉
基于表面法线法的二维人脸图构建三维人脸模型matlab仿真
该内容概述了一个使用MATLAB2022a的二维人脸图像三维重建算法。首先,通过人脸检测和对齐,然后运用深度信息估计技术(如Shape from Shading)获取表面法线。接着,结合预训练的三维人脸模型库和二维关键点,通过迭代优化和全局优化构建三维模型。核心程序涉及图像处理、光源方向转换、反射率和表面法线计算,最终重构高度图并显示结果。该方法依赖多视角图像,单幅图像重建可能存在挑战。
|
7月前
|
计算机视觉
OpenCV(二十七):图像距离变换
OpenCV(二十七):图像距离变换
74 0
|
7月前
|
资源调度 算法
[Halcon&测量] 一维测量
[Halcon&测量] 一维测量
230 0
[Halcon&测量] 一维测量
|
7月前
[Halcon&几何] 直线的垂线与延长线的计算
[Halcon&几何] 直线的垂线与延长线的计算
374 1
|
7月前
Halcon&测量] 模糊测量
Halcon&测量] 模糊测量
146 0
|
7月前
[Halcon&测量] 两线直线的角度测量
[Halcon&测量] 两线直线的角度测量
153 0
|
数据可视化 C++
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)