opencv识别多条形码数字_opencv测试代码

opencv识别多条形码数字_opencv测试代码这其实是一个小工程完成的功能: 使用摄像头采集图像进行预处理(检测部分) 提取出预处理的条形码图像(识别部分) 将条形码进行存入数据库(存储部分) 首先接到这个图像识别的小工程需要先确定这个工程的最初输入,和最后输出,输入就是普通的RGB图像,输出是数据库文件。其中需要完成的过程,就是我需要做得功能,检测部分、识别部分和存储部分,话不多说,上部分代码:/…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

这其实是一个小工程

完成的功能:

  • 使用摄像头采集图像进行预处理(检测部分)

  • 提取出预处理的条形码图像(识别部分)

  • 将条形码进行存入数据库(存储部分)

首先接到这个图像识别的小工程需要先确定这个工程的最初输入,和最后输出,输入就是普通的RGB图像,输出是数据库文件。

其中需要完成的过程,就是我需要做得功能,检测部分、识别部分和存储部分,话不多说,上部分代码:

//检测部分  需要用到opencv开源计算机视觉库
//输入是RGB  输出是保存的检测部分


Mat Check(Mat image)
{

    vector<vector<Point>> contours;
	vector<Vec4i> hiera;
	imshow("原图", image);

	//原图像大小调整,提高运算效率  
	//resize(image, image, Size(500, 300));
	//imshow("原图像", image); waitKey(15);		system("pause");



	//转化为灰度图  
	cvtColor(image, imageGray, CV_RGB2GRAY);
	//imshow("灰度图", imageGray); waitKey(15);		system("pause");

	//高斯平滑滤波  
	GaussianBlur(imageGray, imageGuussian, Size(3, 3), 0);
	//imshow("高斯平衡滤波", imageGuussian); waitKey(15);		system("pause");

	//求得水平和垂直方向灰度图像的梯度差,使用Sobel算子  
	Mat imageX16S, imageY16S;
	Sobel(imageGuussian, imageX16S, CV_16S, 1, 0, 3, 1, 0, 4);
	Sobel(imageGuussian, imageY16S, CV_16S, 0, 1, 3, 1, 0, 4);
	convertScaleAbs(imageX16S, imageSobelX, 1, 0);
	convertScaleAbs(imageY16S, imageSobelY, 1, 0);
	imageSobelOut = imageSobelX - imageSobelY;
	//imshow("X方向梯度", imageSobelX); waitKey(15);		system("pause");
	//imshow("Y方向梯度", imageSobelY); waitKey(15);		system("pause");
	//imshow("XY方向梯度差", imageSobelOut); waitKey(15);		system("pause");

	//均值滤波,消除高频噪声  
	blur(imageSobelOut, imageSobelOut, Size(3, 3));
	//imshow("均值滤波", imageSobelOut); waitKey(15);		system("pause");

	//二值化  
	Mat imageSobleOutThreshold;
	threshold(imageSobelOut, imageSobleOutThreshold, 100, 255, CV_THRESH_BINARY);
	//imshow("二值化", imageSobleOutThreshold); waitKey(15);		system("pause");

	//闭运算,填充条形码间隙  
	Mat  element = getStructuringElement(1, Size(9, 9));
	morphologyEx(imageSobleOutThreshold, imageSobleOutThreshold, MORPH_CLOSE, element);
	//imshow("闭运算", imageSobleOutThreshold); waitKey(15);		system("pause");

	//腐蚀,去除孤立的点  
	erode(imageSobleOutThreshold, imageSobleOutThreshold, element);
	//imshow("腐蚀", imageSobleOutThreshold); waitKey(15);		system("pause");

	//膨胀,填充条形码间空隙,根据核的大小,有可能需要2~3次膨胀操作  
	dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
	dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
	dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
	//dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
	//dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
	//dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
	//imshow("膨胀", imageSobleOutThreshold); waitKey(30);		system("pause");

	return imageSobleOutThreshold;
}


