简介:最近研究了一下二维码的定位与解码,看了很多大神的博客文章,现在将总结的方法与心得体会写在博客中。源程序见本博客的最下方。
一、二维码的结构
通过很多博客文章的介绍,我们可以知道二维码有三个匹配模式区域,又叫PositionDetectionPattern。这三个区域位于二维码的三个顶点(下图中左下、左上、右上顶点)。与大多数方法类似,我们也是通过寻找这三个匹配模式区域来对二维码进行定位。
二、使用opencv对二维码进行定位
下面我们使用opencv对下图中的二维码进行定位。我们主要使用opencv中的findContours()函数,顾名思义,其主要作用便是在二值图像中寻找轮廓。
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(binary, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE,
Point());
输入的第一个参数为二值图像;
第二个参数为轮廓,函数检测到的轮廓存在该参数中;
第三个参数表示图像中轮廓的拓扑信息,我们主要是根据轮廓的拓扑信息来对二维码的匹配模式区域进行定位;每一个轮廓contours[ i ]对应4个hierarchy元素hierarchy [ i ][ 0 ]~hierarchy [ i ][ 3 ],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果没有对应项,对应的hierarchy [ i ] 值设置为负数。
第四个参数表示轮廓的检测模式,RETR_TREE表示提取所有轮廓,建立网状的轮廓结构,对检测到的轮廓建立等级关系。
现在我们把所有检测到的轮廓在原图中画出进行观察,如下图所示。