Skip to content

摄像头应用

1. 文档概述

1.1 文档目的

本文档旨在详细说明模组外接camera 的硬件连接、软件接口及使用的注意事项。功能覆盖拍照/预览/图片压缩/扫码/数据存储/数据传输等场景,如智能扫码设备、智能水表/电表/气表等

功能 状态 备注
拍照 已实现 支持YUV和ONLY Y格式
预览 开发中
图片压缩(JPEG) 已实现 支持YUV/ONLY Y数据编码成jpeg
扫码 (ZBAR) 已实现 支持一维码(CODE128 EAN-13)、 二维码(QR CODE)识别

1.2 系统框图

2. 硬件环境

以8W camera bf3a02为例, 主要包含PIN脚连接

camera 管脚名称 camera pin号 X09S 信号名称 X09S pin号 FUNC
CAM PWDN 1 CAM_PWDN 16 0
CAM D0 2 CAM_SPI_D0 74 6
CAM SCL 3 CAM_I2C_SCL 67 1
CAM SDA 4 CAM_I2C_SDA 66 1
CAM MCLK 5 CAM_MCLK 23 6
CAM GND 6 GND
CAM PCLK 7 CAM_SPI_CLK 101 6
CAM GND 8 GND
3V 9
CAM LED 10 CAM LED 20 0

3. 软件环境

下载yopen代码

git clone https://gitee.com/yuge-info/yopen.git

关键代码

  • 围绕 Camera 功能搭建多组件协同的软件架构,各组件功能及关联接口如下:
组件/头文件 功能 相关接口定义
components\camera camera组件、提供拍照、预览(开发中),支持 YUYV、ONLY Y、RGB565 数据格式输出 cameraDev.h
components\lcd lcd组件、支持 Camera 数据预览显示(开发中) lcdDrv.h
components\zbar zbar组件、默认支持指定一维 / 二维码识别,可配置编码格式 zbar.h、zbar_config.h
components\jpeg jpeg组件、支持 YUYV/ONLY Y 格式转 JPEG tiny_jpeg.h
components\ftp ftp组件、实现压缩后图片向服务器终端设备的上传 ftpClient.h
yopen_fs.h 文件系统接口、用于存储压缩后的图片
yopen_uart.h 串口接口、用于传输数据在PC显示
yopen_power.h pwrkey接口、通过pwrkey按键触发拍照功能
  • 文档提供 2 个核心 Demo,覆盖 Camera 核心场景的实现逻辑:
  • demo_camera.c:pwrkey 按键触发拍照 → JPEG 压缩 → FTP 上传压缩数据 + 本地文件系统同步保存。
  • demo_zbar.c:拍照采集条码数据 → 传入 zbar 解码接口 → 解析并输出编码类型、编码内容。

demo_camera.c 介绍

  • 打开camera, 采集yuyv数据
cameraDrvFunc_t* drv =  CamOpen("bf30a2_1sdr", NULL, false);
  • 拍照,获取一帧数据
char* pic = camTakePicture(drv); 
  • jpeg编码, 保存到文件系统中
#define CONFGI_JPG_PATH "output.jpg"

jpeg_encode(pic, CONFGI_JPG_PATH);

static void jpeg_encode(char *src, char *output_path)
{
    int width = IMG_WIDTH;
    int height = IMG_HEIGHT;
    int quality = IMG_ENCODE_QUALITY;

    if (width <= 0 || height <= 0 || quality < 1 || quality > 3) {
        DEMO_CAMERA_TRACE("Invalid parameters!\n");
        return;
    }

    if (yuyv422_to_jpeg(src, output_path, width, height, quality)) {
        DEMO_CAMERA_TRACE("Successfully converted  %s\n", output_path);
    } else {
        DEMO_CAMERA_TRACE("Conversion failed!\n");
    }
}
static int yuyv422_to_jpeg(const char* src, const char* output_path, int width, int height, int quality)
{
    // 编码为 JPEG
    int result = tje_encode_to_file_at_quality(output_path, quality, width, height, 3, (const unsigned char*)src);
    yopen_trace("tje_encode_to_file_at_quality result %d", result);
    return result;
}
  • ftp 上传
ftp_upload(CONFGI_JPG_PATH);

void ftp_upload(char *filename)
{
    static NetBuf_t* ftpClientNetBuf = NULL;
    yopen_nw_reg_status_info_s nw_status;

    FtpClient* ftpClient = getFtpClient();

    yopen_nw_get_reg_status(0, &nw_status);

    if(nw_status.data_reg.state != YOPEN_NW_REG_STATE_HOME_NETWORK &&
        nw_status.data_reg.state != YOPEN_NW_REG_STATE_ROAMING)
    {
        yopen_trace("=== ftp upload network not ready ===");
        return;
    }

    yopen_trace("=== ftp upload ftpClient %x ===", ftpClient);

    int connect = ftpClient->ftpClientConnect(CONFIG_FTP_SERVER, CONFIG_FTP_PORT, &ftpClientNetBuf);
    yopen_trace("=== ftp upload connect %d ===", connect);

    int login = ftpClient->ftpClientLogin(CONFIG_FTP_USER, CONFIG_FTP_PASSWD, ftpClientNetBuf);
    yopen_trace("=== ftp upload login %d ===", login);

    int put = ftpClient->ftpClientPut(filename, filename, FTP_CLIENT_BINARY, ftpClientNetBuf);
    yopen_trace("=== ftp upload put %d ===", put);

    ftpClient->ftpClientQuit(ftpClientNetBuf);
    yopen_trace("=== ftp upload quit %d ===");
}

demo_zbar.c介绍

  • 打开camera, 采集ONLY Y数据
cameraDrvFunc_t* drv =  CamOpen("bf30a2_1sdr", NULL, true);
  • 拍照, 获取一维码、二维码数据
char* pic = camTakePicture(drv); 
  • 解析,输出编码格式和内容
prvZbarScannerRun(240, 320, 240*320, pic);

static void prvZbarScannerRun(int width, int height, int size, unsigned char *dataInput)
{
    int len;
    char *data;

    int handle = zbar_scanner_open(width, height, size, (unsigned char *)dataInput);

    if (handle)
    {
        do
        {    
            data = zbar_get_data(handle, &len);
            data[len] = 0;

            yopen_trace("zbar_scan: %s,%d,%s", zbar_get_type(handle), len, data);

        }while(zbar_find_nextData(handle) > 0);

        zbar_scanner_close(handle);
    }
    else
    {
        yopen_trace("zbar_scan: no data");
    }
}

工程编译

# 命令行下执行  demo描述:按键触发拍照 → JPEG 压缩 → FTP 上传压缩数据 + 本地文件系统同步保存。
build.bat YM310_X09S.U62 camera

# 命令行下执行 demo描述:拍照采集条码数据 → 传入 zbar 解码接口 → 解析并输出编码类型、编码内容。
build.bat YM310_X09S.U62 zbar