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则是,都要

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

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

  1. Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例

    Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例 一.基本概念 基本流程为: 获取图像 对图像进行灰度值标定 (针对相机获取的图像灰度和输入能量之间的非线性关系, ...

  2. Halcon学习笔记(五)几何定位+仿射+车牌识别

    定位 Blob分析 模板匹配 仿射 使用单位矩阵求仿射矩阵 示例:affine_trans_region.hdev 单位矩阵 hom_mat2d_identity (HomMat2DIdentity) ...

  3. Halcon基于形状的几何定位函数说明

    Halcon基于形状的几何定位函数说明 1. create_shape_model(Template: : //reduce_domain后的模板图像 NumLevels,//金字塔的层数,可设为&q ...

  4. Halcon 学习笔记八:颜色识别

    Halcon 学习笔记八:颜色识别 一.图像处理需要的知识 二.图像处理的预处理和分割过程 二.颜色识别的方法 三.例子一 四.例子二 五.例子三 一.图像处理需要的知识 1.图像处理基础(rgb(h ...

  5. Halcon学习笔记(三)---数据类型

    Halcon学习笔记(三)---数据类型 halcon只能在单独行进行注释,不能在语句后面进行注释. 1.tuple(元组,重数) 赋值符号":=" tuple算子: (1)变量定 ...

  6. Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)

    Halcon学习笔记:select_points_object_model_3d 3D对象模型阀值分割 This example program shows how to use the operat ...

  7. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  8. Halcon学习笔记:3D_coordinates(3D标定)

    Halcon学习笔记:3D_coordinates(3D标定) 欢迎有兴趣的朋友一起学习,代码理解注释有问题的可以告诉我,一起讨论,共同进步. *初始化程序,dev_close_window() *关 ...

  9. 一、HALCON学习笔记(容器液位缺陷检测)

    一.HALCON学习笔记(容器液位缺陷检测) * In this example a fill level check for the * pharmaceutical industry is dem ...

最新文章

  1. 浪漫的形式有100种,单身的就1种!
  2. rsyslog日志管理+LogAnalyzer
  3. vue 中的el表达式_Vue中vue.filter()的使用方法介绍(过滤)
  4. java 批量增删改_java使用JDBC连接mysql并且进行批量增删改操作
  5. 前端学习(2345):项目目录简单介绍
  6. c语言循环字符,字符串 非暴力for循环法(内附C语言代码)
  7. python如何输入多行数据合并_python 实现将txt文件多行合并为一行并将中间的空格去掉方法...
  8. hibernate 根据用户名获取用户对象_Mybatis 和 Hibernate 持久层框架之间的区别是啥?...
  9. 虚函数virtual
  10. 使用Pack200压缩你的代码
  11. Eclipse自动生成作者、日期注释等功能设置
  12. xna中的截屏操作处理
  13. 2012年参加油田象棋比赛的几盘棋
  14. PCI Geomatica 操作视频专辑
  15. 公司与公司保密协议范本
  16. vscode安装uweb_桌面应用|在Ubuntu中安装Visual Studio Code
  17. H5案例分享—你的数学是语文老师教的吗?
  18. 小学生能学计算机编程是什么,小学生为什么要学编程?小学生学习编程怎么样?...
  19. SafetyNet 漏洞rootutils 利用
  20. 嵌入式硬件开发基础(持续更新)

热门文章

  1. linux进程tty,linux下kill tty
  2. 200行代码如何实现人脸识别开锁应用?
  3. FFMPEG相关功能命令(转载)
  4. linux lts版本的区别,什么是Linux 发行版的 LTS 版本?
  5. 在Linux上安装Gearman及配置使用Gearman的PHP扩展环境
  6. 演讲比赛流程管理系统
  7. 01-AI矢量图和位图
  8. cas20205-29-2|2,3,3-三甲基-1-丙基-3H-吲哚碘|2,3,3-trimethyl-1-propylindol-1-ium,iodide齐岳生物
  9. echo 框架中的 middleware 设计深度解析
  10. 感量越大抑制频率约低_磁环抗干扰选择