Zbar和OpenCV识别条形码,比halcon中find_bar_code好用

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值