Halcon 学习笔记3 仿射变换
像素的减少
开运算(较少)
腐蚀(去除更多)
对灰度图像的开运算或腐蚀 相当于将灰度图像变暗
像素增加
闭运算(较少)
膨胀(较多)
对灰度图像的闭运算或膨胀 相当于将灰度图像变亮
仿射变换
另外一种仿射变换
- * This example demonstrates an application from the pharmaceutical
- * industry. The task is to check the content of automatically filled
- * blisters. The first image (reference) is used to locate the chambers
- * within a blister shape as a reference model, which is then used to
- * realign the subsequent images along to this reference shape. Using
- * blob analysis the content of each chamber is segmented and finally
- * classified by a few shape features.
- *
- 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)
- *
- * In the first step, we create a pattern to cut out the chambers in the
- * subsequent blister images easily.
- access_channel (ImageOrig, Image1, 1)
- threshold (Image1, Region, 90, 255)
- shape_trans (Region, Blister, 'convex')
- orientation_region (Blister, Phi)//计算角度Phi
- area_center (Blister, Area1, Row, Column)//获取面积和中心点坐标
- *将原来的(Row, Column, Phi)表示为(Row, Column, 0),也就是将角度调正
- *输出变换矩阵HomMat2D
- vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
- affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')
- gen_empty_obj (Chambers)
- for I := 0 to 4 by 1
- Row := 88 + I * 70
- for J := 0 to 2 by 1
- Column := 163 + J * 150
- gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)
- concat_obj (Chambers, Rectangle, Chambers)
- endfor
- endfor
- affine_trans_region (Blister, Blister, HomMat2D, 'nearest_neighbor')
- difference (Blister, Chambers, Pattern)
- union1 (Chambers, ChambersUnion)
- orientation_region (Blister, PhiRef)
- PhiRef := rad(180) + PhiRef
- area_center (Blister, Area2, RowRef, ColumnRef)
- *
- *
- * Each image read will be aligned to this pattern and reduced to the area of interest,
- * which is the chambers of the blister
- Count := 6
- for Index := 1 to Count by 1
- read_image (Image, 'blister/blister_' + Index$'02')
- threshold (Image, Region, 90, 255)
- connection (Region, ConnectedRegions)
- select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 9999999)
- shape_trans (SelectedRegions, RegionTrans, 'convex')
- *
- * Align pattern along blister of image
- orientation_region (RegionTrans, Phi)
- area_center (RegionTrans, Area3, Row, Column)
- vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)
- affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')
- *
- * Segment pills
- reduce_domain (ImageAffineTrans, ChambersUnion, ImageReduced)
- decompose3 (ImageReduced, ImageR, ImageG, ImageB)
- var_threshold (ImageB, Region, 7, 7, 0.2, 2, 'dark')
- connection (Region, ConnectedRegions0)
- closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3)
- fill_up (ConnectedRegions, RegionFillUp)
- select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 1000, 99999)
- opening_circle (SelectedRegions, RegionOpening, 4.5)
- connection (RegionOpening, ConnectedRegions)
- select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
- shape_trans (SelectedRegions, Pills, 'convex')
- *
- * Classify segmentation results and display statistics
- count_obj (Chambers, Number)
- gen_empty_obj (WrongPill)
- gen_empty_obj (MissingPill)
- for I := 1 to Number by 1
- select_obj (Chambers, Chamber, I)
- intersection (Chamber, Pills, Pill)
- area_center (Pill, Area, Row1, Column1)
- if (Area > 0)
- min_max_gray (Pill, ImageB, 0, Min, Max, Range)
- if (Area < 3800 or Min < 60)
- concat_obj (WrongPill, Pill, WrongPill)
- endif
- else
- concat_obj (MissingPill, Chamber, MissingPill)
- endif
- endfor
- *
- dev_clear_window ()
- dev_display (ImageAffineTrans)
- dev_set_color ('forest green')
- count_obj (Pills, NumberP)
- count_obj (WrongPill, NumberWP)
- count_obj (MissingPill, NumberMP)
- dev_display (Pills)
- if (NumberMP > 0 or NumberWP > 0)
- disp_message (WindowHandle, 'Not OK', 'window', 12, 12 + 600, 'red', 'true')
- else
- disp_message (WindowHandle, 'OK', 'window', 12, 12 + 600, 'forest green', 'true')
- endif
- *
- Message := '# Correct pills: ' + (NumberP - NumberWP)
- Message[1] := '# Wrong pills : ' + NumberWP
- Message[2] := '# Missing pills: ' + NumberMP
- *
- Colors := gen_tuple_const(3,'black')
- if (NumberWP > 0)
- Colors[1] := 'red'
- endif
- if (NumberMP > 0)
- Colors[2] := 'red'
- endif
- disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')
- dev_set_color ('red')
- dev_display (WrongPill)
- dev_display (MissingPill)
- if (Index < Count)
- disp_continue_message (WindowHandle, 'black', 'true')
- endif
- stop ()
- endfor
仿射变换 理论
https://www.cnblogs.com/liekkas0626/p/5238564.html
Halcon 学习笔记3 仿射变换的更多相关文章
- Halcon学习笔记之支持向量机(二)
例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可 ...
- Halcon学习笔记之支持向量机(一)
例程:class_overlap_svm.hdev 说明:这个例程展示了如何用一个支持向量机来给一幅二维的图像进行分类.使用二维数据的原因是因为它可以很容易地联想成为区域和图像.本例程中使用了三个互相 ...
- halcon学习笔记——机器视觉工程应用的开发思路【转】
转自:http://www.cnblogs.com/hanzhaoxin/archive/2013/02/15/2912879.html 机器视觉工程应用主要可划分为硬件和软件两大部分. 硬件:工程应 ...
- Halcon学习笔记——条形码的定位与识别
一维码的原理与结构 条码基本原理是利用条纹和间隔或宽窄条纹(间隔)构成二进制的”0“和”1“,反映的是某种信息. 一维条码数据结构,分四个区域.组成分别为静区.起始/终止符.校验符.数据符. 一维条码 ...
- Halcon学习笔记——机器视觉应用工程开发思路及相机标定
机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分,硬件部分和软件部分. 1.硬件部分,硬件的选型至关重要,决定了后续工作是否可以正常开展,其中关键硬件部分包括:光源,相机以及镜头. 2. ...
- Halcon学习笔记1
转:https://www.cnblogs.com/hanzhaoxin/archive/2013/02/15/2912879.html 机器视觉工程应用主要可划分为硬件和软件两大部分. 硬件:工程应 ...
- halcon学习笔记——(11)Image,region,xld初步
一 读取的3种方式: 读取单张的图片: read_image( image,'filename') //image 是输出对象,后面是输入文件的路径和名称 读取多图: 1,申明一个数组,分别保存路径 ...
- Halcon学习笔记之缺陷检测(二)
例程:detect_indent_fft.hdev 说明:这个程序展示了如何利用快速傅里叶变换(FFT)对塑料制品的表面进行目标(缺陷)的检测,大致分为三步: 首先,我们用高斯滤波器构造一个合适的滤波 ...
- Halcon学习笔记之缺陷检测(一)
例程:surface_scratch.hdev 说明:这个程序利用局部阈值和形态学处理提取表面划痕 代码中绿色部分为个人理解和注释,其余为例程中原有代码 *surface_scratch.hdev:e ...
随机推荐
- 洛谷 P3369 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...
- 1126: [POI2008]Uci
1126: [POI2008]Uci https://lydsy.com/JudgeOnline/problem.php?id=1126 分析: dp.状态很妙,就是有点难写. 能走的是一个矩形.首先 ...
- sqlserver2008 数据库
删除数据库提示: 无法对 数据库'DBName' 执行 删除,因为它正用于复制 之前建立过此数据库的发布订阅,但是后来删掉了发布订阅,也将对应的作业停止了,仍然报这个错,遂用此命令强制删除发布: sp ...
- C#特性的简单介绍
特性应该我们大多接触过,比喻经常使用的[Obsolete],[Serializable]等下面我就主要介绍一个特性的一些用法 摘自MSDN定义:用以将元数据或声明信息与代码(程序集.类型.方法.属性等 ...
- java生成pdf
介绍 本篇博客主要是为了介绍如何使用:flying-saucer+itext+freemark实现导出复杂点的pdf文件. 思路 先把pdf的内容以html形式准备好 使用freemarker将htm ...
- Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息
目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...
- 180719-Quick-Task 动态脚本支持框架之使用介绍篇
文章链接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-动态脚本支持框架之使用介绍篇/ Quick-Task 动态脚本 ...
- 04-容器 What, Why, How
What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行.开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机 ...
- windows下Mysql安装启动及常用操作
1.下载mysql https://dev.mysql.com/downloads/ 2.配置环境变量 变量名:MYSQL_HOME 变量值:E:\MySql\mysql-8.0.15-winx64\ ...
- Java实现网上商城
// 第一个JavaWeb项目 //练手项目没有使用框架 github下载 https://github.com/dejavudwh/Online-Shopping 项目截图 1.基本实现了购物网站该 ...