使用OpenCV+ZBar实现多条形码识别

本工程是利用OpenCV4.5.4进行图像预处理,将条形码找到并送进ZBar进行识别
目前能实现对干扰少的多条形码图片进行是被,后期希望能够利用摄像头在有干扰的情况下对条形码进行识别

工程代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <zbar.h>
using namespace std;
using namespace cv;
using namespace zbar;
int main()
{
	ImageScanner scanner;
	//后期将会改用摄像头识别
	//VideoCapture cap(0);
	//if (!cap.isOpened())  //检查是否打开摄像头
	//	return -1;
	while (1)
	{
		Mat image_s, image_gray, image_gradX, image_gradY, image_grad;
		image_s = imread("多条形码.jpg", 1);//读取照片
		//cap >> image_s;//将相机中的照片保存到新的
		imshow("source", image_s);//显示图片
		cvtColor(image_s, image_gray, COLOR_BGR2GRAY);//转换为灰度图
		imshow("gray", image_gray);
		//分别计算图像在xy方向的导数
		Scharr(image_gray, image_gradX, CV_8U, 1, 0);
		Scharr(image_gray, image_gradY, CV_8U, 0, 1);
		//因为我们的条形码在X方向上,所以减掉y方向的导数
		subtract(image_gradX, image_gradY, image_grad);
		imshow("grad", image_grad);
		Mat image_threshold;
		//对图像进行二值化并进行形态学处理
		threshold(image_grad, image_threshold, 100, 255, THRESH_BINARY);//二值化
		Mat  element = getStructuringElement(1, Size(9, 9));//创建形态学的结构元素
		//膨胀两次,使条形码的二值化图像相连通
		dilate(image_threshold, image_threshold, element);
		dilate(image_threshold, image_threshold, element);
		//腐蚀两次
		erode(image_threshold, image_threshold, element);
		erode(image_threshold, image_threshold, element);
		//去除孤立的点
		morphologyEx(imageSobleOutThreshold, imageSobleOutThreshold, MORPH_CLOSE, element);
		vector<vector<Point>> contours;
		vector<Vec4i> hierarchy;
		findContours(imageSobleOutThreshold, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);//寻找轮廓
		for (int i = 0; i < contours.size(); i++)
		{
			double TempArea = fabs(contourArea(contours[i]));//计算轮廓的面积
			if (TempArea > 1000)//轮廓面积大于1000认为是条形码
			{
				Rect rect = boundingRect(contours[i]);//计算点集的矩形边界
				rectangle(image_s, rect, Scalar(255), 2);//画出矩形
				Mat image_roi = image_gray(rect);//根据轮廓画出Roi区域
				Mat image_scan;
				image_roi.copyTo(image_scan);//将Roi区域的图像复制到新的变量中
				//将OpenCV的图像转换为ZBar的图像
				int width = image_scan.cols;
				int height = image_scan.rows;
				uchar* image_zbar = (uchar*)image_scan.data;
				Image imageZbar(width, height, "Y800", image_zbar, width * height);
				scanner.scan(imageZbar); //扫描条码  
				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;
				}
				imageZbar.set_data(NULL, 0);
			}
		}
		imshow("end", image_s);//显示框选了条形码的矩形
		cout << "--------------------" << endl;
		if (waitKey(10) == 'q');
	}
	return 0;
}

运行效果

在这里插入图片描述
在这里插入图片描述
在编写过程中遇到的最大的问题就是在利用Opencv画出Roi区域后转换为ZBar的图像类型进行识别总是会识别出同一排的其他二维码。
出现这种问题的原因是因为在划定Roi区域的时候并不会划定一块新的区域来储存图像,而是指向原来的图像,相当于将原图送到了ZBar进行识别,解决方法是利用copyTo()将划定的Roi区域储存在新的图像变量中。
详细解释:
openCV_C++笔记 : ROI感兴趣区域与Rect类
关于opencv中ROI区域的理解

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: OpenCVZBar是两个常用的开源库,可以用于实现摄像头识别二维码的功能。 首先,OpenCV是一款用于计算机视觉的开源库,它提供了丰富的图像处理计算机视觉算法,可以用来处理图像和视频。OpenCV支持各种程序设计语言,包括C++、Python等,因此非常方便开发者进行二维码的图像处理识别。 而ZBar是一款专门用于二维码和条形码扫描的开源库。它提供了各种功能强大的接口,可以对摄像头捕捉到的图像进行二维码的识别ZBar支持多种编程语言,如C、C++、Python等,因此可以与OpenCV结合使用。 要实现摄像头识别二维码的功能,可以按照以下步骤进行: 1. 首先,使用OpenCV打开摄像头,获取实时图像流。 2. 将摄像头捕捉到的图像传递给ZBar库进行二维码的识别ZBar库提供了相关的函数和接口,可以将摄像头捕获的图像进行处理,并识别其中的二维码。 3. 当ZBar识别到二维码时,可以通过回调函数或其他方式将识别到的二维码信息传递给应用程序,可以对识别到的二维码进行相关的操作,如解析二维码内容,打开对应的链接或进行其他业务处理。 总的来说,通过将OpenCVZBar结合使用,我们可以实现摄像头实时识别二维码的功能。这样,我们可以利用摄像头实时获取图像流,并通过ZBar库对图像进行识别,从而实现对二维码的实时扫描和处理。 ### 回答2: OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理计算机视觉算法。而ZBar是一个开源的条码和二维码识别库,能够通过摄像头进行实时的二维码识别使用OpenCVZBar实现摄像头识别二维码的步骤如下: 1. 首先,我们需要使用OpenCV库中的VideoCapture类来打开摄像头,并获取实时的视频帧。 2. 在每一帧中,我们将使用ZBar库提供的二维码识别功能。通过将每一帧转换为灰度图像,可以提高识别效果。 3. 在灰度图像上,我们可以使用ZBar库的Scanner类进行二维码的扫描。Scanner类可以检测到图像中的所有二维码,并返回相关信息。 4. 当扫描到二维码时,我们可以从Scanner类中获取二维码的内容。 5. 最后,我们可以使用OpenCV库提供的绘图功能,在视频帧上标记出识别到的二维码的位置和内容。 通过以上步骤,我们可以实现摄像头实时识别二维码的功能。这种方法可以应用于一些需要实时扫描二维码的场景,例如门禁系统、物流追踪等。同时,OpenCVZBar库的开源特性也使得开发者能够根据自己的需求进行定制和修改,提高二维码识别的准确率和效率。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值