基于STM32F103的二维码识别项目——Zbar库移植篇

无线手持二维码识别项目是中山大学电子与信息工程学院(微电子学院)的工程应用训练课程的设计要求。项目是基于STM32F103开发的,开源代码:stm32f103zet6-qrcode-detect,bilibili:基于STM32F1的无线手持二维码识别项目。CSDN总目录:基于STM32F103的二维码识别项目。项目移植了Zbar库进行二维码识别,而非使用二维码识别模块。

此篇文章讲述Zbar库移植的实现。

二维码开源库ZBar-MDK STM32F429移植

二维码开源库ZBar STM32F429 移植-OpenEdv-开源电子网

STM32H5移植zbar记录 - Jayson_Ge - 博客园 (cnblogs.com)

前排感谢大佬们实现移植!

跟着教程走即可,注意下面的图的这两步不需要跟着做了。

在这里插入图片描述

我们使用正点原子的内存管理机制,移植他们的malloc函数进行内存管理。同时,我们使用了SRAM,所以也借鉴了正点原子这方面的代码。

【正点原子】战舰版视频(STM32F103)-哔哩哔哩之外部SRAM

【正点原子】战舰版视频(STM32F103)-哔哩哔哩之内存管理

移植后的具体代码在项目中详见下图:

在这里插入图片描述

Zbar移植后主函数最重要的代码部分为:

int Zbar_Test( int width, int height)
{
	  int a;
	  void *raw = (void* )data_buf;

	  zbar_image_scanner_t *scanner = NULL;
    /* create a reader */
    scanner = zbar_image_scanner_create();

    /* configure the reader */
    zbar_image_scanner_set_config(scanner, 0, ZBAR_CFG_ENABLE, 1);


    /* wrap image data */
    zbar_image_t *image = zbar_image_create();
    zbar_image_set_format(image, *(int*)"Y800");
    zbar_image_set_size(image, width, height);
    zbar_image_set_data(image, raw, width * height, zbar_image_free_data);

    /* scan the image for barcodes */
    int n = zbar_scan_image(scanner, image);
		if(n==0){LED4_ON();}
		else{LED5_ON();}
    printf("识别的二维码个数为 = %d\r\n", n);
    /* extract results */
    const zbar_symbol_t *symbol = zbar_image_first_symbol(image);
    for(; symbol; symbol = zbar_symbol_next(symbol)) {
        /* do something useful with results */
        zbar_symbol_type_t typ = zbar_symbol_get_type(symbol);
        const char *data = zbar_symbol_get_data(symbol);
        printf("识别为 %s 结果是 \"%s\"\r\n",
    }

    /* clean up */
    zbar_image_destroy(image);
    zbar_image_scanner_destroy(scanner);

    return(0);
} 	

注意该函数需要传入你需要检测的图片的长和宽,且Zbar的检测需要送入灰度图进行检测,不过博主为了方便直接将图片简单的二值化,也可以正常识别。之后函数通过 zbar_image_destroy(image);和 zbar_image_scanner_destroy(scanner);在检测后释放内存。

二值化的过程比较粗暴,但是能用,也就没有继续修改了。

		if(color > 0x4500)
		{
			color = 0xffff;
			colorQR = 0xff;
		}
		else
		{
			color = 0x0000;
		  colorQR = 0x00;
		}

接下来是主函数里面的Init的一些说明,注意width和height在这里定义了,这个就是送去Zbar检测的长和宽,如果要修改代码这里的长宽要改掉。还有一个巨坑的bug:FSMC_SRAM_Init();、my_mem_init(SRAMIN);和my_mem_init(SRAMEX);必须放在最后,如果放在前面其他的初始化函数放在后面会直接导致程序跑飞。

    GPIO_Config();//LED GPIO 初始化
	USART_Config();
	Systick_Config(72);
    Buzzle_Init();

	uint16_t width=240;
	uint8_t height = 240;
	
	int i=0;
	SystemInit();//初始化RCC 设置系统主频为72MHZ
	LCD_Init();	   //液晶屏初始化
	LCD_Clear(0xffff);
	LCD_Clear(BLUE);
	i=OV7670_Init();
	delay_ms(1500);	
	OV7670_Light_Mode(0);
	OV7670_Color_Saturation(2);
	OV7670_Brightness(2);
	OV7670_Contrast(2);
 	OV7670_Special_Effects(0);
	EXTI7_Init();		
	OV7670_CS=0;	
	LCD_Clear(BLACK);
	delay_ms(1500);	
	UART4_Init();
    USART2_Init();
	UART4_Init();
	LED_Init();
	
	FSMC_SRAM_Init();//初始化FSMC
	my_mem_init(SRAMIN);		//初始化内部内存池
	my_mem_init(SRAMEX);		//初始化内部内存池 内部内存池不够用
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于STM32二维码识别系统设计和实现可以分为硬件设计和软件设计两个部分。 硬件设计:首先,选择适合的STM32芯片作为主控,并添加相应的外设,如相机模块、触摸屏等。接下来,搭建合理的电路连接,包括电源管理、IO口配置等。同时,考虑到二维码扫描需求,需要使用合适的镜头来实现对二维码的捕捉和图像采集。确保系统稳定可靠的工作。 软件设计:首先,编写相应的驱动程序,包括摄像头驱动程序、显示屏驱动程序等。其次,设计二维码识别算法,根据相机拍摄的图像进行二维码的定位与解码。常用的二维码识别算法有ZBar等,可以根据实际需要进行选择。最后,设计用户界面,通过触摸屏等交互方式,进行扫描、识别二维码,并输出结果。 在实际操作中,可以先进行硬件电路的搭建和焊接,然后进行相应的底层软件驱动的编写和调试。随后,进行二维码识别算法的开发和优化,最后进行整体的集成测试和系统调试。系统调试完成后,还可以根据实际使用需求添加其他功能,如数据存储、远程上传等。 总之,基于STM32二维码识别系统的设计和实现需要充分考虑硬件和软件两个方面,通过合理的硬件搭建和驱动编写,以及有效的二维码识别算法,能够实现高效、准确的二维码扫描与识别功能。 ### 回答2: 基于STM32二维码识别系统的设计与实现如下: 首先,我们需要选择合适的硬件平台。在这个项目中,我们选择了STM32微控制器作为主控芯片,它具有高性能和低功耗的特点,适合用于嵌入式系统。 接下来,我们需要一个合适的二维码识别算法。通常情况下,我们可以选择一种开源的二维码识别,例如ZBar或ZXing。这些支持多种类型的二维码,包括QR码和Data Matrix码。 然后,我们需要设计硬件接口。STM32的GPIO引脚可以用来连接摄像头模块,用于捕获图像。STM32还可以与LCD显示屏和键盘等外设进行通信,以便进行用户交互和结果显示。 在软件方面,我们需要编写相应的驱动程序来控制摄像头模块和LCD显示屏。同时,我们还需要编写二维码识别算法的接口程序,将图像数据传递给识别,并获取识别结果。 最后,我们可以将系统的整体功能进行测试和调试。我们可以通过将摄像头对准包含二维码的物体,并观察LCD屏幕上是否能正确显示识别的结果来验证系统的性能。 总结起来,基于STM32二维码识别系统的设计与实现涉及硬件的选择和接口设计,以及软件的编程和测试。通过合适的硬件和软件协同,该系统能够快速、准确地识别二维码,并展示识别结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值