本人想利用OpenCV与ZBar实现二维码扫描功能。PC上已经配置好了OpenCV3.1.0,并且VS2013配置为64位的开发环境。按照教程:二维码解码器Zbar+VS2012开发环境配置,配置了ZBar0.10,后利用如下代码测试:
#include <iostream>
#include<opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <zbar.h>
#include <time.h>
using namespace std;
using namespace cv;
using namespace zbar;
int main()
{
clock_t start = clock(); // 记录程序开始时间,用于计算扫描二维码耗时
zbar::ImageScanner scanner;
scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
Mat imgOrigin = imread("Picture\\QR Code.jpg"); // 二维码图片相对路径
Mat imgGray;
cvtColor(imgOrigin , imgGray, CV_BGR2GRAY); // 灰度化
int width = imgGray.cols;
int height = imgGray.rows;
Image image(width, height, "Y800", imgGray.data, width * height); // 图片格式转换
scanner.scan(image);
Image::SymbolIterator symbol = image.symbol_begin();
if (image.symbol_begin() == image.symbol_end())
{
cout << "查询条码失败,请检查图片!" << endl;
}
for (; symbol != image.symbol_end(); ++symbol)
{
cout << "类型:" << endl << symbol->get_type_name() << endl << endl;
cout << "条码:" << endl << symbol->get_data() << endl << endl;
}
image.set_data(nullptr, 0);
clock_t finish = clock(); // 记录程序结束时间
double time_length = (double) (finish - start) / CLOCKS_PER_SEC; //根据两个时刻的差,计算出扫描的时间
cout << "扫描耗时 " << time_length << " seconds." << endl;
return 0;
}
但是运行程序时报错:
出现error LNK2019 : unresolved external symbol 这个类问题的一个可能原因就是库包lib没有包含到工程中。经过研究发现,我当前的VS工程配置为x64环境,而按照前文教程从官网上下载的ZBar是32位的。经过一番尝试,发现如下解决方法:
- zbar Windows32和64的库在此下载包含32位和64位的库(也可以到GitHub上下载免费的版本);
- 解压下载完成的库,并将 ZBarWin64-master\lib 文件夹下 libzbar64-0.lib 文件复制到ZBar安装路径下的 lib 文件夹;
- 将 ZBarWin64-master\lib 文件夹下 libzbar64-0.dll 文件复制到ZBar安装路径下的 bin 文件夹;
- 将ZBarWin64-master\zbar\libiconv\dll_x64文件夹下 libiconv.dll 复制到ZBar安装路径下的bin 文件夹;
- 在VS项目属性表中,打开 通用属性->链接器->输入 再添加一条:libzbar64-0.lib;
(注:以上步骤均在文章开头介绍的教程配置完成的基础上做出的进一步补充);
按照上述5步进行进一步配置后,VS2013即可在64位环境下正确运行示例程序。