基于Linux zbar二维码识别库编译和Linux Opencv编译安装基础上,实现Opencv+zbar实现二维码、条形码识别
- 代码结构
eric@eric-PC:~/Documents/work/linux-c/opencv$ tree
.
├── Makefile
├── picture
│ ├── 2Code.png
│ ├── barCode.jpg
│ ├── QRcode.jpg
│ └── test.jpg
└── src
└── main.cpp
2 directories, 6 files
QRcode.jpg:二维码
barCode.jpg:条形码
2Code.png,二维码+条形码
- main.cpp
#include "iostream"
#include "opencv2/opencv.hpp"
#include "zbar.h"
using namespace std;
using namespace cv;
using namespace zbar;
#define WINDOW_NAME "clor"
#define WINDOW_GARY_NAME "gary"
int main()
{
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
namedWindow(WINDOW_GARY_NAME, WINDOW_AUTOSIZE);
// 加载二维码图片
Mat image;
// image = imread("./picture/test.jpg");
image = imread("./picture/QRcode.jpg");
// image = imread("./picture/barCode.jpg");
// image = imread("./picture/2Code.png");
// image = Mat(240,320,CV_8UC3,Scalar(0,255,0));
cout << "---------------- 图像参数 ------------------"<<endl;
// 标志位
cout << "flags:" << image.flags << endl;
// 图像尺寸
cout << "size:" << image.size << endl;
// 列宽
cout << "clos:" << image.cols<<endl;
// 行高
cout << "rows:" << image.rows << endl;
// 维度
cout << "dims:" << image.dims << endl;
cout << "------------------------------------------"<<endl;
imshow(WINDOW_NAME,image);
// 灰度转换
Mat imageGray;
cvtColor(image, imageGray, COLOR_RGB2GRAY);
imshow(WINDOW_GARY_NAME,imageGray);
// 获取二进制数据
int width = imageGray.cols;
int height = imageGray.rows;
uchar *raw = (uchar *)imageGray.data;
Image imageZbar = Image(width, height, "Y800", raw, width * height);
// 配置扫描器,开始扫描
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
scanner.scan(imageZbar);
// 扫描结果打印
if (imageZbar.symbol_begin() == imageZbar.symbol_end())
{
cout << "识别错误!" << endl;
}
// 遍历所有识别到的二维码后者条形码
Image::SymbolIterator symbol = imageZbar.get_symbols();
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
cout << "类型:\t" << symbol->get_type_name() << endl;
cout << "条码:\t" << symbol->get_data() << endl << endl;
}
// 释放资源
imageZbar.set_data(NULL, 0);
waitKey(0);
return 0;
}
- Makefile
######################################
# eric
######################################
## 指定编译工具
CC = gcc
CPP = g++
RM = rm -rf
## 源文件路径(默认检索3层)
SRC_PATH := ./src
DIRS := $(shell find $(SRC_PATH) -maxdepth 3 -type d)
## 目标文件名称
TARGET := main
## 获取所有.c文件路径
SRCS += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
SRCPPS += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
## 所有对应目标文件
OBJS := $(SRCS:.c=.o) $(SRCPPS:.cpp=.o)
## 所有用到的库
LIBS := pthread m # mbedtls mbedcrypto mbedx509
## 指定头文件路径
INCLUDE_PATH := . $(DIRS) #/usr/local/include/opencv4/
## 指定库文件路径
LIB_PATH := /lib /usr/local/lib #./libmbedtls
## 编译参数初始化
CFLAGS := -g -O3 -pthread #-Wall
## 加载头文件路径
CFLAGS += $(foreach dir, $(INCLUDE_PATH), -I$(dir))
CFLAGS += `pkg-config --cflags --libs opencv`
CFLAGS += `pkg-config --cflags --libs zbar`
## 加载库文件路径
LDFLAGS += $(foreach libdir, $(LIB_PATH), -L$(libdir))
## 加载库文件
LDFLAGS += $(foreach lib, $(LIBS), -l$(lib))
.PHONY:all
all: $(TARGET)
$(TARGET) :$(OBJS)
@$(CPP) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
@#$(RM) $(OBJS)
@echo =============================
@echo $(TARGET) ok
%.o : %.c
@echo srcs=$(SRCS)
@echo $@...
@$(CC) -c $(CFLAGS) $< -o $@
%.o : %.cpp
@echo srcpps=$(SRCPPS)
@echo LDFLAGS=$(LDFLAGS)
@echo OBJS=$(OBJS)
@echo $@...
@$(CPP) -c $(CFLAGS) $< -o $@
# %.o : %.S
# $(CC) -c $(CFLAGS) $< -o $@
.PHONY:clean
clean:
$(RM) $(OBJS) $(TARGET)
- 编译&测试
eric@eric-PC:~/Documents/work/linux-c/opencv$ make
srcpps= ./src/main.cpp
LDFLAGS= -L/lib -L/usr/local/lib -lpthread -lm
OBJS= ./src/main.o
src/main.o...
=============================
main ok
eric@eric-PC:~/Documents/work/linux-c/opencv$ ./main
(clor:130149): Gtk-WARNING **: 13:53:08.378: 无法在模块路径中找到主题引擎:“adwaita”,
(clor:130149): Gtk-WARNING **: 13:53:08.378: 无法在模块路径中找到主题引擎:“adwaita”,
---------------- 图像参数 ------------------
flags:1124024336
size:260 x 260
clos:260
rows:260
dims:2
------------------------------------------
类型: QR-Code
条码: www.baidu.com
eric@eric-PC:~/Documents/work/linux-c/opencv$