OPENCV条形码检测与识别

您所在的位置:网站首页 条形码自动识别摄像头 OPENCV条形码检测与识别

OPENCV条形码检测与识别

2024-07-12 10:57| 来源: 网络整理| 查看: 265

  条形码是当前超市和部分工厂使用比较普遍的物品,产品标识技术,使用摄像头检测一张图片的条形码包含有两个步骤,第一是定位条形码的位置,定位之后剪切出条形码,并且识别出条形码对应的字符串,然后就可以调用网络,数据库等手段快速进行后续处理.

      条形码识别要考虑到条形码的特点,本文针对的是条形码在图片中的位置相对垂直,没有各种倾斜的那种条形码,如下图所示

 

要定位首先要检视这种条形码的特点,这种图像在X方向上的梯度肯定很明显,同时,Y方向的梯度就没这么明显,所以第一步,我们应该将图像的灰度图像分别计算梯度,用X方向梯度减去Y方向梯度,这样可以保留X方向特征并且去除Y方向的干扰,处理之后图像如下所示

可以看到,二维码对一维码的定位形成了干扰,但是二维码的空间漏洞相对一维码多很懂,于是我们考虑进行一次模糊并且二值化,看能不能有所效果,如下(记得调整相应的模糊化参数和阈值参数,得到相对最好的结果)

有一定的效果,但是此时又出现问题条形码出现了黑色的缝隙,不利于定位完整区域,这个时候要进行一些形态学操作,去除黑色缝隙,我们选择闭运算,算子根据缝隙的情况,宽度大于高度,矩形缝隙.处理以后的结果.

效果可以,又出现问题,二维码的区域连着,还是面积很大,对后面我们算区域面积依然有影响,但是我们观测二维码的连接区域明显要比一维码的连接区域要细很多,也就是说,我们可以很快的腐蚀断二维码的连接,同时还保持一维码的连接,然后在膨胀回来,二维码的连接断开就应该不会有这个大块的区域连着了,注意,膨胀和腐蚀的次数应当是一致的,保证得到结果区域的准确.我选择膨胀腐蚀四次,先膨胀断开二维码连接,最后的结果显示如下

此时,二维码的影响就基本没有了,现在我们只需要先查找轮廓,然后计算图像中每个轮廓的面积,选出面积最大的那个轮廓,计算这个轮廓的最小外包矩形,就能找到相应的图像区域了.这样操作的结果和切分出来的条形码如下所示

到目前为止,我们已经完成了条形码的位置定位,并且剪切出了条形码的团,接下里对这个图案进行识别,识别之前,总结一下

形态学梯度运算,忽略Y方向梯度,着眼于X方向梯度 图像模糊化,为了便于后期的图像连接 图像求阈值,加速算法处理,并合理使用模糊化的效果 形态学去除黑洞,闭运算 膨胀腐蚀,断开二维码连接 查找轮廓,计算轮廓最大面积,拟合轮廓矩形,得到最终结果

接下来条形码识别,可以使用zbar识别库,库的简介就不说了,可以自己去官网下载,安装时候记得选上第三个选项,否则没有头文件.

安装完成后,到安装目录,将bin目录加入环境变量,在VS中VC++目录的include中加入头文件地址,lib地址,并加入lib名称(连接器-输入-附加依赖项),然后就可以使用了,具体使用查看下面的代码,结果如下

代码如下

#include #include #include using namespace cv; using namespace std; using namespace zbar; int main(int argc,char* argv[]) { char fileNameString[100]; char windowNameString[50]; char resultFileNameSring[100]; Mat srcImage,grayImage,blurImage,thresholdImage,gradientXImage,gradientYImage,gradientImage,morphImage; for (int fileCount = 1;fileCount < 8;fileCount++) { sprintf(fileNameString,"F:\\opencv\\条形码检测与识别\\barcode_0%d.jpg",fileCount); sprintf(windowNameString,"result 0%d",fileCount); sprintf(resultFileNameSring,"F:\\opencv\\条形码检测与识别\\barcodeResult_0%d.jpg",fileCount); //读取图像 srcImage = imread(fileNameString); if(srcImage.empty()) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3