精华内容
下载资源
问答
  • opencv条形码定位与识别,比较适合饮料瓶上的商标和二维码条形码混在一起的情况,使用ZBAR完成识别过程 opencv条形码定位与识别,比较适合饮料瓶上的商标和二维码条形码混在一起的情况,使用ZBAR完成识别过程
  • 代码实现简单环境下的条形码与二维码的定位与识别: 原图: #include<iostream> #include<opencv2\opencv.hpp> #include<zbar.h> using namespace std; using namespace cv; using ...

    代码实现简单环境下的条形码与二维码的定位与识别:

    原图:

    #include<iostream>
    #include<opencv2\opencv.hpp>
    #include<zbar.h>
    
    using namespace std;
    using namespace cv;
    using namespace zbar;
    
    //寻找最大的轮廓
    static vector<cv::Point> FindBiggestContour(Mat src)
    {
    	int imax = 0; //代表最大轮廓的序号
    	int imaxcontour = -1; //代表最大轮廓的大小
    	std::vector<std::vector<cv::Point>>contours;
    	findContours(src, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
    	for (int i = 0; i<contours.size(); i++)
    	{
    		int itmp = contourArea(contours[i]);//这里采用的是轮廓大小
    		if (imaxcontour < itmp)
    		{
    			imax = i;
    			imaxcontour = itmp;
    		}
    	}
    	return contours[imax];
    }
    
    //获取二维码
    void detect_decode_qrcode()
    {
    	Mat img = imread("barcode_qrcode.jpg");
    	if (img.empty())
    	{
    		cout << "reading images fails" << endl;
    	}
    	//灰度化
    	Mat img_gray, img_bin;
    	cvtColor(img, img_gray, COLOR_BGR2GRAY);
    	threshold(img_gray, img_bin, 100, 255, THRESH_OTSU | THRESH_BINARY_INV);  //THRESH_BINARY_INV  二值化取反						 
    	vector<vector<Point>> contours, contours2; //找轮廓  找到的轮廓按照树的方式排列
    	vector<Vec4i> hierarchy;
    	findContours(img_bin, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);
    	int c = 0, ic = 0, area = 0;
    	int parentIdx = -1;
    	for (int i = 0; i < contours.size(); i++)
    	{											//遍历所有的大轮廓									
    		if (hierarchy[i][2] != -1 && ic == 0)  //如果 这个大轮廓没有父轮廓 hierarchy[i][2] != -1 说明他是存在子轮廓的
    		{
    			parentIdx = i;
    			ic++;
    		}
    		else if (hierarchy[i][2] != -1)
    		{
    			ic++;
    		}
    		//最外面的清0
    		else if (hierarchy[i][2] == -1)
    		{
    			ic = 0;
    			parentIdx = -1;
    		}
    		//找到定位点信息
    		if (ic == 2)
    		{
    			contours2.push_back(contours[parentIdx]);
    			ic = 0;
    			parentIdx = -1;
    		}
    	}
    	//二维码中间是应该有三个特征轮廓的,如果等于3 那么就认为它是有二维码的
    	if (contours2.size() != 3)
    	{
    		printf("finding 3 rects fails \n");
    	}
    	//把二维码最外面的轮廓构造成一个新的点集
    	Rect new_rect;
    	vector<Point> all_points;
    	for (int i = 0; i < contours2.size(); i++)
    	{
    		for (int j = 0; j < contours2[i].size(); j++)
    			all_points.push_back(contours2[i][j]);
    	}
    	new_rect = boundingRect(all_points);  //根据二维码构成得点集,找到一个最小的外包所有点集 的矩形
    										  //  Rect rect(230, 5, 280, 290);//左上坐标(x,y)和矩形的长(x)宽(y)
    										  //  cv::rectangle(src, rect, Scalar(255, 0, 0),1, LINE_8,0);
    	rectangle(img, new_rect, Scalar(0, 0, 255), 8, 0);
    	Mat result_img = img_gray(new_rect);   //将找到的矩形 放进灰度图中,这样图片就可以根据矩形切割出来了
    	ImageScanner scanner;
    	scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);
    	int width = result_img.step;  //因为这一小部分是截取出来的
    	int height = result_img.rows;
    	uchar *raw = (uchar *)result_img.data;
    	Image imageZbar(width, height, "Y800", raw, width * height);
    	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;
    	}
    	imageZbar.set_data(NULL, 0);
    	//imshow("mat",img);
    	imshow("mat1", result_img);
    }
    
    
    //获取条形码
    void detect_decode_barcode()
    {
    	Mat src = imread("barcode_qrcode.jpg");
    	if (src.empty())
    	{
    		cout << "reading images fails" << endl;
    	}
    	Mat sobel;
    	Mat canny;
    	Mat canny_output;
    	//1、//灰度化
    	Mat gray;
    	cvtColor(src, gray, COLOR_BGR2GRAY); 
    	//2、二值化
    	//Canny(gray, canny, 100, 255);
    	Mat bin;
    	threshold(gray, bin, 0, 255, THRESH_OTSU | THRESH_BINARY_INV);
    	//3、形态学滤波
    	Mat element = getStructuringElement(MORPH_ELLIPSE, Size(12, 2));
    	morphologyEx(bin, bin, MORPH_DILATE, element); //形态学滤波  找到条形码 大白
    	//morphologyEx(canny, canny, MORPH_ERODE, element);
    	//4、寻找最大的轮廓
    	Rect boundRect = boundingRect(Mat(FindBiggestContour(bin)));
    	Mat result_img = gray(boundRect);
    	imshow("mat2", result_img);
    
    	ImageScanner scanner;
    	scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
    	int width = result_img.step;
    	int height = result_img.rows;
    	uchar *raw = (uchar *)result_img.data;
    	Image imageZbar(width, height, "Y800", raw, width * height);
    	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;
    	}
    	imageZbar.set_data(NULL, 0);
    }
    //主函数
    int main()
    {
    	detect_decode_qrcode(); 
    	detect_decode_barcode();
    	waitKey(0);
    	return 0;
    }

     

     

    检测结果图:

    调用Zbar库函数,识别分割出来的二维码与条形码

    展开全文
  • opencv练习--条形码定位识别

    千次阅读 2020-07-22 15:30:16
    前段时间,做了一个二维码的定位练习,与条形码的不同之处在于,二维码有三个定位点,可以通过寻找轮廓识别三个定位点的位置来识别定位二维码,而条形码定位点,有一系列竖直的条框组成,所以需要进行膨胀腐蚀等...

    前言

    前段时间,做了一个二维码的定位练习,与条形码的不同之处在于,二维码有三个定位点,可以通过寻找轮廓识别三个定位点的位置来识别定位二维码,而条形码无定位点,有一系列竖直的条框组成,所以需要进行膨胀腐蚀等预处理,再进行寻找轮廓。

    处理步骤

    1 灰度处理

    2  高斯滤波---X轴方向进行索贝尔求导--二值化

    由于条形码是一道道竖直的线条,所以只需要提取出竖向的特征,进行X方向求导

    3 开操作-用于去除小的对象

    4 闭操作--用于填充小孔,使条形码连接成一个整体

    5 寻找轮廓并进行筛选

    对寻找到的轮廓做最小矩形,宽高比大于1小于2,并且,宽高分别大于图片的宽高的三分之一,用以筛选掉较小的对象和其他形状的对象。筛选后,将识别到的条形码位置在原图框出

    6 提取出条码部分,并进行识别

    源码分享

    #include<opencv2/opencv.hpp>
    #include<opencv2/core/mat.hpp>
    #include<iostream>
    #include<vector>
    #include<zbar.h>
    
    using namespace std;
    using namespace cv;
    using namespace zbar;
    
    int main()
    {
    
    	Mat src, dst;
    	src = imread("C:/Users/LBJ/Desktop/条形码识别/条形码.jpg");
    	if (!src.data)
    	{
    		cout << "The iamge is empty" << endl;
    		return -1;
    	}
    	src.copyTo(dst);
    
    	Mat src_gray;
    	cvtColor(src, src_gray, CV_RGB2GRAY);
    	imshow("gray", src_gray);
    
    	GaussianBlur(src_gray, src_gray, Size(3, 3), 0, 0);
    	Mat canny;
    	Sobel(src_gray, canny, CV_32F, 1, 0, 3);
    	convertScaleAbs(canny, canny);
    	blur(canny, canny, Size(5, 5));
    	threshold(canny, canny, 40, 255, THRESH_BINARY | THRESH_OTSU);
    	imshow("Sobel", canny);
    
    	Mat open;
    	Mat structure = getStructuringElement(MORPH_RECT, Size(9, 9), Point(-1, -1));
    	Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
    
    	morphologyEx(canny, open, CV_MOP_OPEN, structure);
    	imshow("open", open);
    
    	Mat close;
    	morphologyEx(open, close, CV_MOP_CLOSE, structure);
    	imshow("close", close);
    
    	Mat cont = close;
    	vector<vector<Point>> contours;
    	vector<Vec4i> hierachy;
    	vector<Point> convexs;       
    	findContours(cont, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
    
    	
    	RotatedRect Out_Rect,rect;
    	Point2f ptr[4];
    	for (size_t i = 0; i < contours.size(); i++)
    	{
    		rect = minAreaRect(contours[i]);
    		if (rect.size.width>src.cols/4 && rect.size.height > src.rows/4 && rect.size.width/ rect.size.height >=1 && rect.size.width / rect.size.height <= 2)
    		{
    			Out_Rect = rect;
    		}
    
    	}
    	
    	Out_Rect.points(ptr);
    	for (int i = 0; i < 4; i++)
    	{
    		line(dst, ptr[i], ptr[(i + 1) % 4], Scalar(0, 255, 0), 5, 8);
    
    	}
    	imshow("output", dst);
    
    	Mat Result = src_gray(Rect(Out_Rect.center.x - Out_Rect.size.width*0.65, Out_Rect.center.y - Out_Rect.size.height*0.6, Out_Rect.size.width*1.3, Out_Rect.size.height*1.2));
    	imshow("Result", Result);
    
    
    	ImageScanner scanner;
    	scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
    	int width = src_gray.cols;
    	int height = src_gray.rows;
    	uchar *raw = (uchar *)src_gray.data;
    	Image imageZbar(width, height, "Y800", raw, width * height);
    	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(0);
    	return 0;
    }

     

    展开全文
  • OPENCV条形码检测与识别

    千次阅读 2016-03-15 11:27:00
    条形码是当前超市和部分工厂使用比较普遍的物品,产品标识技术,... 条形码识别要考虑到条形码的特点,本文针对的是条形码在图片中的位置相对垂直,没有各种倾斜的那种条形码,如下图所示 要定位首先要检视这种条形...

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

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

     

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

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

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

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

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

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

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

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

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

    代码如下

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <zbar.h>
    
    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<<"image file read error"<<endl;
    
                return -1;
            }
            //图像转换为灰度图像
            if(srcImage.channels() == 3)
            {
                cvtColor(srcImage,grayImage,CV_RGB2GRAY);
            }
            else
            {
                grayImage = srcImage.clone();
            }
            //建立图像的梯度幅值
            Scharr(grayImage,gradientXImage,CV_32F,1,0);
            Scharr(grayImage,gradientYImage,CV_32F,0,1);
            //因为我们需要的条形码在需要X方向水平,所以更多的关注X方向的梯度幅值,而省略掉Y方向的梯度幅值
            subtract(gradientXImage,gradientYImage,gradientImage);
            //归一化为八位图像
            convertScaleAbs(gradientImage,gradientImage);
            //看看得到的梯度图像是什么样子
            //imshow(windowNameString,gradientImage);
            //对图片进行相应的模糊化,使一些噪点消除
            blur(gradientImage,blurImage,Size(9,9));
            //模糊化以后进行阈值化,得到到对应的黑白二值化图像,二值化的阈值可以根据实际情况调整
            threshold(blurImage,thresholdImage,210,255,THRESH_BINARY);
            //看看二值化图像
            //imshow(windowNameString,thresholdImage);
            //二值化以后的图像,条形码之间的黑白没有连接起来,就要进行形态学运算,消除缝隙,相当于小型的黑洞,选择闭运算
            //因为是长条之间的缝隙,所以需要选择宽度大于长度
            Mat kernel = getStructuringElement(MORPH_RECT,Size(21,7));
            morphologyEx(thresholdImage,morphImage,MORPH_CLOSE,kernel);
            //看看形态学操作以后的图像
            //imshow(windowNameString,morphImage);
            //现在要让条形码区域连接在一起,所以选择膨胀腐蚀,而且为了保持图形大小基本不变,应该使用相同次数的膨胀腐蚀
            //先腐蚀,让其他区域的亮的地方变少最好是消除,然后膨胀回来,消除干扰,迭代次数根据实际情况选择
            erode(morphImage, morphImage, getStructuringElement(MORPH_RECT, Size(3,3)),Point(-1,-1),4);
            dilate(morphImage, morphImage, getStructuringElement(MORPH_RECT, Size(3,3)),Point(-1,-1),4);
            //看看形态学操作以后的图像
            //imshow(windowNameString,morphImage);
            vector<vector<Point2i>>contours;
            vector<float>contourArea;
            //接下来对目标轮廓进行查找,目标是为了计算图像面积
            findContours(morphImage,contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
            //计算轮廓的面积并且存放
            for(int i = 0; i < contours.size();i++)
            {
                contourArea.push_back(cv::contourArea(contours[i]));
            }
            //找出面积最大的轮廓
            double maxValue;Point maxLoc;
            minMaxLoc(contourArea, NULL,&maxValue,NULL,&maxLoc);
            //计算面积最大的轮廓的最小的外包矩形
            RotatedRect minRect = minAreaRect(contours[maxLoc.x]);
            //为了防止找错,要检查这个矩形的偏斜角度不能超标
            //如果超标,那就是没找到
            if(minRect.angle<2.0)
            {
                //找到了矩形的角度,但是这是一个旋转矩形,所以还要重新获得一个外包最小矩形
                Rect myRect = boundingRect(contours[maxLoc.x]);
                //把这个矩形在源图像中画出来
                //rectangle(srcImage,myRect,Scalar(0,255,255),3,LINE_AA);
                //看看显示效果,找的对不对
                //imshow(windowNameString,srcImage);
                //将扫描的图像裁剪下来,并保存为相应的结果,保留一些X方向的边界,所以对rect进行一定的扩张
                 myRect.x= myRect.x - (myRect.width/20);
                 myRect.width = myRect.width*1.1;
                Mat resultImage = Mat(srcImage,myRect);
                if(!imwrite(resultFileNameSring,resultImage))
                {
                    cout<<"file save error!"<<endl;
                    return -2;
                }
            }
        }
        //检测到了之后进行条形码识别
        FileStorage file("F:\\opencv\\条形码检测与识别\\result.xml",FileStorage::WRITE);
        for (int fileCount = 1;fileCount < 8;fileCount++)
        {
            sprintf(resultFileNameSring,"F:\\opencv\\条形码检测与识别\\barcodeResult_0%d.jpg",fileCount);
            sprintf(windowNameString,"result 0%d",fileCount);
            Mat result = imread(resultFileNameSring);
            if(!result.empty())
            {
                //现在开始识别
                cvtColor(result,grayImage,CV_RGB2GRAY);
                int width = grayImage.cols;   // extract dimensions
                int height = grayImage.rows;
                Image image(width,height,"Y800",grayImage.data,width*height);
                ImageScanner scanner;
                scanner.set_config(ZBAR_NONE,ZBAR_CFG_ENABLE,1);
                int n = scanner.scan(image);
                for (Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end();++symbol)
                {
                    cout <<"pic name:\t"<<resultFileNameSring<<endl<<"code type:\t"<<symbol->get_type_name()<<endl<<\
                        "decode string:\t"<<symbol->get_data()<<endl;
                    image.set_data(NULL,0);
                    //xml文件写入
    
                }
            }
        }
        waitKey(0);
        return 1;
    }

    资源如下

    http://download.csdn.net/detail/dengrengong/9461797

     

    转载于:https://www.cnblogs.com/dengxiaojun/p/5278679.html

    展开全文
  • 一维码的原理结构 条码基本原理是利用条纹和间隔或宽窄条纹(间隔)构成二进制的”0“和”1“,反映的是某种信息。 一维条码数据结构,分四个区域。组成分别为静区、起始/终止符、校验符、数据符。 一维...

       一维码的原理与结构

           条码基本原理是利用条纹和间隔或宽窄条纹(间隔)构成二进制的”0“和”1“,反映的是某种信息。       

             一维条码数据结构,分四个区域。组成分别为静区、起始/终止符、校验符、数据符。

            一维条码的意识形态结构,分三条。

    1. 构成一维码的基本单元是模块,模块是指条码中最窄的条或空;
    2. 构成条码的条或空称为一个单元,一个单元包含多个或单个模块;
    3. 一个单元包含的模块数量由编码方式决定,即形成了不同的码制。

        一维码的定位与识别

           

     

                基本halcon工具算子,create_bar_code_model()生成模型;set_bar_code_param()设置参数;get_bar_code_object()获取中间参数;find_bar_code()条码解码定位与识别。

           在条码识别过程中,码制包括EAN码、39码和128码、93码、25码以及codabar码,码制决定了条码单元的组成形式。其中,还需要注意条码的三个重要参数,分别为条码密度(通常用模块尺寸表示);条或空的宽窄比;对比度(PCS)。

           在使用halocn工具算子时,还应注意常用的三个手法,打光;预处理以及设置参数。打光,主要是从光源部分着手;预处理,调整灰度值常用sacle_image()做点运算或直方图调整;设置参数,主要包括了模块尺寸,对比度以及阈值设置(边缘),扫描线的操控。理解一维码识别的原理与结构,按照halcon的常规执行套路并灵活运用三大手法,基本可以解决一维码的所有识别问题。

    转载于:https://www.cnblogs.com/dzw2017/p/7294191.html

    展开全文
  • 条形码定位条形码识别任务中的难点热点,也是提高条形码识别率的重要基础和保障。现已有很多的算法用于条形码定位,但是这些算法在大洋样品照片中的应用效果并不理想。大洋样品照片中的条形码具有相对面积小、...
  • 本设计研究EAN13条形码识别的译码技术,在基于机器视觉技术上,构建了一套条形码在线检测识别系统,系统将由以下几个部分构成:条形码图像定位与采集、计算机图像预处理、条形码图像中值滤波去噪、条码解析识读。...
  • 其中对条码二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并...3. 对非标准条形码,进行定位,然后...
  •  本设计研究EAN13条形码识别的译码技术,在基于机器视觉技术上,构建了一套条形码在线检测识别系统,系统将由以下几个部分构成:条形码图像定位与采集、计算机图像预处理、条形码图像中值滤波去噪、条码解析识读...
  • 码上闪条形码比价

    2012-02-19 13:27:57
    可以识别条形码、二维码(QR码、DM码等),是一个不折不扣的“码”上通。 码上闪实用之处在于“条形码比价”功能,轻松一扫,立刻手机比价,自动搜索商品在各大超市、商场、网上商城的价格,真正做到货比三家、理性...
  • 1.本文利用二维码的边缘信息,对其进行定位,经检验在3-4m以内有良好的定位效果 2.主要步骤:原图像大小调整,提高运算效率;转化为灰度图;高斯平滑滤波;...通过findContours找到条形码区域的矩形边界...
  • 可以识别条形码、二维码(QR码、DM码等),是一个不折不扣的“码”上通。 码上闪实用之处在于“条形码比价”功能,轻松一扫,立刻手机比价,自动搜索商品在各大超市、商场、网上商城的价格,真正做到货比三家、理性...
  • 条形码的发展历史国内外现状

    千次阅读 2018-11-21 23:01:37
    在二十年代初期,人们对条形码的技术还为一片空白,在Kermode的实验室项目中应运而生。当时他想研究的项目就是对邮政的据单进行自动分检,当时只是为了在信封上做条码标记,其中收信人的地址就是条码中的携带信息。...
  • 零售业的产品码识别

    2020-03-20 18:33:24
    条形码作为一种信息承载的技术已经...本文我们将讨论一些零售行业的条形码识别应用将会遇到的关键问题和我们的顾虑。 不同的条形码扫描设备 传统的手持式条形码扫描仪对大家来说应该都不陌生。作为一款链家便利店和...
  • 通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品互联网连 接起来,进行信息交换和通讯,以实现智能化识别定位、跟踪、监控和管理的一种网络。物联网的...
  • 前段时间学习完OpenCV的基础部分后,做了简单的二维码识别与条形码识别,最近做了一下这个车牌识别系统,本来是OpenCv还没有学到机器学习的位置,但是结合之前参加数学建模的时候对神经网络的了解,做了这个车牌字符...
  • 使用 Edamam 的 api,foodsur 可以识别给定的项目是否用户的饮食问题不一致。 用户可以扫描产品 UPC 或使用文本搜索来定位项目,并查看产品是否满足他们的饮食偏好。 用户还可以添加喜欢的产品以备后用,还可以...
  • chapter3 一维条形码识别系统 chapter4 基于模糊聚类的图形识别系统 chapter5&6 人脸检测系统人脸定位系统 chapter7 灰度车牌定位系统 chapter8 脑部CT图像辅助诊断系统 chapter9 手写体数字识别系统 chapter10&11...
  • chapter3 一维条形码识别系统 chapter4 基于模糊聚类的图形识别系统 chapter5&6 人脸检测与定位系统 chapter7 灰度车牌定位系统 chapter8 脑部CT图像辅助诊断系统 chapter9 手写数字识别系统 chapter10&1&12 指纹...
  • 条形码识别(简单背景)利用opencv来识别条形码,首先了解条形码的基本知识 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。 分析:识别条形码车牌类似,...
  • 本书的第1章和第2章介绍了数字图像处理的基本概念和技术,后续几章介绍了数字图像处理和计算机视觉领域的几个应用实例,包括指纹识别系统、数字水印技术、条形码技术、印鉴鉴定系统、光学字符识别技术以及基于视觉的...
  • 包括绪论、VisualC++数字图像处理基础、图像特征、统计模式识别、模式识别决策方法及实现,以及人脸检测特征点定位、汽车牌照识别、脑部医学影像诊断、印刷体汉字识别、手写体数字识别、一维条形码识别、运动图像...

空空如也

空空如也

1 2 3 4 5 6
收藏数 113
精华内容 45
关键字:

条形码识别与定位