项目描述 项目介绍、设计思路
此次项目主要是基于Sipeed M1s Dock 实现的一个网络相机功能。首先完成摄像头的底层驱动,然后设置好板子wifi信息,然后通过python 脚本 建立tcp 连接,实时接收板子上传上来的图片信息,传送完一张照片后,取得相应照片的序号和时间戳,进行文件存储,存储到一定数量后,将所有图片文件进行生成视频。
框图和软件流程图
在E907 完成相关wifi 的驱动和设置,这里在固件中指定wifi的 ssid 及密码 及目标传送对象的ip 及端口号,当PC (传送对象) 建立了socket tcp 连接后, 开发板会进行相应的图片数据的传输,这里固定传输(800*600)的图像,通过对图片开头结尾的判断 是否已完成一个图片的接收,如果完成,将相应的图片存储到硬盘上,并存储相应文件列表,当文件达到一定数量后,将相应的文件进行转视频化处理,这里使用的是opencv的videowriter 函数,设定帧率为6 这里依据网络速度或者实际测算进行调整。
硬件介绍
- 主芯片 BL808 RISC-V 480Mhz + NPU BLAI-100,有三个核,此项目主要使用E907 和C906
- 板载 USB 转 UART 调试器(可实现一键点击烧录,无需按实体按键)
- 1.69 寸 240x280 电容触摸屏
- 200W 像素摄像头
- 支持 2.4G WIFI / BT / BLE
- 板载 1 个模拟麦克风、1 个 LED、1 个 TF 卡座
- 引出一路 USB-OTG 到 USB Type-C 接口
这里主要用板载USB 转UART 调试器进行烧录固件、c906代码,驱动摄像头
实现的功能及图片展示
主要实现的功能是建立连接后,保存100张图片,并存储100张照片的名字信息,当存储完成100张后,将100张图片进行视频合成
主要代码片段及说明
依据官网例程camera_streaming_through_wifi 修改 wifi 名 wifi 密码,并同时设定目标接收图片的ip地址及端口号
m1s_xram_wifi_init();
m1s_xram_wifi_connect("xinshuwei", "xinshuwei123");
m1s_xram_wifi_upload_stream("192.168.4.110", 8888);
使用最新的固件生成firmware,然后使用bl的uart 下载工具进行下载,实战操作下来感觉gui 来连接有问题,通过 exe 命令行方式比较稳定,这里整理下来如下,一把过,非常顺畅,给个赞
echo off
color 2e
.\bflb_iot_tool.exe --chipname=bl808 --port=COM11 --baudrate=2000000 --firmware="firmware_20230227.bin" --pt="partition_cfg_16M_m1sdock.toml" --boot2="boot2_isp_debug.bin"
pause
视频生成代码实现 ,file 传入所有图片的文件列表,使用opencv videoWriter 完成视频格式创建,然后进行所有图片读取合成
def makevideo(file):
video = cv.VideoWriter("video.avi",cv.VideoWriter_fourcc('I', '4', '2', '0'), 6,(800,600))
for i in file:
img = cv.imread(i)
video.write(img)
video.release()
主循环内 判断图片是否完成接收,如果完成接收,读取相应时间点的时间戳,并加文件序号进行保存,并将文件存储到list当中。完成一定数量的存储后,触发视频合成功能,然后退出。
pic_idx =1
pic_file=[]
while True:
# 接收客户端发送的数据, 这次接收数据的最大字节数是4
recv_data = tcp_client.recv(4)
mjpeg_len = int.from_bytes(recv_data, 'little')
#print("recv len: ", mjpeg_len)
tcp_client.send(recv_data)
recv_data_mjpeg = b''
remained_bytes = mjpeg_len
while remained_bytes > 0:
recv_data_mjpeg += tcp_client.recv(remained_bytes)
remained_bytes = mjpeg_len - len(recv_data_mjpeg)
#print("recv stream success")
if recv_data_mjpeg[:2] != b'\xff\xd8' \
or recv_data_mjpeg[-2:] != b'\xff\xd9':
continue
mjpeg_data = np.frombuffer(recv_data_mjpeg, 'uint8')
img = cv.imdecode(mjpeg_data, cv.IMREAD_COLOR)
date_time = datetime.now().strftime('%M-%S-%f')
file_name = f"{pic_idx}-{date_time}.png"
pic_file.append(file_name)
cv.imwrite(file_name, img)
print("file idx",pic_idx)
pic_idx =pic_idx+1
if(pic_idx>100):
makevideo(pic_file)
exit(0)
遇到的主要难题及解决方法
1.使用GitHub库不能生成编译代码 ,后来定位到编译器问题,重新使用gitee 地址代码及sdk 按照步骤一步步生成可完成编译,并能生成相应的demo
2.基于之前的环境更新sdk 后,发现firware 运行不正常,后来定位到e907的 目标地址和端口进行了指定,后来依据新的设定实现wifi socket连接
3.发现更新sdk 后编译代码部分demo 不生效,后来依据2月份的教程重新 构建及编译器,将版本回退到1.0 发现功能正常
未来的计划或建议
1.做图片处理和视频合成双线程
2.根据图片的时间戳实现图片的动态帧率转换成视频
3.附带传送音频数据等等
4.利用NPU 进行深度学习相关的demo
5.建议多举办这样的活动。