转自:http://qing.blog.sina.com.cn/2316220871/8a0eb9c733002rnq.html

detect_brochure_pages.hdev

*这个例子主要描述了从图片库中寻找有相应页面的那一页
*第一步中,不同的纸张页面用来做训练,最后创建好model
*第二步,在未知的页面图片中来搜索,找出正确的那一页
dev_update_off()
dev_close_window()
read_image(Image, '...')
get_image_size(Image, Width, Height)
...
clear_all_descriptor_models()
把存储器中所有的descriptor模型清除,释放空间
*定义变量:
ModelIDs :=[]
ModelsFound :=0
NumPoints :=[]
NumModels:= 3
TotalTime :=0
*创建用来观察的region
RowRoi :=[10, 10, Height-10, Height-10]
ColRoi := [10, Width-10, Width-10, 10]
gen_rectangle1(Rectangle, 10, 10, Height-10, Width-10)
disp....
stop()
(1)第一步,为每个page创建一个描述模型descriptor model
for Index :=1 to NumModels by 1
read_image(Image, ' brochure/brochure_page_'+Index$'.2')
rgb1_to_gray(Image, ImageGray)
get_image_size(ImageGray,Width, Height)
reduce_domain(ImageGray, Rectangle, ImageReduced)
disp.......
*使用默认参数创建描述模型descriptor model,尺度参数需要自定义,这里为了加速搜索过*程,兴趣点检测方式使用harris binomial point detector
count_seconds(Second1)
create_uncalib_descriptor_model(ImageReduced, 'harris_binomal',[], [], ['min_rot', 'max_rot', 'min_scale', 'max_scale' ],[-90, 90 , 0.2, 1.1], 42, ModelID)
*/create_uncalib_descriptor_model(Template : : DetectorType,DetectorParamName, DetectorParamValue, DescriptorParamName,DescriptorParamValue, Seed : ModelID)
创建一个描述模型descriptor model来描述一张图片,和deformable model区别是没有用图面金字塔来进行整体匹配,而是针对一个个兴趣点进行匹配,所以创建描述模型的过程主要有两步,第一是利用参数中DetectorType给定的检测方式来检测出兴趣点,第二部是根据兴趣点的位置以及其周边点的关系,灰度值来建立descriptor描述器,用来描述相应兴趣点,创建方式根据DescriptorType种类不同而有所区别。(注意这里是uncalib属性,代表不需要使用有矫正标定功能的相机)
seed参数生成随机数,用来使建立的描述器具有随机性,默认42.
在创建了模型之后,可以使用find_uncalib_descriptor_model来搜索出包括平面的和立体的仿射变换后的模型。返回转换矩阵。/*
count_seconds(Second2)
TotalTime :=TotalTime+(Second2-Second1)
disp......
*为了能够正确的映射模型,在进行搜索前必须先标定一个转换的参照点 ,这里描述模型*descriptor model的中心点为参照点
set_descriptor_model_orgin(ModelID, -Height/2, -Width/2)
*/set_descriptor_model_origin( : : ModelID, Row, Column : )
为descriptor 模型设置原点(参照点)
描述:参照点 通常和创建模型时候(create_uncalib_descriptor_model, orcreate_calib_descriptor_model)使用的region输入的重力中心点相关,参数的设定即表示相对于重力中心点的位移,eg:一个原点是(-20,-10)表示这个原点在重力中心点的左上角。
         在设定了参照点之后,使用find_uncalib_descriptor_modeland find_calib_descriptor_model来搜索模型的形态和转换信息 
