专栏首页深度学习和计算机视觉一起学习二维码(三)二维码解码

一起学习二维码(三)二维码解码

小白最近需要做一个和二维码相关的项目,因此近期小白会陆陆续续的为大家带来一些和二维码相关的分享。

上一篇推送中,小白成功的安装了能够解码QR二维码的开源库zbar,并且利用测试程序检测了安装的正确性,但是由于解码二维码只是项目中的一小部分,因此在实际的项目中我们必须自己编写程序,这样才能更好的将解码的功能结合主程序中(虽然也可以在ROS下通过话题的方式来实现解码节点,但是这样也仍然需要自己写一个解码节点)。

于是小白便开始了自己写程序解码二维码之路。

小白采用的方式是OpenCV+Zbar的方式实现二维码的解码,通过OpenCV加载图片,之后在进行解码工作。我们之前已经验证过zbar库成功安装,因此我们只需要在写程序的时候引用上就可以了。经常在Ubuntu环境下编程的小伙伴可能都比较了解,我们首先需要写一个CMakeList.txt文件,将我们引用的OpenCV库包含在程序里。

于是按照常规的方式来写CMakeList文件,同时也参考了网上的一些程序,网上找到的N多版本,都如下所示:

project(qrtest)
find_package( OpenCV 2.4.9 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable(qrtest main.cpp)
target_link_libraries( qrtest ${OpenCV_LIBS} )

好吧,既然大家都这么写,我也就试试看吧,然后写了如下的解码程序:

#include <iostream>
#include <zbar.h>
#include <cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
using namespace zbar;
int main(int argc, char **argv) {
    //Mat image= imread("qrcode.bmp");
    Mat image = imread("fz.png");
    if ( image.data == nullptr ) //数据不存在,可能是文件不存在
    {
        cerr<<"文件不存在."<<endl;
        return 0;
    }                                                                                                                              = zbar_image_scanner_create();
    ImageScanner scanner;
    scanner.set_config(zbar::ZBAR_NONE,zbar::ZBAR_CFG_ENABLE,1);
    Mat imageGray;
    cvtColor(image,imageGray,CV_RGB2GRAY);
    int width = imageGray.cols;
    int height = imageGray.rows;
    uchar *raw = (uchar *)imageGray.data;
    zbar::Image imageZbar(width, height, "Y800", raw, width * height);
    scanner.scan(imageZbar);
    zbar::Image::SymbolIterator symbol = imageZbar.symbol_begin();
    if(imageZbar.symbol_begin()==imageZbar.symbol_end())
    {
      cout<<"查询条码失败,请检查图片"<<endl;
      return 0;
    }
    for(;symbol!=imageZbar.symbol_end();++symbol)
    {
      cout<<"类型"<<endl<<symbol->get_type_name()<<endl<<endl;
      cout<<"内容"<<endl<<symbol->get_data()<<endl<<endl;
    }   
    cv::waitKey(0);
    imageZbar.set_data(NULL,0);
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

之后编译,出现了错误!!!,错误内容如下:

错误提示是说基本的函数不能使用,例如:

zbar_image_scanner_t *scanner =zbar_image_scanner_create();

提示说函数zbar_image_scanner_create()没有定义,秉着我遇到的问题也会有别人遇到的想法,开始了漫长的搜索之路。最后小白决定,还是借个梯子吧,于是谷歌了一下,哈哈,还真有人遇到了(这说明手边有个梯子是多么的幸福)。

问题的原因是libzbar.a没有包含在程序中。恩,只要在CMakeList里面链接该文件就可以了,于是抱着试试看的心态,战战兢兢的将下面一行代码加入进去:

target_link_libraries( qrtest/usr/lib/libzbar.a )

程序通了,大功告成。

最后一行的hello,world属于乱入,可以忽略不计

这个程序只是实现了简单的二维码读取功能,如果图片再复杂一些,还是会出现无法读取的问题,关于这些问题的解决方法,小白会在后续的更新中陆续与小伙伴们分享。

相关阅读:

使用Matlab图像处理(五)——边缘提取

使用Matlab图像处理(四)——常用滤波的实现

使用Matlab图像处理(三)——图像滤波原理

使用Matlab图像处理(二)

使用Matlab图像处理(一)

本文分享自微信公众号 - 小白学视觉(NoobCV)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据分析 | Numpy实战(二) - 分析各类用户平均骑行时间

    上次的文章发出之后发现忘了补充数据源的链接,之后咸鱼补充在留言区了,有需要动手实践的朋友可以自取,下面是直通车:

    咸鱼学Python
  • 8个好看又实用 Python可视化工具包,再也不怕做不出图表了!

    用 Python 创建图形的方法有很多,但是哪种方法是最好的呢?当我们做可视化之前,要先明确一些关于图像目标的问题:你是想初步了解数据的分布情况?想展示时给人们...

    Rocky0429
  • 重启电脑继续运行MATLAB程序

    因为实验室断电问题,或者其他原因,程序运行会被打断。这里提供一个matlab可以在中断后,重启,利用之前已有的结果继续优化过程

    万木逢春
  • Python GUI开发,效率提升10倍的方法!

    这个框架的名字叫 PySimpleGUI,它完全基于Python语言,能非常方便地开发GUI界面,代码量相比现有框架减少50%到90%。并且,它提供了极为友好的...

    double
  • 科研作图之光谱图绘制(matlab版)

    之前给大家介绍过一期有关如何用origin绘制光谱图(科研作图之光谱图绘制),有小伙伴在公众号中回复希望能通过matlab作出这样的光谱图,本期就来介绍如何通过...

    艾木樨
  • 32个实用matlab编程技巧

    今天给大家介绍一些编程小技巧,之前给大家介绍过matlab编程小技巧,本期是在之前的基础之上做了修正和补充完善,下面一起来看看吧。

    艾木樨
  • 像数据科学家一样思考:12步指南(下)

    我们的数据科学过程的第6步是数据的统计分析。统计方法通常被认为是做好数据科学所需技能和知识的近一半,或至少三分之一。另一个较大的部分是软件开发和/或应用程序,其...

    AiTechYun
  • 让老板和客户一看就懂 ,赞不绝口的10个数据可视化技巧

    为什么会这样?我们总是在做同样的事情。你知道的:pairplots,distplots,qqplots…你在可视化数据时使用图表是理解数据的唯一方法。这些都是非...

    AI研习社
  • 「首席架构师推荐」数值分析软件列表

    原文:https://en.wikipedia.org/wiki/List_of_numerical-analysis_software

    首席架构师智库
  • Python可视化库Matplotlib绘图入门详解

    Matplotlib是Python的绘图库,其中的pyplot包封装了很多画图的函数。

    代码医生工作室

扫码关注云+社区

领取腾讯云代金券