stm32 上用 Zbar 库识别BMP格式二维码

目前能在网上找到的二维码资料,都是编码居多,也就是从一串字符串生成二维码(常用算法如 QRCode),而解码识别方面的参考教程比较少。二维码解码库有 Quirc、Zbar 等,更多的开发者是用在安卓、OpenCV 和 Python 等高级环境上,对于 MCU 级别的使用,并且基本是经过封装后的实现,灵活性较差。于是便想着自己从头使用 Zbar 库的接口,实现图片中的二维码检测及识别。

测试环境
开发板:STM32F429I Disco
CPU:Arm® 32-bit Cortex®-M4 180 MHz
内存:2Mbytes Flash, 256KMbytes RAM, 64-Mbit 外部 SDRAM
软件:RT-Thread 操作系统

实现过程
这里说明一下,Zbar 库要求输入的是灰度图像数据(也就是黑白照),每个像素用一个字节表示灰度,从 0x00 全白到 0xff 全黑,有了图像数据,再传入图像的宽高便能解码了。
通过 Zbar 库识别二维码,大致可以分为下面 3 个过程:
1.创建配置 image_scanner、zbar_image 对象,并设置图像信息
2.扫描图像并识别
3.提取解码结果

我写了一个函数,能够直接读取 bmp 8 位灰度图片(因为 bmp 文件包含了图像数据便于处理),并打印输出其中的二维码识别结果:

 #include <rtthread.h>
#include <rtdevice.h>

#include "zbar.h"

#define BITMAP_IMG_OFFSET               0x0A
#define BITMAP_IMG_WIDTH_OFFSET         0x12
#define BITMAP_IMG_HEIGHT_OFFSET        0x16
#define BITMAP_IMG_FILE_SIZE_OFFSET     0x02

zbar_image_scanner_t *rt_scanner = NULL;

void qr_bitmap_decoder(const rt_uint8_t *img_buffer)
{
    /* create a reader */
    rt_scanner = zbar_image_scanner_create();

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

    /* obtain image data */
    void *raw = (void *)img_buffer;

    int img_width = *(int *)(&img_buffer[BITMAP_IMG_WIDTH_OFFSET]);
    int img_height = *(int *)(&img_buffer[BITMAP_IMG_HEIGHT_OFFSET]);
    int img_offset = *(int *)(&img_buffer[BITMAP_IMG_OFFSET]);
    int file_size = *(int *)(&img_buffer[BITMAP_IMG_FILE_SIZE_OFFSET]);

    rt_kprintf("img_info: width=%d, height=%d, file_size=%d\n", img_width, img_height, file_size);

    /* wrap image data */
    zbar_image_t *image = zbar_image_create();
    zbar_image_set_format(image, *(int*)"Y800");
    zbar_image_set_size(image, img_width, img_height);
    zbar_image_set_data(image, (void *)(&img_buffer[img_offset]), img_width * img_height, zbar_image_free_data);

    /* scan the image for barcodes */
    int n = zbar_scan_image(rt_scanner, image);

    /* 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);
        rt_kprintf("decoded %s symbol "%s"\n",
               zbar_get_symbol_name(typ), data);
    }

    /* clean up */
    zbar_image_destroy(image);
    zbar_image_scanner_destroy(rt_scanner);
}

运行结果
来看下实测的识别效果,RT-Thread 提供了 finsh Shell,可以很方便地使用命令行的方式运行写好的测试例程:
样本1(图片尺寸 256256,纯二维码):
在这里插入图片描述
样本2(图片尺寸 480
360,摄像头拍摄):
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV和ZBar是两个常用的开源,可以用于实现摄像头识别二维码的功能。 首先,OpenCV是一款用于计算机视觉的开源,它提供了丰富的图像处理和计算机视觉算法,可以用来处理图像和视频。OpenCV支持各种程序设计语言,包括C++、Python等,因此非常方便开发者进行二维码的图像处理和识别。 而ZBar是一款专门用于二维码和条形码扫描的开源。它提供了各种功能强大的接口,可以对摄像头捕捉到的图像进行二维码识别ZBar支持多种编程语言,如C、C++、Python等,因此可以与OpenCV结合使用。 要实现摄像头识别二维码的功能,可以按照以下步骤进行: 1. 首先,使用OpenCV打开摄像头,获取实时图像流。 2. 将摄像头捕捉到的图像传递给ZBar进行二维码识别ZBar提供了相关的函数和接口,可以将摄像头捕获的图像进行处理,并识别其中的二维码。 3. 当ZBar识别二维码时,可以通过回调函数或其他方式将识别到的二维码信息传递给应用程序,可以对识别到的二维码进行相关的操作,如解析二维码内容,打开对应的链接或进行其他业务处理。 总的来说,通过将OpenCV和ZBar结合使用,我们可以实现摄像头实时识别二维码的功能。这样,我们可以利用摄像头实时获取图像流,并通过ZBar对图像进行识别,从而实现对二维码的实时扫描和处理。 ### 回答2: OpenCV是一个开源的计算机视觉,提供了丰富的图像处理和计算机视觉算法。而ZBar是一个开源的条码和二维码识别,能够通过摄像头进行实时的二维码识别。 使用OpenCV和ZBar实现摄像头识别二维码的步骤如下: 1. 首先,我们需要使用OpenCV中的VideoCapture类来打开摄像头,并获取实时的视频帧。 2. 在每一帧中,我们将使用ZBar提供的二维码识别功能。通过将每一帧转换为灰度图像,可以提高识别效果。 3. 在灰度图像上,我们可以使用ZBar的Scanner类进行二维码的扫描。Scanner类可以检测到图像中的所有二维码,并返回相关信息。 4. 当扫描到二维码时,我们可以从Scanner类中获取二维码的内容。 5. 最后,我们可以使用OpenCV提供的绘图功能,在视频帧上标记出识别到的二维码的位置和内容。 通过以上步骤,我们可以实现摄像头实时识别二维码的功能。这种方法可以应用于一些需要实时扫描二维码的场景,例如门禁系统、物流追踪等。同时,OpenCV和ZBar的开源特性也使得开发者能够根据自己的需求进行定制和修改,提高二维码识别的准确率和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值