电脑摄像头识别二维码OpenCV程序

这个程序主要用zbar解码库来解析二维码的,ZBar是一个开源软件套件,用于从各种来源读取条形码,例如视频流,图像文件和原始强度传感器。 它支持许多流行的符号(条形码类型),包括EAN-13 / UPC-A,UPC-E,EAN-8,Code 128,Code 39,Interleaved 2 of 5和QR Code。
这里用电脑自带的WebCam采集图像,并对每一帧都进行识别,然后检测到码信息时将其写入到当前目录下的文件中方便观察,请看代码:

#include "zbar.h"        
#include "cv.h"        
#include "highgui.h"        
#include "iostream"
#include "fstream"

using namespace std;
using namespace zbar;  //添加zbar名称空间      
using namespace cv;

int main(int argc, char*argv[])
{

	VideoCapture VC(0);
	while (true)
	{
		ImageScanner scanner;
		scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);

		Mat image;
		VC.read(image);
		imshow("Source Image", image);
		if (!image.data)
		{
			cout << "请确认摄像头正确采集" << endl;
			system("pause");
			return 0;
		}
		Mat imageGray;
		cvtColor(image, imageGray, CV_RGB2GRAY);
		int width = imageGray.cols;
		int height = imageGray.rows;
		uchar *raw = (uchar *)imageGray.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;
		}
		else 
		{
			for (; symbol != imageZbar.symbol_end(); ++symbol)
			{
				cout << "类型:" << endl << symbol->get_type_name() << endl << endl;
				cout << "条码:" << endl << symbol->get_data() << endl << endl;
				//将检测的结果写到result.txt中方便查阅,追加方式写入的,
				ofstream fout("result.txt", ios::app);
				fout << "类型:" << symbol->get_type_name() << endl << "条码:" << symbol->get_data() << endl<<endl;
				fout.close();
				int key = cvWaitKey();
				if (key == 27) return 0;
			}
		}
			
		imageZbar.set_data(NULL, 0);
		int key = cvWaitKey(100);
		if (key == 27) return 0;
	}
	waitKey();
	return 0;
}

首先要去官网下载ZBar 0.10 Windows installer,然后将其库安装本地,将zbar/bin目录添加到系统的环境变量,然后将zbar/lib添加到VS的项目/属性/VC++目录/包含目录下,将zbar/include 添加到VC++目录/库目录下,在链接器-输入中添加libzbar-0.lib ,完工,运行代码试试吧!

OpenCV+zbar开源库实现摄像头识别二维码,测试验证识别率非常高,已实现简单的应用。 打包源码在VS2013下可以完全编译成功,附加包含OpenCV库及zbar-0.10-setup.exe,zbar-0.10.tar.bz2 下载Demo后需要安装 zbar-0.10-setup.exe 以下代码可以可以完成整个流程的开发,也可以贡献积分下载资源包。 1、 环境准备 (1) OpenCV库2.49 (2) ZBar开源库 (3) VS2013 2、 VS2013环境配置 (1) 配置附加包含目录 C/C++ -- 附加包含目录 include\opencv\include\ include\opencv\include\opencv include\opencv\include\opencv2 include (2) 配置链接器 链接器 -- 附加库目录 lib32\opencv\lib lib32 (3) 配置链接器 链接器--输入--附加依赖项 opencv_core249d.lib opencv_highgui249d.lib opencv_imgproc249d.lib libzbar-0.lib 3、 代码开发 (1)包含头文件 include include include include include include using namespace std; using namespace zbar; using namespace cv; (2)实现函数 void MatToCImage(cv::Mat &mat, CImage &cImage) { //create new CImage int width = mat.cols; int height = mat.rows; int channels = mat.channels(); cImage.Destroy(); //clear cImage.Create(width, height, 8 * channels); //默认图像像素单通道占用1个字节 //copy values uchar* ps; uchar* pimg = (uchar*)cImage.GetBits(); //A pointer to the bitmap buffer int step = cImage.GetPitch(); for (int i = 0; i (i)); for (int j = 0; j GetDlgItem(IDC_STATIC_IMG)->GetClientRect(▭); cv::VideoCapture capture(0);//从摄像头读入图像 while (!m_bCloseCamera) { cv::Mat frame; capture >> frame; cv::Mat newframe; cv::Size ResImgSiz = cv::Size(rect.Width(), rect.Height()); cv::resize(frame, newframe, ResImgSiz, CV_INTER_CUBIC); MatToCImage(newframe, imgDst); imgDst.Draw(pThis->GetDlgItem(IDC_STATIC_IMG)->GetDC()->GetSafeHdc(), rect); ImageScanner scanner; scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1); Mat imageGray; cvtColor(frame, imageGray, CV_RGB2GRAY); int width = imageGray.cols; int height = imageGray.rows; uchar *raw = (uchar *)imageGray.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()) { } else { iIndex++; if (iIndex > 999999) { iIndex = 0; } for (; symbol != imageZbar.symbol_end(); ++symbol) { char szInfo[1024]; memset(szInfo, 0, sizeof(szInfo)); sprintf(szInfo, "[d]类型:%s\r\n条码:%s\r\n", iIndex , symbol->get_type_name().c_str(), symbol->get_data().c_str()); pThis->GetDlgItem(IDC_EDIT1)->SetWindowText(szInfo); } } imageZbar.set_data(NULL, 0); } imgDst.Destroy(); capture.release(); return 0; }
OpenCV 是一个开源的计算机视觉库,可以用于实现许多图像和视频处理的任务。而 Jetson 是 NVIDIA 推出的一款高性能嵌入式计算平台,用于加速人工智能应用程序的开发和部署。 使用 OpenCV 实现通过摄像头识别二维码可以通过以下步骤来实现: 1. 首先,需要在 Jetson 上安装 OpenCV 库和相机驱动程序。可以通过 JetPack 以及 OpenCV 的官方文档进行安装和配置。 2. 在程序中导入 OpenCV 库,并创建一个 VideoCapture 对象,用于打开摄像头并捕获视频帧。 3. 使用循环来不断读取摄像头捕获的帧,并对每一帧进行二维码的检测。可以使用 OpenCV 中的 QRCodeDetector 类来实现,该类提供了对二维码的解码和检测功能。 4. 对每个检测到的二维码进行解码,获取二维码内容。可以通过调用 QRCodeDetector 类中的 detectAndDecode 方法来实现。 5. 在屏幕上显示二维码内容或将内容保存到文件中,以便后续使用。 需要注意的是,使用 Jetson 进行图像处理可能需要使用 GPU 加速来提高性能,可以通过 OpenCV 的 GPU 模块或使用 CUDA 来实现。另外,为了提高二维码的检测效果,可以根据实际情况进行参数的调整,如调整二维码的大小范围、检测的灵敏度等。 总结起来,通过在 Jetson 上使用 OpenCV 库和相机驱动程序,可以方便地实现通过摄像头识别二维码的功能。这可以在许多应用场景中使用,如物流追踪、社交媒体分享、支付扫码等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值