摄像头应用¶
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