Halcon图像拼接-算法速度优化
参考例程mosaicking_pyramid.hdev
原理简要说明:在上一篇的基础上,我们知道了在halcon中,图像拼接的大致原理,知道了算法运行的过程,其中一个关键步骤至关重要,那就是找角点。我们知道,在halcon中我们使用的harris算法来检测角点,这里涉及到一个问题,我们是全图遍历的方式来检测角点的,那么当一个图像过大时,相应的检测时间就要增加,再加上匹配,那总时间就是指数级的增长。
对于上述现象的解决办法,在halcon中的例程中也给出了方向,在讲解之前,我们先回忆一下,模板匹配中金字塔的作用,利用金字塔这个特性,可以让我们全图遍历的效率高出很多,即先在高层金字塔处找到匹配的点,因为在高层分辨率低,所以匹配速度不会慢,找到后,逐级递减往下,虽然分辨率越来越高,但是模板大致区域也被确定,那么我们就不用全图遍历了,只去遍历上一层确定的点即可;
对于检测角点这种需要全图遍历的活,我们也可以采用金字塔的特性,而halcon中也有这样的例子,大致原理就是,先在高等级的图像对中查找角点并进行匹配,那么这个时候会得到一个投影矩阵,将这个投影矩阵应用到下一级金字塔的图像对中,来限定查找范围(DistanceTolerance),这样就可以做到优化速度
1读取拍摄图像
跳过,详情见上篇,此处只对两张图像进行拼接
2定义图像对
跳过,详情见上篇,此处只对两张图像进行拼接
3算法流程
该例程中算法全部都在proj_match_points_ransac_guided这个函数中
1取图像的各个等级金字塔图像
ImageF,ImageT分别对应图像对的两张图像
gen_gauss_pyramid (ImageF, ImageFPyramid, 'constant', 0.5)
gen_gauss_pyramid (ImageT, ImageTPyramid, 'constant', 0.5)
2在循环中寻找角点做匹配,并且逐次递减金字塔等级
for Level := NumLevels to 1 by -1*从高到低选择图像进行角点检测* Select images from image pyramidselect_obj (ImageFPyramid, ImageFLevel, Level)select_obj (ImageTPyramid, ImageTLevel, Level)* Extract interest points in both images*检测角点points_harris (ImageFLevel, SigmaGrad, SigmaSmooth, Alpha, Threshold, RowsF, ColsF)points_harris (ImageTLevel, SigmaGrad, SigmaSmooth, Alpha, Threshold, RowsT, ColsT)* Calculate projection from point correspondences*如果是第一次,也就是最上层的图像,那么使用默认的ransac算法来进行角点匹配if (|HomMat2DGuide| == 0)* On the highest pyramid level, use proj_mathc_points_ransacget_image_size (ImageFLevel, Width, Height)proj_match_points_ransac (ImageFLevel, ImageTLevel, RowsF, ColsF, RowsT, ColsT, 'ncc',\10, 0, 0, Height, Width, [rad(-40),rad(40)], 0.5, 'gold_standard',\2.5 * pow(2,4 - Level), 42, ProjMatrix, Points1, Points2)else*如果不是第一次,即有了上一等级图像的角点投影关系,利用ransac推导算法来进行角点匹配*DistanceTolerance=10 * pow(2.0,4.0 - Level)是随着等级不断递减,图像分辨率越来越高的情况下,\角点在高等级图像和低等级图像之间的容差值,不好理解就理解成角点的搜索窗口,太大就会找错,并且耗时*DistanceThreshold=2.5 * pow(2.0,4.0 - Level)是投影变换矩阵预测的点与实际找到的角点之间的距离,在此距离内*才会被认为是匹配的角点,太大就会找错* On lower levels, use approximation from upper level as* input for proj_match_points_ransac_guidedproj_match_points_ransac_guided (ImageFLevel, ImageTLevel, RowsF, ColsF, RowsT, \ColsT, 'ncc', 10, HomMat2DGuide, 10 * pow(2.0,4.0 - Level),\0.5, 'gold_standard', 2.5 * pow(2.0,4.0 - Level), 42, \ProjMatrix, Points1, Points2)endif*在匹配的角点之间进行刚体变换if (UseRigidTransformation)* Use found point correspondences to calculate rigid transformation* with vector_to_rigid* Note, that the resulting transformation of proj_match_points_ransac_guided* is ignored in this case.RowF := subset(RowsF,Points1)ColF := subset(ColsF,Points1)RowT := subset(RowsT,Points2)ColT := subset(ColsT,Points2)vector_to_rigid (RowF + 0.5, ColF + 0.5, RowT + 0.5, ColT + 0.5, ProjMatrix)ProjMatrix := [ProjMatrix,0,0,1]endif* To be used on the next lower pyramid level, the projection has* to be adjusted to the new scale.* 对于给下一级金字塔的图像的投影矩阵,Tx,Ty需要进行乘2(因为下一级图像放大了一倍),其他项不用hom_mat2d_scale (ProjMatrix, 2, 2, 0, 0, HomMat2DGuide)hom_mat2d_scale_local (HomMat2DGuide, 0.5, 0.5, HomMat2DGuide)
endfor
对于最后的两个矩阵缩放,原理如下
hom_mat2d_scale 是缩放矩阵中所有项
hom_mat2d_scale_local 是缩放除Tx©和Ty(f)的其他所有项
最后的这两句代码不一定这样写,只要达到缩放Tx©和Ty(f)的效果而其他不变的结果即可
4图像拼接
gen_projective_mosaic (Images, MosaicImage, 1, From, To, ProjMatrix, [2,1], 'false', MosaicMatrices2D)
5结果演示
可以看到,在以不同等级的金字塔图像开始后,角点匹配的速度被优化了
从原来的原图像(1级金字塔)匹配需要2.42s,到4级金字塔只需要0.0773s,当然,不是金字塔越高越好,根据图像分辨率和角点分布来确定,例程中生成了9层,但是在进行匹配的时候只用到了1~4层,因为后面的图像太过模糊,进行匹配没意义
制作不易,觉得帮到了您,还请点个赞
另外,若觉得本文写的与您理解的有些出入,欢迎交流
Halcon图像拼接-算法速度优化相关推荐
- 图像缩放算法及速度优化
原文来自:博客园 小欣子 图像缩放算法及速度优化--(一)最近邻插值 图像缩放算法及速度优化--(二)双线性插值 --------------------以下为原文------------------ ...
- 近邻取样插值和其速度优化
本文的主要内容转载自博客 <图像缩放算法 >或<图形图像处理-之-高质量的快速的图像缩放 上篇 近邻取样插值和其速度优化>,将其中的代码改写在自己的机器上进行实际测试,从而更加 ...
- 动态规划算法的优化技巧
动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化.全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因 ...
- louvian算法 缺点 优化_机器学习中的优化算法(1)-优化算法重要性,SGD,Momentum(附Python示例)...
本系列文章已转至 机器学习的优化器zhuanlan.zhihu.com 优化算法在机器学习中扮演着至关重要的角色,了解常用的优化算法对于机器学习爱好者和从业者有着重要的意义. 这系列文章先讲述优化算 ...
- GEMM算法及优化流程详解
目录 前言 im2col+GEMM算法简介 GEMM算法优化 optimize1 optimize2 optimize3 前言 神经网络前向耗时主要由卷积的耗时决定,参考賈杨青毕业论文,那么如何对卷积 ...
- 最短路的几种算法及其优化(模板)
一.Dijkstra 算法 dijkstra算法适用于边权为正的情况,求单源最短路,适用于有向图和无向图 模板伪代码: 清除所有点的标号 设d[0]=0,其余d[i]=INF: 循环n次{ 在所有未标 ...
- H.264算法的优化策略
文章来源: http://www.tichinese.com/Article/Video/200909/2150.html 编辑:小乙哥 1 代码优化的主要方法 通过代码移植能够获得在DSP上初步运行 ...
- Android开发——H5容器加载速度优化方案
1. 背景介绍 在偏重活动运营的电商App中,受制于App版本审核,具备开发周期短.可灵活发布等特点的H5页面受到青睐,承载了很多重要业务.但App Webview存在令人烦恼的性能问题,特别突出的是 ...
- 嵌入式算法移植优化学习笔记5——CPU,GPU,TPU,NPU都是什么
嵌入式算法移植优化学习笔记5--CPU,GPU,TPU,NPU都是什么 一.什么是CPU? 二.什么是GPU? 三.什么是NPU? 四.什么是TPU? 附: 随着AI的广泛应用,深度学习已成为当前AI ...
最新文章
- FileReader对象和FormData对象
- SpringMVC响应Restful风格请求404
- 吴恩达 coursera ML 第三课总结
- USTC English Club Note20171023
- 详解京东商城智能对话系统(生成+检索)
- din算法 代码_深度兴趣网络(DIN,Deep Interest Network)
- java utf8 byte_byte以及UTF-8的转码规则
- LeetCode 1504. 统计全 1 子矩形(记录左侧的连续1的个数)
- array_agg_探索强大SQL模式:ARRAY_AGG,STRUCT和UNNEST
- (54)Verilog HDL下升沿采样
- AWS 创业背后,竟是“被迫无奈”?
- C# EF 与 MySql 的那些坑
- 学生选课系统代码--分析1
- Vue-计算属性与事件监听
- socket编程学习笔记:关于TCP Test Tool的安装和使用
- MAC前端开发环境搭建
- SAP - MM - 第3篇 - 供应商主数据
- 浏览器主页被劫持篡改为hao123或者别的网页解决方法
- java web应用开发期末考试_JavaWeb期末考试A卷
- 增强现实入门实战,使用ArUco标记实现增强现实
热门文章
- Wireshark The capture session could not be initiated on interface报错解决
- “5g+工业互联网”,工业生产制造迎来新突破
- 一文看懂预训练模型最新进展
- prometheus入门实例
- 机器学习实战-手写识别系统
- health_parent的linux环境
- SpringSocial 开发 QQ 登录
- Java实现接口(打印机)
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。
- java中boot是什么,Spring boot是什么