此次博客介绍了如何在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。

android opencv 条码图像预处理_数字识别

    点击Extract后如下:

把OpenCV加入环境变量

android opencv 条码图像预处理_tesseract_02

android opencv 条码图像预处理_数字识别_03

 

    把D:\opencv\build\x86\vc14\bin加入环境变量。

android opencv 条码图像预处理_数字识别_04

 

    之后点击确定,注意,改变windows环境变量后一般要重新启动电脑。

新建项目配置OpenCV

    打开Visual Studio 2015,点击文件-新建-项目

android opencv 条码图像预处理_数字识别_05

    选择Win32控制台应用程序:

android opencv 条码图像预处理_tesseract_06

    点击确定,然后下一步,到本页时可以选择空项目,直到完成。

android opencv 条码图像预处理_opencv_07

    工程建好之后,依次点击 视图-其他窗口-属性管理器

 

android opencv 条码图像预处理_tesseract_08

    打开属性管理器。

配置OpenCV

android opencv 条码图像预处理_数字识别_09

 

android opencv 条码图像预处理_zbar_10

     在Debug|Win32上右击,选择添加新项目属性表。

android opencv 条码图像预处理_zbar_11

    不必修改文件名,直接添加即可。双击新建立的PropertySheet。

android opencv 条码图像预处理_条形码识别_12

这里请注意:如果打开的是PropertySheet属性页面,之后的文件配置也仅适用于PropertySheet项目。如果打开的是opencvtest属性页面,则文件配置适用于opencvtest项目中的所有文件。后续的zbar配置也是如此。

android opencv 条码图像预处理_zbar_13

 

依此加入

D:\opencv\build\include\opencv2

D:\opencv\build\include\opencv

D:\opencv\build\include

android opencv 条码图像预处理_条形码识别_14

编辑VC++目录-库目录

android opencv 条码图像预处理_zbar_15

加入D:\opencv\build\x86\vc14\lib

android opencv 条码图像预处理_opencv_16

 找到链接器-输入-附加依赖项

android opencv 条码图像预处理_数字识别_17

 

加入以下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

 

android opencv 条码图像预处理_zbar_18

测试

回到解决方案资源管理器,在源文件上右击,添加新建项目。

android opencv 条码图像预处理_数字识别_19

 加入CPP文件,命名为main.cpp

android opencv 条码图像预处理_数字识别_20

 输入如下代码:

#include <opencv.hpp>
using namespace cv;
int main()
{
	Mat img = imread("..\\bar1.jpg");
	imshow("条形码原始图片", img);
	waitKey(0);
	return 1;
}

点击 本地Windows调试器,注意要选择Debug 和X86。

android opencv 条码图像预处理_tesseract_21

 

点击 本地Windows调试器,注意要选择Debug 和X86。

android opencv 条码图像预处理_tesseract_22

 

安装并在Visual Studio 2015中配置Zbar

安装Zbar

安装条形码识别函数包zbar。 zbar-0.10-setup.exe。

android opencv 条码图像预处理_zbar_23

android opencv 条码图像预处理_数字识别_24

 

点击Next,到此处注意勾选“Development Headers and Libraries”

安装目录可以选择d:\ProgramFilesD\Zbar

android opencv 条码图像预处理_条形码识别_25

安装后的文件如下。

android opencv 条码图像预处理_数字识别_26

 

把zbar加入环境变量

把D:\ProgramFilesD\ZBar\bin加入环境变量。注意,Windows环境变量改变,一般要重新启动电脑。

android opencv 条码图像预处理_tesseract_27

新建项目配置zbar

打开上文建立好的解决方案opencvtest,在解决方案opencvtest上右击,添加--新建项目

android opencv 条码图像预处理_zbar_28

仍然建立一个Visual C++ Win32控制台应用程序,名字为zbartest1

android opencv 条码图像预处理_zbar_29

仍然选择空项目,直到完成。

android opencv 条码图像预处理_条形码识别_30

android opencv 条码图像预处理_opencv_31

 

在属性管理器窗口下,项目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

android opencv 条码图像预处理_tesseract_32

测试 :

#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.

android opencv 条码图像预处理_zbar_33

右击工程->属性->C\C++->预处理器->预处理器定义->编辑 加入 _CRT_SECURE_NO_WARNINGS,

其中预处理器定义中自带的WIN32_DEBUG_CONSOLE不需要删除。

 

android opencv 条码图像预处理_条形码识别_34

android opencv 条码图像预处理_opencv_35

 

android opencv 条码图像预处理_tesseract_36

再重新执行,得到结果如图,说明zbar安装成功。 

安装并在Visual Studio 2015中配置Tesseract

安装Tesseract

安装tesseract-ocr-setup-3.05.02-20180621.exe

如果要支持中文简体,则选择Additional language data(download),进一步选择Chinese(simplified)

 

android opencv 条码图像预处理_数字识别_37

android opencv 条码图像预处理_tesseract_38

安装位置选择d:\Program Files (x86)\Tesseract-OCR,需要等几分钟。 

android opencv 条码图像预处理_数字识别_39

android opencv 条码图像预处理_数字识别_40

把Tesseract加入环境变量

安装结束后把D:\Program Files (x86)\Tesseract-OCR加入环境变量,同时定义一个用户变量为TESSDATA_PREFIX,将D:\Program Files (x86)\Tesseract-OCR加入到用户变量TESSDATA_PREFIX中。

android opencv 条码图像预处理_opencv_41

android opencv 条码图像预处理_条形码识别_42

    将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。如果出现如下图所示,说明环境变量配置成功。

android opencv 条码图像预处理_数字识别_43

在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两个文件夹。

android opencv 条码图像预处理_tesseract_44

 

通用属性--链接器--输入--附加依赖项,

加入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安装成功。

android opencv 条码图像预处理_opencv_45