注意:这里设置的参照点是属于模型的一部分,是模型的一个属性/*ModelIDs :=[ModelIDs, ModelID] 把生成的modelID存入数组/*

*存储生成的模型中的兴趣点
get_descriptor_model_points(ModelID, 'model', 'all', Row_D, Col_D)
*/get_descriptor_model_points( : : ModelID, Set, Subset : Row, Column)
Set可以控制是取出模型中的兴趣点还是上一次搜索的图片中的兴趣点,subset表示取出几个点,默认为‘all'(这里用all也会比较慢,可以考虑选取其他数值),后两个参数是输出,保存了这些点的信息。
Subset : 每个如果是搜索的话,每个正确的匹配的兴趣点是所有兴趣点的一个子集/*
NumPoints :=[NumPoints, |Row_D|]
endfor   
到此,模型的创建工作结束
(2)第二步, 搜寻工作        
*因为图片大小的改变,应该先重新初始化窗体      
read_image(Image, 'bro.....01')
dev_resize_window_fit_image(Image, 0,0,-1,-1)
set_display_frnt
*再循环中搜索模型(遍历所有图片)
for Index1: = 1 to 12 by 1           一共有12张图片
OutputString: =[]
NumMsgs:=0
ModelsFound :=0
TotalTime:=0
read_image(Image, 'brochure/brochure_'+Index1$'.2')
rgb1_to_gray(Image, ImageGray)
display image and message......
*搜索, 在一张图片中逐个的搜索所有模型
for Index2 := 0 to |ModelIDs| -1 by 1
count_seconds(Seconds1)
find_uncalib_descriptor_model(ImageGray, ModelIDs[Index2], 'threshold', 800,  ['min_score_descr', 'guided_matching'], [0.003, 'on'], 0.25, 1, 'num_points', HomMat2D, Score)
find_uncalib_descriptor_model(Image : : ModelID, DetectorParamName,DetectorParamValue, DescriptorParamName, DescriptorParamValue,MinScore, NumMatches, ScoreType : HomMat2D, Score(最后两个是操作的输出,其他均为输入))
*/描述:寻找描述模型,DetectorParamName和DescriptorParamName应该与创建模型时候相同。
MinScore:当Score超过MinScore时候,这个匹配才被接受。
对于每一个接受的匹配,都会产生一个3x3的矩阵HomMat2D用来描述转换。当一张图片中有多个匹配被接受的时候,单应性转换矩阵会串行的保存在tuple中。(应该是很多3x3矩阵串行保存)匹配的个数等于 
                                      NumOfMatch =|HomMat2D|/9
