此次博客介绍了如何在vs2015上配置opencv、zbar、tesseract,也是为了给即将进行条形码识别工作的工程师所准备。
本次提供的代码是在32bit的编译环境下完成的。
主要内容包括:所需要的软件安装包、测试代码,安装以及配置opencv、zbar、tesseract的全过程,以及配置完成后的测试结果。
下载链接:
操作环境
电脑操作环境windows 10-64位
opencv 2.4.13.6-vc14.rar:下载地址:https://opencv.org/releases.html
visual studio 2015
以下程序的编写都是在32位的环境下进行的。
安装并在Visual Studio 2015中配置OpenCV
安装OpenCV
解压opencv-2.4.13.6-vc14.rar得到opencv-2.4.13.6-vc14.exe。双击opencv-2.4.13.6-vc14.exe。
点击Extract后如下:
把OpenCV加入环境变量
把D:\opencv\build\x86\vc14\bin加入环境变量。
之后点击确定,注意,改变windows环境变量后一般要重新启动电脑。
新建项目配置OpenCV
打开Visual Studio 2015,点击文件-新建-项目
选择Win32控制台应用程序:
点击确定,然后下一步,到本页时可以选择空项目,直到完成。
工程建好之后,依次点击 视图-其他窗口-属性管理器
打开属性管理器。
配置OpenCV
在Debug|Win32上右击,选择添加新项目属性表。
不必修改文件名,直接添加即可。双击新建立的PropertySheet。
这里请注意:如果打开的是PropertySheet属性页面,之后的文件配置也仅适用于PropertySheet项目。如果打开的是opencvtest属性页面,则文件配置适用于opencvtest项目中的所有文件。后续的zbar配置也是如此。
依此加入
D:\opencv\build\include\opencv2
D:\opencv\build\include\opencv
D:\opencv\build\include
编辑VC++目录-库目录
加入D:\opencv\build\x86\vc14\lib
找到链接器-输入-附加依赖项
加入以下19个库文件。这里请注意:库文件中结尾带d为Debug模式,release模式则需要把d去掉。
opencv_ml2413d.lib
opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_imgproc2413d.lib
opencv_legacy2413d.lib
opencv_objdetect2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_nonfree2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_videostab2413d.lib
测试
回到解决方案资源管理器,在源文件上右击,添加新建项目。
加入CPP文件,命名为main.cpp
输入如下代码:
#include <opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("..\\bar1.jpg");
imshow("条形码原始图片", img);
waitKey(0);
return 1;
}
点击 本地Windows调试器,注意要选择Debug 和X86。
点击 本地Windows调试器,注意要选择Debug 和X86。
安装并在Visual Studio 2015中配置Zbar
安装Zbar
安装条形码识别函数包zbar。 zbar-0.10-setup.exe。
点击Next,到此处注意勾选“Development Headers and Libraries”
安装目录可以选择d:\ProgramFilesD\Zbar
安装后的文件如下。
把zbar加入环境变量
把D:\ProgramFilesD\ZBar\bin加入环境变量。注意,Windows环境变量改变,一般要重新启动电脑。
新建项目配置zbar
打开上文建立好的解决方案opencvtest,在解决方案opencvtest上右击,添加--新建项目
仍然建立一个Visual C++ Win32控制台应用程序,名字为zbartest1
仍然选择空项目,直到完成。
在属性管理器窗口下,项目zbartest1,Debug|Win32下新建属性管理文件zbartest1PropertySheet
配置zbar
双击zbartest1PropertySheet,分别加入如下内容。
通用属性-- VC++目录--包含目录:
D:\ProgramFilesD\ZBar\include
D:\opencv\build\include\opencv2
D:\opencv\build\include\opencv
D:\opencv\build\include
通用属性-- VC++目录-- 库目录
D:\ProgramFilesD\ZBar\lib
D:\opencv\build\x86\vc14\lib
通用属性--链接器--输入--附加依赖项,
加入zbar的1个lib文件和opencv的19个lib文件
libzbar-0.lib
opencv_ml2413d.lib
opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_imgproc2413d.lib
opencv_legacy2413d.lib
opencv_objdetect2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_nonfree2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_videostab2413d.lib
在项目zbartest1下加入源文件main.cpp
测试 :
#include <iostream>
#include <zbar.h>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc_c.h>
#include <cv.h>
using namespace cv;
using namespace std;
using namespace zbar;
static string zbar_test(Mat srcImage) {
string res = "";
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
int width = srcImage.cols;
int height = srcImage.rows;
uchar *raw = (uchar *)srcImage.data;
Image imageZbar(width, height, "Y800", raw, width * height);
scanner.scan(imageZbar); //扫描条码
Image::SymbolIterator symbol = imageZbar.symbol_begin();
if (imageZbar.symbol_begin() == imageZbar.symbol_end())
{
cout << "查询条码失败,请检查图片!" << endl;
}
else {
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
cout << "类型:" << endl << symbol->get_type_name() << endl << endl;
cout << "条码:" << endl << symbol->get_data() << endl << endl;
if (symbol->get_type_name() != "QR-Code") {
res = symbol->get_data();
break;
}
}
}
imageZbar.set_data(NULL, 0);
cout << "scan result:" << res << endl;
return res;
}
int main()
{
Mat barImg = imread("..\\bar1.jpg");
cvtColor(barImg, barImg, COLOR_RGB2GRAY);
zbar_test(barImg);//7ms
imshow("图像", barImg);
cvWaitKey(0);
return 0;
}
把zbartest1设为启动项目,在debug,x86下调试程序。
备注
出现错误error C4996: 'fopen': This function or variable may be unsafe.
右击工程->属性->C\C++->预处理器->预处理器定义->编辑 加入 _CRT_SECURE_NO_WARNINGS,
其中预处理器定义中自带的WIN32_DEBUG_CONSOLE不需要删除。
再重新执行,得到结果如图,说明zbar安装成功。
安装并在Visual Studio 2015中配置Tesseract
安装Tesseract
安装tesseract-ocr-setup-3.05.02-20180621.exe
如果要支持中文简体,则选择Additional language data(download),进一步选择Chinese(simplified)
安装位置选择d:\Program Files (x86)\Tesseract-OCR,需要等几分钟。
把Tesseract加入环境变量
安装结束后把D:\Program Files (x86)\Tesseract-OCR加入环境变量,同时定义一个用户变量为TESSDATA_PREFIX,将D:\Program Files (x86)\Tesseract-OCR加入到用户变量TESSDATA_PREFIX中。
将D:\Program Files (x86)\Tesseract-OCR加入环境变量后重启计算机。将压缩包下的1.jpg图片放入Tesseract-OCR的安装目录当中,然后按下Windows+r输入cmd,出现cmd.exe界面后输入tesseract –v查看版本号。使用dos运行D:\Program Files (x86)\Tesseract-OCR下的tesseract,
命令为:tesseract 1.jpg 1.txt -l eng。如果出现如下图所示,说明环境变量配置成功。
在zbartest1PropertySheet的基础上配置Tesseract
更改zbartest1PropertySheet如下:
通用属性-- VC++目录--包含目录:
D:\ProgramFilesD\ZBar\include
D:\opencv\build\include\opencv2
D:\opencv\build\include\opencv
D:\opencv\build\include
D:\tesseract_vs2015\include
通用属性-- VC++目录-- 库目录
D:\ProgramFilesD\ZBar\lib
D:\opencv\build\x86\vc14\lib
D:\tesseract_vs2015\tesseract-leptonica-vs2015\Debug
注意:tesseract_vs2015这个文件是通过解压tesseract_vs2015.zip得到,里面包含include,tesseract-leptonica-vs2015两个文件夹。
通用属性--链接器--输入--附加依赖项,
加入zbar的1个lib文件,op
encv
的19个lib文件和9个tesseract需要的lib文件
libzbar-0.lib
opencv_ml2413d.lib
opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_imgproc2413d.lib
opencv_legacy2413d.lib
opencv_objdetect2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_nonfree2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_videostab2413d.lib
tesseract.lib
giflib.lib
libjpeg.lib
liblept.lib
libpng.lib
libtesseract.lib
libtiff.lib
openjpeg.lib
zlib.lib
测试:
#include <iostream>
#include <zbar.h>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc_c.h>
#include <cv.h>
#include <baseapi.h>
#include <allheaders.h>
using namespace cv;
using namespace std;
using namespace zbar;
static string zbar_test(Mat srcImage) {
string res = "";
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
int width = srcImage.cols;
int height = srcImage.rows;
uchar *raw = (uchar *)srcImage.data;
Image imageZbar(width, height, "Y800", raw, width * height);
scanner.scan(imageZbar); //扫描条码
Image::SymbolIterator symbol = imageZbar.symbol_begin();
if (imageZbar.symbol_begin() == imageZbar.symbol_end())
{
cout << "查询条码失败,请检查图片!" << endl;
}
else {
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
cout << "类型:" << endl << symbol->get_type_name() << endl << endl;
cout << "条码:" << endl << symbol->get_data() << endl << endl;
if (symbol->get_type_name() != "QR-Code") {
res = symbol->get_data();
break;
}
}
}
imageZbar.set_data(NULL, 0);
cout << "scan result:" << res << endl;
return res;
}
int main()
{
Mat barImg = imread("..\\bar1.jpg");
cvtColor(barImg, barImg, COLOR_RGB2GRAY);
zbar_test(barImg);//7ms
imshow("图像", barImg);
//==================================================
Mat ocrImg = imread("..\\ocr1.jpg");
imshow("图像", ocrImg);
char *outText;
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
// Initialize tesseract - ocr with English, without specifying tessdata path
if (api->Init(NULL, "eng")) {
fprintf(stderr, "Could not initialize tesseract.\n");
exit(1);
}
// Open input image with leptonica library
Pix *image = pixRead("..\\ocr1.jpg");
api->SetImage(image);
// Get OCR result
outText = api->GetUTF8Text();
printf("OCR output:\n%s", outText);
// Destroy used object and release memory
api->End();
delete[] outText;
pixDestroy(&image);
imshow("ocr图像", ocrImg);
cvWaitKey(0);
return 0;
}
执行结果如下,表示Tesseract安装成功。