#include<opencv2/opencv.hpp>
#include "zbar.h"
#include <iostream>
using namespace std;
using namespace zbar; //添加zbar名称空间
using namespace cv;
int main(int argc, char*argv[])
{
// 设定视频流
VideoCapture vcap("http://admin:12345@10.10.10.139:8081");
while (vcap.isOpened()) {
Mat image; // 定义所需要测试的图像
Mat imageGray; // 所转化成的灰度图像
// 对于视频测试
vcap >> image;
if (image.empty()) break;
//对于一幅图像的测试: Mat image = imread("C:/Users/SLJ/Desktop/test3.jpg");
//显示图像
imshow("video", image);
//定义一个扫描仪
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
//将所得到的RGB图像转化为灰度图像
cvtColor(image, imageGray, CV_RGB2GRAY);
// 获取所摄取图像的长和宽
int width = imageGray.cols;
int height = imageGray.rows;
// 在Zbar中进行扫描时候,需要将OpenCV中的Mat类型转换为(uchar *)类型,raw中存放的是图像的地址;对应的图像需要转成Zbar中对应的图像zbar::Image
uchar *raw = (uchar *)imageGray.data;
Image imageZbar(width, height, "Y800", raw, width * height);
// 扫描相应的图像imageZbar(imageZbar是zbar::Image类型,存储着读入的图像)
scanner.scan(imageZbar); //扫描条码
Image::SymbolIterator symbol = imageZbar.symbol_begin();
if (imageZbar.symbol_begin() == imageZbar.symbol_end())
{
cout << "查询条码失败,请检查图片!" << endl;
}
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
cout << "类型:" << endl << symbol->get_type_name() << endl << endl;
cout << "条码:" << endl << symbol->get_data() << endl << endl;
}
waitKey(); // 等待按下esc键,若需要延时1s则改用waitKey(1000);
// 将图像中的数据置为0
imageZbar.set_data(NULL, 0);
}
return 0;
}
Zbar和OpenCV识别条形码,比halcon中find_bar_code好用
最新推荐文章于 2024-08-27 10:50:37 发布