NumMatches:用来限制匹配的个数,最多有几个,选择最优的
ScoreType: 可以选择匹配的点的个数或者是相关点的半径两种来表示匹配的优劣程度
所以,这里的Score并不是一个0到1的值,而是一个可能比较大的整数/*
count_seconds(Seconds2)
Time:= Seconds2-Seconds1
TotalTime := TotalTime+Time
*检测搜索结果是否满足匹配标准,这里利用Score来比较
if ((|HomMat2D|>0) and (Score>NumPoints[Index2] / 4)
(注意这里的NumPoints指的是生成模型时候,对应的兴趣点的个数)
get_descriptor_model_points(ModelIDs[Index2], 'search', 0, Row, Col)
取出上一次搜索的兴趣点,取出第0个匹配的兴趣点(每个匹配都是所有兴趣点的一个子集)
gen_cross_contour_xld(Cross, Row, Col, 6, 0.785398)    
*/gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : )       
根据给出的坐标生成十字星形状的边界/*
*映射变换,把ROI和点进行投影转换, 首先是ROI区域Region
projective_trans_region(Rectangle, TransRegion, HomMat2D, 'bilinear')
*/projective_trans_region(Regions : TransRegions : HomMat2D, Interpolation : )/*
*接下来投影点(这里指的是一开始就给出了定义的RowRoi :=[10, 10, Height-10, Height-*10]和ColRoi := [10, Width-10, Width-10, 10])
projective_trans_pixel(HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans)    
*/projective_trans_pixel( : : HomMat2D, Row, Col : RowTrans, ColTrans)
对给定的Row,Col进行转换,保存到RowTrans,ColTrans中
这里对这几个固定的点进行转换,是为了计算ROI区域偏转的角度,详细见下面Angle_ll的解释/*

angle_ll(RowTrans[2], ColTrans[2],RowTrans[1],ColTrans[1], RowTrans[1],ColTrans[1], RowTrans[0], ColTrans[0], Angle)
*/angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle)
计算两条线的角度,第一条线 (RowA1,ColumnA1, RowA2,ColumnA2)和第二条线 (RowB1,ColumnB1, RowB2,ColumnB2) ,其中,A1,B1是起点。
这里用于计算矩形区域的两条边之间的角度(不平行边)
注意这里的返回值Angle:是弧度形式Radians, 它的范围在-pi到pi之间/*

Angle := deg(Angle)      把弧度转换成角度,这里是吧1.77...转化为101... 
*/deg等价于弧度  (R/2pi)*360/*

*接下来通过if语句检测这个角度是否可能
if (Angle>70 and Angle<110)
area_center(TransRegion, Area, Row, Column)
如果满足条件,则找到一个匹配
ModelsFound :=ModelsFound +1
。。。。设置显示。。。。
endif
endif
endfor

.......

(3)第三步,清除存储空间
for Index := 0 to |ModelIDs| -1 by 1
            clear_descriptor_model(ModelIDs[Index])
endfor

总结:

1,清除模型释放空间, clear_all_descriptor_models()

2,为每个page创建一个描述模型 create_uncalib_descriptor_model

3,为每个模型设置对应的参照点  set_descriptor_model_orgin

4,存储生成的模型中的兴趣点 get_descriptor_model_points   (model)

5,再循环中搜索模型 find_uncalib_descriptor_model

6,获取搜索到的兴趣点 get_descriptor_model_points    (search)完成匹配

7,通过计算转换后的角度来确定这个匹配是否可信 angle_ll

halcon例子学习matching书页匹配相关推荐

  1. halcon例子学习matching路牌

    转自:http://qing.blog.sina.com.cn/2316220871/8a0eb9c733002r6d.html detect_road_signs.hdev *这个例子展示了汽车工业 ...

  2. matching书页匹配例子

    detect_brochure_pages.hdev *这个例子主要描述了从图片库中寻找有相应页面的那一页 *第一步中,不同的纸张页面用来做训练,最后创建好model *第二步,在未知的页面图片中来搜 ...

  3. Halcon 算子一 Halcon中Matching图形匹配

    Halcon中Matching图形匹配 图像 步骤 Halcon 算子 Halcon 进阶 一 C#实现Halcon中Matching图形匹配 图像 步骤 打开matching助手 选择从图像创建,模 ...

  4. Halcon例程学习:print_check.hev(光学字符检测)

    **************************************************************************************************** ...

  5. HALCON基于形变的模板匹配实现

    基于形变的模板匹配 先看匹配结果: 下面是HALCON的代码,用匹配助手生成的,现在得到的就是模板上61个点的坐标,还有仿射矩阵,利用仿射矩阵可以算出61个点匹配上的像素坐标. * * Matchin ...

  6. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  7. Halcon算子学习:图像阈值分割-threshold、binary_threshold、dyn_threshold算子

    Halcon算子学习:图像阈值分割算子 前言 1.threshold-全局固定阈值分割 2.Binary Threshold-自动全局阈值分割 3.dyn_threshold-局部动态阈值分割 小结: ...

  8. osgEarth例子学习-feature_elevation.earth

    例子学习第一天 今天是2019年2.26,接下来的一段时间开始研究关于在osgEarth中地形整(压平)的事儿,最后的应用就是开路,在osgEarth地球的表面,比如山上能自动生成道路之类的. 首先看 ...

  9. Halcon 深度学习之水果分类

    前言 想要顺利跑通18版本的深度学习,需要三个条件. 1.需要一张支持GPU加速的显卡(18版本不支持CPU训练). 2.配置深度学习环境(这个相对于Caffe.Tenserflow.Pytorch环 ...

最新文章

  1. 【廖雪峰python入门笔记】列表生成式
  2. TP5部署服务器问题总结
  3. 越南qq飞车服务器不稳定,qq飞车帧数不稳定,有时候玩的很顺,有时候画面一顿一顿,帧数不稳,怎么处理?...
  4. 计算机专业2016高考录取分数线,中国科学院大学计算机科学与技术专业2016年在江苏理科高考录取最低分数线...
  5. java系统系统异常处理,银行系统(Java)异常处理
  6. Dotnet的局部函数和委托的对比
  7. ASP.NET MVC教程五:ASP.NET MVC中的路由
  8. 微信小程序开发的游戏《拼图游戏》
  9. python有什么用-python有什么用(用处和用途)
  10. 查看mysql表和数据库的大小
  11. 公众号开发 单独 给某个用户 推送消息_校区学生会微信公众平台征稿启事
  12. Android sdk下载安装配置教程
  13. 局域网聊天程序 java MySQL_局域网聊天软件设计与实现(Linux,C++,MySQL)
  14. HG6543C1(1) --- 电信宽带天翼网关
  15. MapBox本地化部署
  16. ITIL 4Foundation认证
  17. 【2022应届生的入职感悟】
  18. NCBI参考序列RefSeq
  19. unixbench分析_UnixBench,Bench,SuperBench 和 Zbench 四种常用云服务器综合性能测评脚本工具的对比分析以及使用教程...
  20. minst手写数字识别(带界面)

热门文章

  1. (基于安卓app开发毕业设计)上课考勤管理(附源码+论文)
  2. 警察局里的专业人像摄影
  3. 巧学活用html4,巧学活用HTML4
  4. hadoop的find
  5. 把彩色照片变素描照片.很漂亮哦
  6. 9款日志采集和管理工具对比,选型必备!
  7. python编写个人信息_Personalinformation
  8. progressdialog进度框_ProgressDialog进度对话框
  9. Jetpack-Compose 学习笔记(六)——Compose 主题 Theme 一探究竟,换肤还能如此 Easy Silky?
  10. 第三章面向对象编程思想