标志识别之AprilTag3

AprilTag2在速度上是不尽人意的,原因在于梯度计算和聚类的庞大计算和内存开销。在AprilTag3中进行了多项优化,不仅算法更加鲁棒,时间和内存开销大幅减小,更支持了全新格式的二维码。粗看了下,主要做了几点优化:查找矩形前,通过一种新的二值化方法,直接在二值图上查找(这样带来的风险就是二值化失败,矩形形状被破坏,就无法检测到),在查找四边形时,在并查集搜索时提前截断,比起AprilTag2少了许多不必要的搜索。

另外,在构建AprilTag3时和AprilTag2不同,在windows下构建需要自己配置windows下的pthread库,在Linux用gcc构建时,Tag.c文件中有许多大数组,gcc对这类数组编译非常非常慢。AprilTag3也被集成在了VISP中作为一个模块使用,总之AprilTag3使用起来还是非常容易的,AprilTag这种二维码在定位查找方面还是非常有用的,简单记录一下。…

机器视觉中的光源与打光

机器视觉主要解决四大问题:定位、测量、检测、识别。在机器视觉中打光和光源影响着系统的稳定性,比如在测量应用中,光照发生10%-20%的变化,就可能导致图像边缘偏移1-2个像素,这些问题在算法层面是不容易解决的。所以了解光源和打光非常重要…

图像中直线的检测

检测图像中的直线,在图像处理中一直非常有用,这篇博客将主要介绍博主接触过的几种检测直线的方法。主要包括最小二乘法拟合直线、Ransac拟合直线、LSD线段检测、Hough变换检测直线。…

聊聊条码与二维码检测算法的优化

条码和二维码搞了许久,之前在做二维码识别的优化,想能搞出多少花来呢?最近需要在极小的内存下完成二维码的识别和解码。顿时头大了,不过锅刚刚解了,就来说一说。

条码和二维码的特点就是我们前处理之后,都是处理的二值图像。那么在二值图像上操作有什么好方法呢?不卖关子,说出答案了:游程编码。…

图像游程编码的腐蚀与膨胀操作

最近英语课上聊到了互联网兴起以来,交流方式的变化,博客是互联网最早的形式之一,已经相当老了,现在的交流变得更加简短,与微博和朋友圈不到一百字的简短相比,博客是相当长的了。可能是现代人太吝啬自己时间了,写博客的人越来越少,并且博客质量下降,得益于信息的快速传播,也出现了天下文章一大抄的现象。不过我想,还是有些东西需要实实在在的篇幅来沉淀的,于是想起有还有坑没有填,就快点过来把坑填完了。

通常我们使用游程编码的原因是因为游程编码更快,并且更加节省内存,游程编码可以做很多事情,其中就包括形态学操作,这篇博客将详细介绍在游程编码上实现形态学操作。…

基于AprilTag+OpenCV4的QRCode二维码检测

这部门内容是博主的个人笔记,没有代码,只有思路,也不公开代码。

QRCode二维码的关键是三个定位点的获取,我们借助AprilTag,解码部分的算法和ZXing相同(实践证明非常鲁棒)。…

SVD分解与最小二乘

做个小笔记,我们常常用SVD来解最小二乘问题,原理是什么呢?如果学过矩阵的广义逆,那么我们很容易知道,就贴一张图吧,然后留各链接,详细的参见链接了。参考链接。…

基于惯量矩的椭圆拟合方法

上一篇博客是《基于最小二乘法的椭圆拟合》,这篇博客介绍另外一种方法。由于现在正处在人生的特(工)殊(作)时(太)刻(忙),所以没怎么写,主要还是贴论文。

不同于最小二乘法直接拟合椭圆方程,论文中通过惯量矩,来预测角度、长轴、短轴,结合中心,来计算得到椭圆参数。实际工程实践中采用游程编码表示区域,该方法亦是Halcon中计算区域等效椭圆的方法,详看论文,谢谢。…

最小二乘法拟合圆和椭圆

这篇文章是 least-squares fitting of circles and ellipses 这篇paper的导读。我们如何使用最小二乘法去拟合圆和椭圆呢,当我们用“代数方程”来表示圆时,我们最小化这个目标函数的实际意义是什么呢?我们按照这个方程得到的结果却不一定是合适的。我们实际上想要的是实际中每个点,到该曲线上的距离最小。

于是,我们按照一个“几何方程”来进行构造。这个几何方程描述的优化方向是,每个点到曲线的距离最小。我们使用雅可比矩阵QR分解来解算圆的参数,对于椭圆参数,存在更多情况,看Paper吧:…

