esp32s3 zbar解码测试

使用的是zbar 0.10版本,网上找下源码就行,下载下来放到工程components目录下,然后在zbar中增加一个CMakeLists.txt,内容如下

set(srcs
    zbar/config.c
    zbar/decoder.c
    zbar/decoder/qr_finder.c
    zbar/error.c
    zbar/img_scanner.c
    zbar/qrcode/bch15_5.c
    zbar/qrcode/binarize.c
    zbar/qrcode/isaac.c
    zbar/qrcode/qrdec.c
    zbar/qrcode/qrdectxt.c
    zbar/qrcode/rs.c
    zbar/qrcode/util.c
    zbar/refcnt.c
    zbar/scanner.c
    zbar/symbol.c
    zbar/image.c
  )

set(include_dirs
    .
    include
    zbar
  )

set(priv_include_dirs
    .
    include
    zbar
  )

idf_component_register(
  SRCS ${srcs}
  INCLUDE_DIRS ${include_dirs}
  REQUIRES driver
)                       

target_compile_options(${COMPONENT_LIB} PRIVATE -Wno-error=parentheses -Wno-error=duplicate-decl-specifier -Wno-error=logical-not-parentheses -Wno-error=format=)

测试代码,找个图片生成一个灰度数组进行测试
静态数组为240x240的灰度数据,数据太多,这里不全

uint8_t data_buf[] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    ...
#include <zbar.h>

void zbar_scan(unsigned char *image_data,int width,int height)
{
    zbar_image_t *zbar_image = zbar_image_create();
    zbar_image_set_format(zbar_image, *(int*)"Y800");
    zbar_image_set_size(zbar_image, width, height);
    uint8_t *qrcodedata = (uint8_t *)calloc(width*height, sizeof(uint8_t));
    memcpy(qrcodedata,image_data,width*height);
    //zbar_image_set_data(zbar_image, image_data, width * height, zbar_image_free_data);
    zbar_image_set_data(zbar_image, qrcodedata, width * height, zbar_image_free_data);
    // 创建图像扫描器
    zbar_image_scanner_t *scanner = zbar_image_scanner_create();
    // 配置扫描器(可选)
    zbar_image_scanner_set_config(scanner, ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);
    // 扫描图像
    int n = zbar_scan_image(scanner, zbar_image);
    if (n > 0) {
        // 处理扫描结果
        const zbar_symbol_set_t *symbols = zbar_image_scanner_get_results(scanner);
        const zbar_symbol_t *symbol = zbar_symbol_set_first_symbol(symbols);
        for (; symbol; symbol = zbar_symbol_next(symbol)) {
            // 打印二维码内容
            const char *data = zbar_symbol_get_data(symbol);
            if(data != NULL)
                printf("二维码内容: %s\n", data);
        }
    } else {
        printf("没有检测到二维码\n");
    }

    // 清理资源
    zbar_image_destroy(zbar_image);
    zbar_image_scanner_destroy(scanner);
}

在main.c中调用

zbar_scan(data_buf,240,240);

速度比quric快很多。
如果提示找不到zbar在main同级目录下的CMakeLists.txt idf_component_register中增加

PRIV_REQUIRES zbar-0.10

不同的环境错误可能不一样,只能一个个试.
在这里插入图片描述
8位二维码灰度数组内容1234567890
python图像转8位灰度数组脚本

======================================
作者:hclydao
http://blog.csdn.net/hclydao
版权没有,但是转载请保留此段声明

=======================================

### ESP32-S3 TFT JPEG解码教程 #### 硬件准备 为了在ESP32-S3上实现TFT显示并进行JPEG解码,硬件部分需要准备好带有ST7789控制器的TFT显示屏以及相应的连接线材。确保这些组件能够通过GPIO接口与ESP32-S3稳定通信。 #### 软件环境搭建 安装最新版本的Arduino IDE,并配置好支持ESP32开发板的相关库文件。这一步骤可以通过Preferences中的Additional Boards Manager URLs添加官方链接完成[^2]。 #### 库的选择与集成 对于JPEG解码而言,可以考虑使用`jpgdec`库来处理图像数据流;而对于屏幕控制,则依赖于Adafruit_ST7789库或者其他兼容该型号显示器驱动程序的替代品。这两个库均需下载并导入到项目当中。 #### 提升性能策略 鉴于JPEG解码过程可能成为影响帧率的关键因素之一,在此推荐利用S3双核特性来进行优化操作——即让其中一个核心专注于执行解码任务的同时另一个负责其他工作负载分配,以此达到加速目的[^1]。 #### 示例代码展示 下面给出一段简化版示例代码用于说明如何结合上述提到的技术要点: ```cpp #include "JpgDec.h" #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 chips #define TFT_CS 5 #define TFT_DC 18 #define TFT_RST 19 #define TFT_MOSI 23 #define TFT_SCLK 19 #define TFT_BL 04 // Initialize the display using SPI interface and hardware pins defined above. Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); void setup() { Serial.begin(115200); // Initialization of the screen with specific parameters like rotation angle etc. tft.init(240, 240); // Init ST7789 240x240 tft.setRotation(1); jpgdec_init(); // Initialize JPG decoder } void loop() { uint8_t* imgData; // Pointer to image data buffer int imgSize; // Assume we have a function that fetches an image over network or from storage into &#39;imgData&#39; variable, // And its size is stored in &#39;imgSize&#39;. fetchData(&imgData,&imgSize); // Perform decoding on one core while keeping UI responsive by offloading tasks onto another core here... xTaskCreatePinnedToCore( decodeAndDrawImage, /* Task function */ "Decode Image", /* name of task */ 10000, /* Stack size (configMINIMAL_STACK_SIZE * n) */ &imgData, /* Parameter passed as input */ 1, /* Priority */ NULL, /* Task handle. */ 0 /* Core where the task should run */ ); delay(5000); // Wait before fetching next frame/image } void decodeAndDrawImage(void *parameter){ uint8_t* imageDataPtr=(uint8_t*) parameter; JDEC jd; // Create decompression object JRESULT jres; BITMAP bmp; UINT row; const void* src; UINT len; // Prepare for decompressing jpeg file pointed at by `imageDataPtr`. if ((jres = jd_prepare(imageDataPtr , read_jpeg_data, NULL)) != JDR_OK ) {return;} // Get bitmap information about decoded picture dimensions. jd_getbitmap(&jd, &bmp, NULL); // Draw each scan line directly onto framebuffer via DMA transfer ideally but simplified version shown below: for(row=0 ;row<bmp.height && row<240; ++row){ if((src = jd_rowptr(&jd,row,&len))==NULL || len!=(size_t)(bmp.width*bmp.pixelsize)){ break; } drawRow(src,bmp.width,tft); } vTaskDelete(NULL); // Delete this task after finishing drawing all rows. } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值