• OpenCV(三十八):二维码检测


    1.二维码识别原理

    功能图形:

    1. 位置探测图形:通常,二维码中有三个位置探测图形,呈现L型或大角度十字架形状,分布在二维码的三个角上,用于帮助扫描设备定位二维码的位置和方向。

    2. 位置探测图形分隔符:帮助扫描设备区分位置探测图形和二维码的数据区域。

    3. 计算模式:通常是一个小的正方形图案,用于校准扫描设备以捕捉和解码二维码的图像。

    4. 对齐标记:通常是一系列小的正方形图案,用于帮助扫描设备在不同的距离和角度下更好地对准和解码二维码。

    编码区格式:

    1. 格式信息:格式信息用于指定二维码的编码格式和纠错级别。

    2. 版本信息:版本信息指定了二维码的大小和数据容量。。

    3. 数据和纠错码:编码区还包含实际的数据和纠错码。

    2.二维码定位函数与识别函数

    二维码定位函数 detect()

    bool detect(InputArray img, OutputArray points) const;
    
    • img: 待检测是否含有QR二维码的灰度图像或者彩色图像。
    • points: 包含QR二维码的最小区域四边形的四个顶点坐标,即二维码的四个顶点坐标。

    二维码识别函数decode()

     std::string decode(InputArray img, InputArray points, OutputArray straight_code = noArray()) const;

    • img:含有QR二维码的图像。
    • points:包含QR二维码的最小区域四边形的四个顶点坐标。
    • straight qrcode:经过校正和二值化的OR二维码。

    示例代码:

    1. void qrcode(Mat image){
    2. Mat gray,qrcode_bin;
    3. cvtColor(image,gray,COLOR_BGR2GRAY);
    4. QRCodeDetector qrCodeDetector;
    5. vector<Point> points;
    6. string information;
    7. bool isQRcode;
    8. isQRcode=qrCodeDetector.detect(gray,points);//识别二维码
    9. if(isQRcode){
    10. //解码二维码
    11. information=qrCodeDetector.decode(gray,points,qrcode_bin);
    12. }else{
    13. LOGD("无法识别二维码");
    14. }
    15. //绘制二维码的边框
    16. for(int i=0;i<points.size();i++){
    17. if(i==points.size()-1) {
    18. line(image, points[i], points[0], Scalar(0, 0, 255, 255), 2, 8);
    19. break;
    20. }
    21. line(image,points[i],points[i+1],Scalar(0,0,255,255),2,8);
    22. }
    23. //将解码内容输出到图片上
    24. putText(image,information.c_str(),Point(20,30),2,1,Scalar(0,0,255,255),8);
    25. //显示图像
    26. imwrite("/sdcard/DCIM/image.png",image);
    27. imwrite("/sdcard/DCIM/qrcode_bin.png",qrcode_bin);
    28. }

    输出图片:

    经过校正和二值化的OR二维码:

    3.二维码直接定位与识别函数detectAndDecode()

    std::string cv::QRCodeDetector::detectAndDecode ( InputArray   img,

    OutputArray points = noArray(),

    OutputArray straight qrcode = noArray()

    )

    • img:含有QR二维码的图像
    • points: 包含QR二维码的最小区域四边形的四个顶点坐标
    • straight_qrcode:经过校正和二值化的OR二维码

    示例代码:

    1. //利用函数直接定位二维码并解码
    2. void qrcode2(Mat image){
    3. Mat gray;
    4. cvtColor(image,gray,COLOR_BGR2GRAY);
    5. QRCodeDetector qrCodeDetector;
    6. vector<Point> points;
    7. string information;
    8. information=qrCodeDetector.detectAndDecode(gray,points);
    9. //将解码内容输出到图片上
    10. putText(image,information.c_str(),Point(20,30),2,1,Scalar(0,0,255,255),8);
    11. //显示图像
    12. imwrite("/sdcard/DCIM/image2.png",image);
    13. }

    输出图片:

  • 相关阅读:
    MATLAB中Simulink.SimulationOutput用法
    国庆中秋特辑(七)Java软件工程师常见20道编程面试题
    JavaScript-es6-新版语法-export-import
    Sqlserver关于tempdb临时数据库文件个数的最佳实践
    SOAP WebService 发布服务成功,但是访问404
    Linux-常用命令(持续更新中)
    spring boot + feign + Hystrix 整合 (亲测有效)
    高压放大器能够在哪里使用呢
    Arrays.asList
    电话号码的字母组合
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/132830563