前言

刚刚学完OpenCv的基础部分,上手来一个简单的练习,定位识别二维码。

二维码有三个定位点,通过定位三个定位点来定位二维码的位置与大小。

处理步骤

  1. 灰度处理
  2. 滤波
  3. 二值化
  4. 发现轮廓,并导出子轮廓大于两个的父轮廓
  5. 筛选出三个轮廓,条件:有一个垂直角
  6. 计算倾斜角度并原图,将二维码抠出

成果展示

将原图标记出定位点:

输出图像均为

由输出可看出,任何角度的二维码,都可以正确的识别并取出。

代码展示

#include<opencv2/opencv.hpp>
#include<opencv2/core/mat.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;int threshold_value = 80;
int threshold_max = 255;
Mat src, dst;int main()
{src = imread("C:/Users/LBJ/Desktop/二维码识别/二维码1.png");if (!src.data){cout << "The iamge is empty" << endl;return -1;}src.copyTo(dst);namedWindow("output_image", WINDOW_AUTOSIZE);namedWindow("Input_Image", WINDOW_AUTOSIZE);cvtColor(src, src, CV_BGR2GRAY);blur(src, src, Size(3, 3), Point(-1, -1));;Mat bin_output;vector<vector<Point>> contours;vector<Vec4i> hierachy;vector<Point> convexs;       //用来储存三个标记框的点集,画最小矩形,即为二维码的区域vector<vector<Point>> Qrprint;threshold(src, bin_output, threshold_value, threshold_max, THRESH_BINARY);/**************************************通过轮廓信息查找二维码的标记框**********************************************/findContours(bin_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));for (size_t i = 0; i < contours.size(); i++){int j = i, temp = 0;while (hierachy[j][2] != -1){temp++;j = hierachy[j][2];}if (temp >= 2){Qrprint.push_back(contours[i]);   //将识别到的定位点放入数组中drawContours(dst, contours, i, Scalar(0, 0, 255), -1, 8, hierachy, 0, Point(0, 0));cout << contours[i] << endl;}}
/********************************************************************************************************************//*************************通过两两垂直的关系,筛选出正确的三个识别框,储存子Q中************************************************/vector<RotatedRect> Qr_Rect(Qrprint.size());vector<Point> Center_Point(Qrprint.size());for (size_t i = 0; i < Qrprint.size(); i++){Qr_Rect[i] = minAreaRect(Qrprint[i]);Center_Point[i] = Qr_Rect[i].center;circle(dst, Center_Point[i], 5, Scalar(0, 255, 0), -1, 8);}int Q[3];for (size_t i = 0; i < Qrprint.size(); i++){for (size_t j = 0; j < Qrprint.size(); j++){for (size_t k = 0; k < Qrprint.size(); k++){if ( i!=j && i!=k && j!=k ){double k1, k2, k3;double dx, dy;dx = Center_Point[i].x - Center_Point[j].x;dy = Center_Point[i].y - Center_Point[j].y;k1 = dy / dx;dx = Center_Point[i].x - Center_Point[k].x;dy = Center_Point[i].y - Center_Point[k].y;k2 = dy / dx;dx = Center_Point[j].x - Center_Point[k].x;dy = Center_Point[j].y - Center_Point[k].y;k3 = dy / dx;if ((k1*k2 > -1.1&&k1*k2 < -0.9)) {Q[0] = i; Q[1] = j; Q[2] = k;}else if ((k1*k3 > -1.1&&k1*k3 < -0.9)) {Q[0] = j; Q[1] = i; Q[2] = k;}else if ((k3*k2 > -1.1&&k3*k2 < -0.9)) {Q[0] = k; Q[1] = j; Q[2] = i;}else { continue; }//q1储存了直角点的信息}}}}/**************************************在原图里标记出二维码的位置***************************************/for (size_t i = 0; i < 3; i++){convexs.insert(convexs.end(), Qrprint[Q[i]].begin(), Qrprint[Q[i]].end());}Point2f ptr[4];RotatedRect rect = minAreaRect(convexs);rect.points(ptr);for (int i = 0; i < 4; i++){line(dst, ptr[i], ptr[(i + 1) % 4], Scalar(0, 255, 0), 5, 8);}/**************************通过直角点位置计算旋转角度并且将二维码抠出********************************/double angel = rect.angle;; //计算旋转角度if (Center_Point[Q[0]].x< Center_Point[Q[1]].x && Center_Point[Q[0]].x < Center_Point[Q[2]].x){}else if (Center_Point[Q[0]].y > Center_Point[Q[1]].y && Center_Point[Q[0]].y > Center_Point[Q[2]].y){angel -= 90;}else if (Center_Point[Q[0]].x > Center_Point[Q[1]].x && Center_Point[Q[0]].x > Center_Point[Q[2]].x){angel -= 180;}else if (Center_Point[Q[0]].y < Center_Point[Q[1]].y && Center_Point[Q[0]].y < Center_Point[Q[2]].y){angel -= 270;}Mat  Rotation = getRotationMatrix2D(rect.center, angel, 1.0);warpAffine(src, src, Rotation, src.size());Mat Result = src(Rect(rect.center.x - (rect.size.width / 2), rect.center.y - (rect.size.height / 2), rect.size.width, rect.size.height));imshow("Input_Image", dst);imshow("output_image", Result);waitKey(0);return 0;
}

可优化部分

1、识别二维码三个定位点的方法是寻找子轮廓数大于二的父轮廓,改成寻找子轮廓数大于二的轮廓的最小子轮廓,效果可能会好一点。

2、对于畸变后的二维码无法识别,后期可以尝试改进。

opencv练习---识别二维码相关推荐

  1. opencv项目7---智能识别二维码和条形码

    利用opencv和一个摄像头设备即可实现智能识别二维码和条形码,用到的都是基础的opencv知识. 二维码和条形码的照片可以去网上自行搜索. 这个项目可以有很多扩展: 1:比如做成一个公司的二维码证件 ...

  2. python opencv 条形码及二维码检测识别

    目录 条形码检测识别 二维码检测识别 基于python opencv pyzbar 实现. 条形码检测识别 原图: 最后截取图: 直接上代码: import cv2 import numpy as n ...

  3. C++利用OpenCV识别二维码QRCode

    引子 项目需要用到C++进行二维码识别,虽然手机上随便扫码就可以轻易识别出来,但是到了电脑上可就没有那么方便了. 我要做的是能够一下子把一张图片上的几十个二维码一下子识别出来,如果成功的话,那岂不是比 ...

  4. 树莓派4b + python3 + pyzbar + opencv + 摄像头 扫描识别二维码(寻找最大的二维码)

    前言 最近需要做一个扫码乘车的功能,于是使用树莓派的摄像头扫描二维码来做一个demo . 网上有部分人用的是zbar这个库,但是我安装后,发现并不能在Python3上使用,这就有点不太好了.经过我的多 ...

  5. opencv之调用摄像头动态识别二维码

    结合前几篇做的工作,实现一下动态识别二维码 opencv之调用摄像头动态识别二维码

  6. 【opencv】生成二维码并识别

    [opencv]生成二维码并识别 生成二维码 图片识别 摄像头识别 生成二维码 import qrcode #模块导入 #调用qrcode的make()方法传入url或者想要展示的内容 img = q ...

  7. 通过Java使用opencv识别二维码

    OpenCV的全称是Open Source Computer Vision Library,它是一个跨平台的计算机视觉库,由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费 ...

  8. python摄像头识别二维码_python使用pyzbar+opencv实现实时识别二维码--李渣渣(lizaza.cn)...

    写东西就要写全面,前两天写了如何用python生成二维码,今天博主就给大家介绍一个识别二维码的方法. 1.安装本次开发所需要的库opencv 和pyzbar pip install pyzbar pi ...

  9. OPENCV识别二维码

    OPENCV识别二维码 油管一位小哥的教程,讲的非常好,可以去看一下,很火. 代码非常简单,有个扩展的代码,将二维码的数据写到txt文件里,可以做很多有意思的事情,很简单. ### ###二维码识别1 ...

最新文章

  1. word2013插入excel对象报错_修改Word文档中嵌入的Excel对象
  2. MPB:南京​湖泊所王建军组-​群落构建过程的定量指标——扩散-生态位连续体指数...
  3. 深度学习引擎的终极形态是什么?
  4. centos6 配置ip、服务
  5. 一些stl格式的点云的显示结果
  6. 三角形最小路径和(动态规划)
  7. 0069 如何在Intellij IDEA中查看Spring MVC项目的所有请求与处理方法的映射列表
  8. ubuntu 创建桌面快捷方式
  9. 23-初识正则表达式
  10. myeclipse显示行号
  11. memchache的数据类型_memcache详解
  12. PyTorch 1.0 中文官方教程:基于注意力机制的 seq2seq 神经网络翻译
  13. Mac OS X 10.7.2 Lion下快速锁定屏幕
  14. NetBean安装已下载的插件
  15. 4 卷积的拉普拉斯变换
  16. RFID中的天线技术-应用及设计现状
  17. KVM/QEMU虚拟机申请和释放内存的步骤
  18. [几何] BZOJ 4246 两个人的星座
  19. 50种认知偏差要注意,这样才能做最好的自己
  20. 理工男,我感觉 win10 挺好用的,一点不卡,为什么有那么多人买Macbook 呢?

热门文章

  1. viz---消消乐4.0
  2. 据说有了IPv6,全世界的每一粒沙子都能编上一个网址!
  3. Android让所有应用都竖屏显示或者横屏显示
  4. 吴鉴鹰51单片机学习—中断、定时器同时点亮数码管和LED各种效果
  5. 《不如吃茶去》许嵩新专辑封面首曝光 传达简适生活态度
  6. 浅谈 React 生命周期
  7. 再度斩获两大奖项! ALVA Systems 驱动智能制造新征程
  8. 软件定义汽车时代下,智能汽车软件架构逐步向 SOA 演进
  9. Tarjan算法——边双和点双
  10. 关于react判断是否安装app,没有则去appStore(适配android和ios)