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. 开发板烧录端口和传送图片的串口端口号检查下是否用反了,是否误把开发板烧录的串口端口号当做传送图片的串口端口号了。
八、扩展
后续扩展在此补充,敬请期待......