前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起学习二维码(三)二维码解码

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

作者头像
小白学视觉
发布2019-10-24 14:36:17
1.3K0
发布2019-10-24 14:36:17
举报

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

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

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

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

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

代码语言:javascript
复制
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} )

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

代码语言:javascript
复制
#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;
}

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

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

代码语言:javascript
复制
zbar_image_scanner_t *scanner =zbar_image_scanner_create();

提示说函数zbar_image_scanner_create()没有定义,秉着我遇到的问题也会有别人遇到的想法,开始了漫长的搜索之路。

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

代码语言:javascript
复制
target_link_libraries( qrtest/usr/lib/libzbar.a )

程序通了,大功告成。

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

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

相关阅读:

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

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

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

使用Matlab图像处理(二)

使用Matlab图像处理(一)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档