int main(int argc, char *argv[])
{
    ...;
    //测试用
	//image = imread("1.jpg");
	//定义两个容器去存放矩形区域
	vector<vector<Point>> contours;
	vector<Vec4i> hiera;
	imshow("原图", image);
	findContours(Check(image), contours, hiera, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
    for (int i = 0; i < contours.size(); i++)
	{
		Rect rect = boundingRect((Mat)contours[i]);
		rectangle(image, rect, Scalar(255), 2);
		Mat ROI = image(rect);
		sprintf(filenameIfZbar, "G:\\using\\text\\vs\\work\\zbar\\if1weima\\%d.jpg", i);
		//imshow(filename, rect);
		imwrite(filenameIfZbar, ROI);
		//imshow("ROI",image); waitKey(30);		system("pause");
		waitKey(1000); // 等待按下esc键,若需要延时1s则改用waitKey(1000);  

        ...;
	}
    ...;
}

Jetbrains全家桶1年46,售后保障稳定

检测效果图,已经存入图像图: 

opencv识别多条形码数字_opencv测试代码

opencv识别多条形码数字_opencv测试代码

识别部分输入是保存的检测为条形码区域图像,输出是一维码图像,部分代码:

int main(int argc, char *argv[])
{
    ...;
    for (int i = 0; i < contours.size(); i++)
	{ 
        ...;
		temp = image;


		cvtColor(temp, imageGray, CV_RGB2GRAY);
		//imshow("灰度图", imageGray);
		// 获取所摄取图像的长和宽  
		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;
			//system(delFile);
			continue;
		}
		for (; symbol != imageZbar.symbol_end(); ++symbol)
		{
			string type, data;
			type = symbol->get_type_name();
			data = symbol->get_data();
			cout << "类型:" << endl << type << endl << endl;
			cout << "条码:" << endl << data << endl << endl;
			sprintf(filenameIsZbar, "G:\\using\\text\\vs\\work\\zbar\\is1weima\\_%s_%s.jpg", type.c_str(), data.c_str());
			//imshow(filename, rect);
			imwrite(filenameIsZbar, ROI);
            ...;
		}
		waitKey(1000); // 等待按下esc键,若需要延时1s则改用waitKey(1000);  
	}
    ...;
}

效果图:

 opencv识别多条形码数字_opencv测试代码

识别完成的图像进行存储,部分代码+效果图:

int main(int argc, char *argv[])
{
    ...;
    for (int i = 0; i < contours.size(); i++)
	{ 
        ...;
		for (; symbol != imageZbar.symbol_end(); ++symbol)
		{
            ...;
            //表data写入数据
			sprintf(filedir, "..\\is1weima\\_%s_%s.jpg", type.c_str(), data.c_str());
			sprintf(csql_table1, "INSERT INTO [zbar].[dbo].[data]([type],[data],[imag]) VALUES('%s','%s','%s')", type.c_str(), data.c_str(), filedir);
			Sql = csql_table1;
			try{
				_RecordsetPtr pRst(__uuidof(Recordset)); //实例化一个Recordset对象pRst
				_CommandPtr pCmd(__uuidof(Command)); //实例化一个Command对象pCmd
				pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConnection));
				pCmd->CommandText = (_bstr_t)Sql;
				pRst = pCmd->Execute(NULL, NULL, adCmdText);
				cout << "添加成功!" << endl;
				pRst.Release();
				pCmd.Release();
			}
			catch (_com_error e) {
				cout << e.ErrorMessage() << endl;
				cout << "添加失败!" << endl;
			}
			//表num写入数据
			try {
				sprintf(csql_table2, "select count(%s) [data] from [zbar].[dbo].[data]group by [data]", data.c_str());
				Sql = csql_table2;
				//_variant_t value;
				_RecordsetPtr pRst(__uuidof(Recordset)); //实例化一个Recordset对象pRst
				_CommandPtr pCmd(__uuidof(Command)); //实例化一个Command对象pCmd
				pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConnection));
				pCmd->CommandText = (_bstr_t)Sql;
				pRst = pCmd->Execute(NULL, NULL, adCmdText);
				int valueline = pRst->GetCollect("data");
				//update [zbar].[dbo].[data] set [data]='12456'where [imag]='..\is1weima\_EAN-13_4589732812540.jpg  
				cout << "查询成功!" << endl;
				sprintf(csql_table3, "update [zbar].[dbo].[num] set [num]='%d'where [data]='%s'", valueline, data.c_str());
				Sql = csql_table3;
				pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConnection));
				pCmd->CommandText = (_bstr_t)Sql;
				pRst = pCmd->Execute(NULL, NULL, adCmdText);
				cout << "修改成功!" << endl;
				pRst.Release();
				pCmd.Release();
			}
			catch (_com_error e) {
				//cout << e.ErrorMessage() << endl;
				//cout << "修改失败!" << endl;
				sprintf(csql_table1, "INSERT INTO [zbar].[dbo].[num]([type],[data],[num]) VALUES('%s','%s','%d')", type.c_str(), data.c_str(), 1);
				Sql = csql_table1;
				_RecordsetPtr pRstR(__uuidof(Recordset)); //实例化一个Recordset对象pRst
				_CommandPtr pCmdR(__uuidof(Command)); //实例化一个Command对象pCmd
				pCmdR->put_ActiveConnection(_variant_t((IDispatch*)pConnection));
				pCmdR->CommandText = (_bstr_t)Sql;
				pRstR = pCmdR->Execute(NULL, NULL, adCmdText);
				cout << "添加成功!" << endl;
				pRstR.Release();
				pCmdR.Release();
			}
		}
		waitKey(1000); // 等待按下esc键,若需要延时1s则改用waitKey(1000);  
	}
    ...;
}

