在K230D BOX上配有摄像头及TF卡存储功能,从而为照片拍摄功能提供了有力的支持。此外,为了便于学习和使用该提供基本照片拍摄程序。
在K230D BOX开发板上配有两处MIPI摄像头接口,并位于CNK230DF板上,该接口可以直接连接K230D BOX开发板自带的GC2093摄像头模组。注意的是,默认情况下使用的是MIPI CSI2接口,即CNK230DF核心板上的J1接口,见图1所示。

图1 J1接口
在K230D BOX板上的是GC2093摄像头模块接口,见图2所示。

图2 J2接口
在按键的配合下,可将照片存储为JPG或BMP格式,见图3所示。

图3 生成2种格式文件
稍感不足的是,其文件名称是固定,这就造成后拍摄的内容会覆盖先拍摄的内容,一种格式的文件只能存在一个。
为便于实现连续拍摄的目的,将程序修改为自动命名文件名,这样就避免了同名覆盖的问题。
修改后的程序为:
import time, os, sys
from machine import Pin
from machine import FPIOA
from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口
import image #导入Image模块,使用Image相关接口
# 实例化FPIOA
fpioa = FPIOA()
# 为IO分配相应的硬件功能
fpioa.set_function(34, FPIOA.GPIO34)
fpioa.set_function(35, FPIOA.GPIO35)
# 构造GPIO对象
key0 = Pin(34, Pin.IN, pull=Pin.PULL_UP, drive=7)
key1 = Pin(35, Pin.IN, pull=Pin.PULL_UP, drive=7)
try:
try:
os.mkdir("/data/PHOTO")
except Exception:
pass
sensor = Sensor(width=1280, height=960) # 构建摄像头对象
sensor.reset() # 复位和初始化摄像头
sensor.set_framesize(Sensor.VGA) # 设置帧大小VGA(640x480),默认通道0
sensor.set_pixformat(Sensor.YUV420SP) # 设置输出图像格式,默认通道0
# 将通道0图像绑定到视频输出
bind_info = sensor.bind_info()
Display.bind_layer(**bind_info, layer=Display.LAYER_VIDEO1)
# 设置通道1输出格式,用于图像保存
sensor.set_framesize(Sensor.SXGAM, chn=CAM_CHN_ID_1) # 输出帧大小SXGAM(1280x960)
sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_1) # 设置输出图像格式,选择通道1
# 初始化LCD显示器,同时IDE缓冲区输出图像,显示的数据来自于sensor通道0。
Display.init(Display.ST7701, width = 640, height = 480, to_ide = False)
MediaManager.init() # 初始化media资源管理器
sensor.run() # 启动sensor
m=0
while True:
name="/data/PHOTO/photo"+str(m)+".jpg"
os.exitpoint() # 检测IDE中断
# 读取按键状态,并做相应的按键解释
if key0.value() == 0:
img = sensor.snapshot(chn=CAM_CHN_ID_1) # 从通道1捕获图像
img.save(name)
m=m+1
print("snapshot success") # 提示照片保存成功
time.sleep_ms(500)
if key1.value() == 0:
img = sensor.snapshot(chn=CAM_CHN_ID_1) # 从通道1捕获图像
img.save("/data/PHOTO/photo.bmp")
print("snapshot success") # 提示照片保存成功
time.sleep_ms(50)
time.sleep_ms(10)
# IDE中断释放资源代码
except KeyboardInterrupt as e:
print("user stop: ", e)
except BaseException as e:
print(f"Exception {e}")
finally:
# sensor stop run
if isinstance(sensor, Sensor):
sensor.stop()
# deinit display
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
# release media buffer
MediaManager.deinit()经程序运行,其连续拍照的测试效果如图4和图5所示,说明符合预期的设计目标。

图4 自动文件命名

图5 拍照内容
有了连续拍照功能,就为后续的人脸识别的注册管理提供了有效的支持。
我要赚赏金
