Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
成功在 stm32 上用 Zbar 库识别二维码!
发布于 2019-06-29 12:01:28 浏览:4950
订阅该版
[tocm] 目前能在网上找到的二维码资料,都是编码居多,也就是从一串字符串生成二维码(常用算法如 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 文件包含了图像数据便于处理),并打印输出其中的二维码识别结果: ```c #include
#include
#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
", 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\"
", zbar_get_symbol_name(typ), data); } /* clean up */ zbar_image_destroy(image); zbar_image_scanner_destroy(rt_scanner); } ``` ### 运行结果 来看下实测的识别效果,RT-Thread 提供了 finsh Shell,可以很方便地使用命令行的方式运行写好的测试例程: 样本1(图片尺寸 256*256,纯二维码):  样本2(图片尺寸 480*360,摄像头拍摄): 
查看更多
7
个回答
默认排序
按发布时间排序
wuhanstudio
2019-06-29
这家伙很懒,什么也没写!
Upvote {:3_41:}
shadowliang
2019-06-29
Hello,world!!!
楼主666,学习了,感谢分享。
bernard
2019-06-29
这家伙很懒,什么也没写!
zbar也移植了,很赞。未来RT-Thread可以把camera处理得更好些,可以直接做些图像识别
flyboy
2019-06-29
Do my self();
楼主666,期待楼主的软件包:D
dop101
2019-11-01
这家伙很懒,什么也没写!
我做的跟楼主的差不多,也是在BMP格式的图片,然后转换成为8位灰度图片。读出数据,用zbar,这一步n = zbar_scan_image(rt_scanner, image);算出的一直是0.就识别不出图像。读入数据应该没问题,写到txt里面和原图对比灰度图片对比了。一样的,可是就是解析不出来。不知道哪里出错了。和原库的ImageMagic工具库读出来的图形和数据,我bmp的灰度图形对比确实差别比较大。难道不能直接读灰度图像?
xiaoyu
2022-01-26
这家伙很懒,什么也没写!
楼主源码有么 整个工程可以看下嘛
撰写答案
登录
注册新账号
关注者
0
被浏览
5k
关于作者
jijigojiji
这家伙很懒,什么也没写!
提问
3
回答
4
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RTT串口查找函数使用过程中遇到的问题。
2
RT-Thread CI编译产物artifacts自动上传功能介绍
3
STM32G030移植RT-Thread
4
CubeMX & RT-Thread Studio 联合开发说明
5
RT-Thread项目助手v0.3 | Ubuntu与MacOS平台的RT-Thread Env
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
cubemx
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
Debug
SFUD
ulog
msh
C++_cpp
MicroPython
本月问答贡献
lchnu
5
个答案
3
次被采纳
三世执戟
9
个答案
2
次被采纳
张世争
1
个答案
2
次被采纳
a1012112796
14
个答案
1
次被采纳
聚散无由
5
个答案
1
次被采纳
本月文章贡献
jinchanchan
12
篇文章
14
次点赞
ssdd45555
3
篇文章
2
次点赞
lvdongchina
2
篇文章
1
次点赞
聚散无由
1
篇文章
4
次点赞
RTT_逍遥
1
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部