【简记】基于梯度的优化:Jacobian和Hessian

工作之后时间越来越少,也在思考繁忙之下自己是否仍对技术拥有热情。答案是肯定的,并且,身处这个行业,也是需要不断学习的,积少成多,滴水穿石。之前写博客,或多或少想分享些有用的东西,现在环境的改变已经使得这些越发困难了,但是仍可以通过博客记录自己学习和成长的脚步。以下是来自繁忙生活中一份简简单单的笔记:

Jacobian矩阵包含了我们需要计算输出和输入的所有偏导数,这样的矩阵被称为Jacobian矩阵。

或许我们只对其中的二阶导数感兴趣,或许因为高阶导数计算量过大,所以我们使用Hessian矩阵,该矩阵包含了一个函数的所有二阶导数。…

图像配准的常用方法

图像配准的方法大致分为三类,一类是基于灰度和模板的,这类方法直接采用相关运算等方式计算相关值来寻求最佳匹配位置,方法简单较为死板,一般效果不会太好。第二类是基于特征的匹配方法,如sift、surf点特征,或者向量特征等等,适应性较强。第三类是基于域变换的方法,采用相位相关(傅里叶-梅林变换)或者沃尔什变换、小波等方法,在新的域下进行配准。

我之前的博客介绍过傅里叶-梅林变换进行图像配准,其实也就是基于相位相关的原理,结合对数-极坐标变换进行图像配准,并给出了源码。这篇博客是对以上三类方法的小总结,无源码,都是废话,见谅。…

OpenCV特征点提取算法对比

除了我们熟知的SIFT、SURF、ORB等特征点提取算法,OpenCV中还提供了十余种特征点提取算法。最近在整理以往的ppt和报告,看到其中一页ppt,发现已经忘得差不多了,就再写篇博客复习下好了,这篇博客注重对比,技术方面的内容不会太过细致,希望能有帮助。当然,文章末尾会提供这些算法OpenCV调用的实例代码。
首先,引发内容的就是下面这张ppt:(不要注意Why Surf了,当时根据具体应用场景所做的选择)左边一栏是特征点的数目,右边一栏是检测的速度,数据是在博主自己的测试集(大概四五百张图片)上测试的。…

动画制作:MATLAB制作gif,PhotoShop制作gif

        gif动画易于制作,相对于视频更小,更易于传播。作为一个程序猿,在使用程序绘图过程中想生成gif动画,可以使用MATLAB生成。当然,MATLAB生成gif动画存在局限性,专业的PhotoShop可以满足你的需要,这篇博客将专门介绍gif动画的制作。…

Matlab使用interp2裁剪倾斜(旋转)矩形块

        在图像处理中,我们常常需要裁剪出图像中的一个矩形块,matlab提供的imcrop函数可以裁剪出矩形块,但是如果我们想裁剪倾斜的矩形块,该函数将无能为力。于是博主贡献了自己的代码。…

傅里叶-梅林变换进行图像配准

        图像配准方法主要分为三类:一种是灰度方法信息方法,另一种是基于特征的方法,可细分为特征点、直线段、边缘轮廓、特征结构以及矩不变统计特征等,还有一种就是基于变换域的方法,如相位相关、Walsh Transform等方法。傅里叶-梅林变换就是一种变换域的方法。

        在图像配准过程中,常常需要处理平移、旋转、尺度变换、遮挡、形变等问题,使用傅里叶-梅林变换可以很好的应对平移、平面内旋转、缩放和遮挡,是一种鲁棒性较强的方法。这篇博客讲详细介绍傅里叶-梅林变换的性质,以及其在图像配准过程中的应用。…

OpenCV实现Census变换

census        在立体视觉中,常常用到Census变换,Census变换是一种非参数局部变换,其将周围像素的强度映射到一个比特穿,从而捕获图像的结构。同时使用Census变换可以减少由相机增益和偏置引起变化的影响。在立体匹配过程中,将图像做Census变换后,计算像素点之间的明式距离进行匹配,可以得到较好的效果。

        这篇博客主要介绍介绍实现Census变换,由于使用OpenCV的容器和接口,所以直接使用OpenCV调用比较方便。…

Matlab使用vision.TextInserter在图像中嵌入字符

        使用Matlab处理图像的时候,如果需要将文字或者图形嵌入图像中,就需要用到vision工具集了,如果嵌入的是文字,那么就要使用vision.TextInserter,这个在新版本的Matlab中提供了insertText函数,与其功能差不多,不过vision.TextInserter要强大一些,insertText可以修改文字背景色块但是不能修改字体。…