2023年寒假在家练-基于M1S-Dock 实现的网络相机
完成一个基于Sipeed M1s Dock 的网络相机,实现相机的驱动,并将图片通过网络传到电脑上,并能实现长时间拍摄
标签
2023寒假在家练
M1s
网络相机
xinshuwei
更新2023-03-28
274

项目描述 项目介绍、设计思路

此次项目主要是基于Sipeed M1s Dock 实现的一个网络相机功能。首先完成摄像头的底层驱动,然后设置好板子wifi信息,然后通过python 脚本 建立tcp 连接,实时接收板子上传上来的图片信息,传送完一张照片后,取得相应照片的序号和时间戳,进行文件存储,存储到一定数量后,将所有图片文件进行生成视频。

框图和软件流程图

FresjV5Tx43ZEKpVr1kXr38dNjhY

在E907 完成相关wifi 的驱动和设置,这里在固件中指定wifi的 ssid 及密码 及目标传送对象的ip 及端口号,当PC (传送对象) 建立了socket tcp 连接后, 开发板会进行相应的图片数据的传输,这里固定传输(800*600)的图像,通过对图片开头结尾的判断 是否已完成一个图片的接收,如果完成,将相应的图片存储到硬盘上,并存储相应文件列表,当文件达到一定数量后,将相应的文件进行转视频化处理,这里使用的是opencv的videowriter 函数,设定帧率为6  这里依据网络速度或者实际测算进行调整。

硬件介绍

Fjr-8WNDDHP1dD37A46IDGLrM91c

  • 主芯片 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代码,驱动摄像头

实现的功能及图片展示

FrKjC9DX0QPX4AgKxqgaRT0nEJxx

主要实现的功能是建立连接后,保存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.建议多举办这样的活动。

附件下载
main.py
main.c
团队介绍
苏州工程师一枚
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号