基于opencv 识别、定位二维码 (c++版)
前言 因工作需要,需要定位图片中的二维码;我遂查阅了相关资料,也学习了opencv开源库。通过一番努力,终于很好的实现了二维码定位。本文将讲解如何使用opencv定位二维码。
定位二维码不仅仅是为了识别二维码;还可以通过二维码对图像进行水平纠正以及相邻区域定位。定位二维码,不仅需要图像处理相关知识,还需要分析二维码的特性,本文先从二维码的特性讲起。
1 二维码特性
二维码在设计之初就考虑到了识别问题,所以二维码有一些特征是非常明显的。
二维码有三个“回“”字形图案,这一点非常明显。中间的一个点位于图案的左上角,如果图像偏转,也可以根据二维码来纠正。
思考题:为什么是三个点,而不是一个、两个或四个点。
一个点:特征不明显,不易定位。不易定位二维码倾斜角度。
两个点:两个点的次序无法确认,很难确定二维码是否放正了。
四个点:无法确定4个点的次序,从而无法确定二维码是否放正了。
识别二维码,就是识别二维码的三个点,逐步分析一下这三个点的特性
1 每个点有两个轮廓。就是两个口,大“口”内部有一个小“口”,所以是两个轮廓。
2 如果把这个“回”放到一个白色的背景下,从左到右,或从上到下画一条线。这条线经过的图案黑白比例大约为:黑白比例为1:1:3:1:1。
3 如何找到左上角的顶点?这个顶点与其他两个顶点的夹角为90度。
通过上面几个步骤,就能识别出二维码的三个顶点,并且识别出左上角的顶点。
2 使用opencv识别二维码
1) 查找轮廓,筛选出三个二维码顶点
opencv一个非常重要的函数就是查找轮廓,就是可以找到一个图中的缩所有的轮廓,“回”字形图案是一个非常的明显的轮廓,很容易找到。
1 int QrParse::FindQrPoint(Mat& srcImg, vector<vector<Point>>& qrPoint)
2 {
3 //彩色图转灰度图
4 Mat src_gray;
5 cvtColor(srcImg, src_gray, CV_BGR2GRAY);
6 namedWindow("src_gray");
7 imshow("src_gray", src_gray);
8
9 //二值化
10 Mat threshold_output;
11 threshold(src_gray, threshold_output, 0, 255, THRESH_BINARY | THRESH_OTSU);
12 Mat threshold_output_copy