opencv识别多条形码数字_opencv测试代码 opencv识别多条形码数字_opencv测试代码

opencv识别多条形码数字_opencv测试代码

工程已上传,审核中… 

审核通过OpenCV识别多条形码链接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/223795.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 数仓ODS层建设_实时数仓架构

    数仓ODS层建设_实时数仓架构一、ODS层辨析ODS全称是OperationalDataStore,即操作数据存储。1.InmonVSKimballBill.Inmon的定义:ODS是一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息的需求。常常被作为数据仓库的过渡,也是数据仓库项目的可选项之一。而Kimball的定义:操作型系统的集成,用于当前、历史以及其它细节查询(业务系统的一部分);为决策支持提供当前细节数据(数据仓库的一部分)。2.ODSVSDB

  • 【AekdyCoin】求小于等于N的与N互质的数的和

    【AekdyCoin】求小于等于N的与N互质的数的和又向大牛学到了一点。以下内容转大牛文章:ifgcd(n,i)=1thengcd(n,n-i)=1(1反证法:如果存在K!=1使gcd(n,n-i)=k,那么(n-i)%k==0而n%k=0那么必须保证i%k=0k是n的因子,如果i%k=0那么gcd(n,i)=k,矛盾出现;于是问题变的非常简单ANS=N*phi(N)/2i,n-i总是成对

  • c语言延时函数nop,延时函数怎么写delay

    c语言延时函数nop,延时函数怎么写delay1.c语言延时函数delay,怎么算延时下面是delay函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为这个,在延迟函数里写一些无关紧要的东西,用来浪费电脑处理时间,从而达到延迟目的。数原型:原型:voidDelay(unsignedintnDelay){unsignedinti,j,k;…

  • 基于近邻的协同过滤算法「建议收藏」

    基于近邻的协同过滤算法「建议收藏」这节课我们来学习K近邻在推荐系统中的应用,你将完成本课程的第一个实战项目:基于KNN的电影推荐系统!为了使你能够顺利地完成实战内容,我们先了解一下推荐系统中的基础知识。基于近邻用户的协同过滤假定有一个场景:某个周日的下午,你感觉很无聊,然后从电脑上打开了一个视频网站,想看下最近有什么好看的电影。然而你发现网站上的热门电影基本都看过,其他的电影又太多,不知道该看什么。想使用搜索框去查一下,但是又不知道该搜什么关键词,这个时候你的内心很焦灼,总不能挨个去尝试吧,那时间成本也太大了…仔细想想还是有办法的,那

  • 国内一些比较大型的IT外包公司[通俗易懂]

    国内一些比较大型的IT外包公司[通俗易懂]下面的这些公司是我根据网上的资料整理出来的。找工作的同学都要看看,下面这些是国内一些比较大型的外包公司,想进外包公司的和不想进的都要了解一下,别进错了。序号公司名称英文备注1.博朗软件Bleum上海2.东软集团Neusoft沈阳3.大连华信-大连4.新致软件…

  • 浅谈数字音视频传输网络——AVB[通俗易懂]

    AVB有两种流格式:AM824和AAF。AM824支持24bit音频,iec60958音频编码(SPDIF和AES3),SMPTE时间码和MIDI。对于发送端AM824有三个选项“non-blocking(sync)”、“non-blocking(aync)”和“blocking”。流量整形是为了避免在以太网中发生丢弃数据的情况,通常采用漏桶算法(LeakyBucket)来完成流量整形或速率限制(RateLimiting)。它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号