跳转至

USB摄像头静态图片拍摄

一、演示功能概述

Air8101工业引擎支持DVP和UVC两种不同协议标准的摄像头,DVP摄像头通过24PIN FPC连接器接入开发板,UVC摄像头通过USB-A接入开发板。

本文章用于帮助用户快速上手Air8101开发板实现UVC摄像头拍照功能,并配合串口工具将图片传到电脑打开查看,以及通过wifi网络上传到服务器查看。

二、准备硬件环境

1. 参考:硬件环境清单 - luatos@air8101 - 合宙文档中心,准备以及组装好基本硬件环境。

2. 参考:Air8101 开发板使用教程 ,准备组装好所需的摄像头,屏幕以及 LCD 扩展板。

三、准备软件环境

1. 烧录工具 Luatools

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V1002_Air8101.soc

3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/camera/usb_cam

4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板 - luatos@air8101 - 合宙文档中心,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。

5. LuatOS 工程文件:usb_camera_20250409.luatos

四、UVC摄像头拍照实现功能概述

4.1 本教程实现的功能定义是:

1、按下开发板上 wakeup k3 按键,启动拍照,并将拍摄的图片保存到指定文件中

2、处理拍摄的图片文件

(1)通过 f:read("*a") 读取图片数据,将数据通过串口工具保存成文件,在电脑上打开查看。

(2)通过wifi网络上传到服务器查看。

4.2 文章内容引用

1、API 接口介绍:https://docs.openluat.com/air8101/luatos/api/core/camera/

五、摄像头整体演示

5.1 图片数据通过串口上传至电脑

5.1.1 代码实现

完整 demo 参考:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/camera

1、初始化 uart,后续可以通过串口将图片导出到电脑

local uartid = 1 -- 根据实际设备选取不同的uartid
local uartBaudRate = 115200 -- 串口波特率
local uartDatabits = 8 -- 串口数据位
local uartStopBits = 1 -- 串口停止位

-- 初始化串口
uart.setup(uartid, uartBaudRate, uartDatabits, uartStopBits)

2、设置 USB 摄像头参数

local camera_id = camera.USB

-- 设置摄像头参数,最高支持200W像素
-- 1280 * 720 分辨率
-- 864 * 480 分辨率
-- 800 * 480 分辨率
-- 640 * 480 分辨率
local usb_camera_table = {
    id = camera_id,
    sensor_width = 1280,
    sensor_height = 720
}

3、摄像头初始化

camera.init(usb_camera_table) --摄像头初始化

4、按键事件

当我们按下 boot 按键,将会触发按键回调函数。此时会发送一个 "PRESS" 事件,并附带参数"KEY3"。

-- 按键触发拍照 Air8101开发板上按键 KEY3
local function press_key()
    log.info("boot press")
    sys.publish("PRESS", "KEY3")
end

gpio.setup(12, press_key, gpio.PULLUP, gpio.FALLING)
gpio.debounce(12, 300)

5、等待按键触发拍照

主 task 中,会有一个 while 循环,监听"PRESS"事件,等待到此事件且附带的参数是"KEY3"时,则触发下面的 camera.capture 拍照,保存到指定的 path 并读出图片文件数据后,通过串口将数据传送到电脑上。

while 1 do
    local result, param = sys.waitUntil("PRESS", 5000)
    log.info("PRESS", result, param)
    if param == "KEY3" then
        -- camera.init(usb_camera_table)
        camera.start(camera_id) --开始指定的camera
        camera.capture(camera_id, path, 1) --camera拍照并保存到指定路径
        result, data = sys.waitUntil("capture done", 30000)
        -- log.info("rawbuff_used:", rawbuff:used())
        camera.stop(camera_id) --停止指定的camera

        -- 通过串口保存文件
        local f = io.open(path, "r")
        local data
        if f then
            data = f:read("*a")
            log.info("fs", #data)
            f:close()
        end
        uart.write(uartid, data) --找个能保存数据的串口工具保存成文件就能在电脑上看了, 格式为JPG
    end
end

6、注册 camera 事件回调

当摄像头捕获数据完成,将会触发如下回调函数,此时日志信息中将会出现:"摄像头数据 xxxxx" 的内容。

-- 注册摄像头回调函数
camera.on(camera_id, "scanned", function(id, str)
    log.info("scanned", id, str)
    if type(str) == 'string' then
        log.info("扫码结果", str)
    elseif str == false then
        log.error("摄像头没有数据")
    else
        log.info("摄像头数据", str)
        sys.publish("capture done", true)
    end
end)

5.1.2 效果展示

1、本例展示拍照后将图片数据通过串口传到电脑,串口传送使用的 UART1。

2、找个能保存数据的串口工具保存成文件,本例使用的是 SSCOM,默认保存文件到 sscom 文件夹内。

3、烧录代码运行后,即可在 sscom 文件夹内看到拍的照片,记得将后缀改成.jpg 查看。

打开图片效果如下:

5.2 图片数据通过WIFI网络上传至服务器

上传到upload.air32.cn, 数据访问页面是 https://www.air32.cn/upload/data/

5.2.1 代码实现

-- 通过WIFI网络上传到服务器查看
上传到upload.air32.cn, 数据访问页面是 https://www.air32.cn/upload/data/
local code, resp = httpplus.request({
    url = "http://upload.air32.cn/api/upload/jpg",
    method = "POST",
    body = rawbuff
})
log.info("http", code)

5.2.2 效果展示

本例展示通过 WIFI 上传图片数据到服务器,并通过浏览器访问数据页面查看。

1. luatools日志显示如下:

2. 浏览器访问 https://www.air32.cn/upload/data/ 页面,查看上传的图片数据。

六、总结

在 LuatOS 中,camera 库使开发者能够高效地管理摄像头的启动、参数调整、实时数据处理功能。通过合理利用这些接口,开发者可以构建出具备流畅预览体验的摄像头应用程序,满足用户在多种拍摄场景下的需求。

七、常见问题

7.1 拍摄的图片数据无法通过串口传送

1. 检查下 uart 接线是否正确

2. 串口工具需要把 "接收数据到文件" 勾选上

3. 开发板烧录端口和传送图片的串口端口号检查下是否用反了,是否误把开发板烧录的串口端口号当做传送图片的串口端口号了。

八、扩展

后续扩展在此补充,敬请期待......