DVP摄像头静态图片拍摄
一、演示功能概述
本篇文章用一个示例、两种不同的文件上传方式来演示 Air8101 开发板的 DVP 摄像头拍照功能。
第一种方式:Air8101 启动一个 HTTP 服务器,拍照后,将图片保存在自身文件系统中,电脑通过连接和 Air8101 相同的热点来访问 Air8101 保存的图片。
第二种方式:Air8101 拍照后,将图片保存在数据缓冲区中,然后将图片数据通过 HTTP POST 方式,上传至服务器,通过特定页面来访问拍到的照片。
二、准备硬件环境
2.1 Air8101 开发板底板
2.2 USB 转串口供电下载扩展板
2.3 DVP 摄像头
2.4 Type-C 接口的 USB 数据线
参考:硬件环境清单,准备以及组装好硬件环境。
三、准备软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools 工具;
2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V1003_Air8101.soc;
3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/camera/dvp_cam
4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
5. 本文用到的测试服务器:合宙 camera 测试服务器
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板 - luatos@air8101 - 合宙文档中心,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。
四、摄像头软件参考
camera - 摄像头 - luatos@air8101 - 合宙文档中心
五、代码示例介绍
5.1 软件代码介绍
代码中有详细的注释,可以用来参考:
PROJECT = "camerademo"
VERSION = "1.0.0"
sys = require("sys")
httpplus = require "httpplus"
local camera_id = camera.DVP
local dvp_camera_table = {
id = camera_id,
sensor_width = 1280,
sensor_height = 720
}
-- 摄像头回调
camera.on(camera_id, "scanned", function(id, str)
if type(str) == 'string' then
log.info("扫码结果", str)
elseif str == false then
log.error("摄像头没有数据")
else
log.info("摄像头数据", str)
sys.publish("capture_done")
end
end)
-- testMode等于1时演示摄像头拍照,将图片保存在根目录下,文件名为abc.jpg
-- 通过模块自身启动的一个http服务端访问图片,访问url为http://xxx.xxx.xxx.xxx/abc.jpg,其中xxx.xxx.xxx.xxx为模块ip地址
-- 需要用电脑或其他设备与模块连接同一热点
-- testMode等于2时,演示摄像头拍照,将图片数据存在zbuff中
-- 通过http post将拍照文件上传至upload.air32.cn,数据访问页面是 https://www.air32.cn/upload/data/
local testMode = 2
-- WIFI热点名称
local ssid = "uiot"
-- WIFI热点密码
local password = "12345678"
local rawbuff, err
sys.taskInit(function()
local result
-- 初始化WIFI
wlan.init()
-- 连接WIFI
wlan.connect(ssid, password)
while true do
-- 等待网络就绪消息,超时时间30秒
result = sys.waitUntil("IP_READY", 30000)
if result then
log.info("网络已就绪", result)
break
end
log.info("等待网络就绪超时")
end
if testMode == 1 then
log.info("演示模式一")
-- 启动HTTP服务
httpsrv.start(80, function()
end)
-- 初始化摄像头
result = camera.init(dvp_camera_table)
while 1 do
-- 初始化摄像头
-- camera.init(dvp_camera_table)
-- 启动摄像头
camera.start(camera_id)
-- 摄像头拍照并将数据保存在根目录下,文件名为abc.jpg
camera.capture(camera_id, "/abc.jpg", 1)
result = sys.waitUntil("capture_done", 30000)
camera.stop(camera_id)
-- 完全关闭摄像头才用这个
-- camera.close(camera_id)
if result then
log.info("拍照成功")
else
log.info("拍照失败")
end
-- 等待30秒
sys.wait(30000)
end
elseif testMode == 2 then
log.info("演示模式二")
rawbuff = zbuff.create(200 * 1024, 0, zbuff.HEAP_PSRAM)
if rawbuff == nil then
log.info("zbuff创建失败", err)
while true do
sys.wait(1000)
end
end
-- 初始化摄像头
camera.init(dvp_camera_table)
while 1 do
-- camera.init(dvp_camera_table)
-- 启动摄像头
camera.start(camera_id)
camera.capture(camera_id, rawbuff, 1)
result, param = sys.waitUntil("capture_done", 30000)
camera.stop(camera_id)
-- 完全关闭摄像头才用这个
-- camera.close(camera_id)
if result then
log.info("拍照成功")
local code, resp = httpplus.request({
url = "http://upload.air32.cn/api/upload/jpg",
method = "POST",
body = rawbuff
})
log.info("http", code, resp)
if code == 200 then
log.info("上传成功")
else
log.info("上传失败")
end
else
log.info("拍照失败")
end
rawbuff:resize(200 * 1024)
-- 等待30秒
sys.wait(30000)
end
else
log.info("不支持的演示模式")
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
5.2 效果展示
用手机或电脑先开一个热点,热点名称修改为:uiot, 密码修改为:12345678。
这里以电脑端为例,首先修改热点名称和密码。
5.2.1 演示模式 1 - 拍摄图片保存于根目录
首先将代码中 testMode 设置为 1。
烧录完毕后查看 luatools 打印日志。如图,在日志中找到 Air8101 连上 WiFi 后分配的 IP 地址
待到日志打印"拍照成功",则说明数据已保存
在网页上输入 http://xxx.xxx.xxx.xxx/abc.jpg,其中 xxx.xxx.xxx.xxx 为模块 ip 地址,即可查看已拍摄图片。
5.2.2 演示模式 2 - 拍摄图片上传至服务器
首先将代码中 testMode 设置为 2
烧录完毕后查看 luatools 打印日志。现实上传成功,则说明已上传到服务器
这里我们使用的是合宙测试服务器,在网页打开服务器地址,选择到我们刚才拍摄的照片
打开即可看到效果。
六、总结
至此,我们已使用 Air8101 开发板验证了 DVP 摄像头的拍照以及文件上传功能。