基于M1s Dock的网络摄像机
本项目是2023寒假在家一起练项目,本项目基于M1s Dock开发板实现了一款网络摄像机
标签
嵌入式系统
RISC-V
2023寒假在家练
tinySDR
更新2023-03-28
273

内容介绍

基于M1s Dock 开发板的网络摄像机

1 项目简介

本项目是参加2023寒假在家一起练的项目。项目为基于M1s Dock 的综合应用,通过分析项目目录页内的几个项目,我觉得项目五Wifi 网络摄像机这个项目还是比较简单些。项目主要有两项要求:

  • 完成相机驱动,定时拍摄图片,并将图片通过网络传到电脑或服务器,实现长时间拍摄
  • 通过电脑端编程将图片合成为一个视频

 

2 整体设计思路

2.1 相机、WiFi等硬件驱动部分

通过查看Sipeed官方关于M1s Dock 产品的文档和已有的开发设计资料,可以看到基本的外设驱动部分已经有Sipeed 予以完成了。红框内即为Sipeed 提供的开发包内驱动。

FjWWrRLjBbC3fh_OaWLu0bPJwR9_

图2

通过对以上驱动进行编译,即可完成相机、WiFi驱动部分了。

2.2 图片传输合成为视频部分

这部分在Sipeed软件包中并未涉及,需要自行编程完成。通过测试上一个Camara_Streaming项目,他使用TCP连接向PC传输数据,并且格式为单个的JPEG格式文件。于是通过查询相关资料,想到是否可以通过每秒接收一帧JPEG图片,经调用Python内的OpenCV库,将接收到的各帧图片进行拼接成为一个完整的视频文件方式进行处理。

3. 硬件平台介绍

 3.1 硬件CPU资源等介绍

首先看下整体外观:

Fn7sLqQWT1qitFabmq_0r-pwkZEE

图1

Sipeed M1s Dock 是基于Sipeed M1s 模组来设计的一款核心板,引出了 MIPI CSI、SPI LCD 等 FPC 接口,免去接线难的烦恼。使用最精简的设计. 项目发货产品包含了开发板本体、LCD触摸屏、摄像头、TYPE-C连接线。开发板体积很小,但是内置了三个不同速度的Risc-V核

平头哥 E907@320MHz 平头哥 C906@480MHz 平头哥 E902@160MHz

三个核各具特色,各自负责不同的任务。在固件上也分属不同的区域。这一点在向它烧录固件时候可以看到。

更多资料,可以参考https://wiki.sipeed.com/hardware/zh/maix/m1s/m1s_dock.html

从矽速科技网站的gitee仓库,可以下载到开发板的SDK以及软件example。

3.2 硬件需求详细分析

那么,下面根据网络摄像头这个项目的需要,详细叙述一下整个项目思路吧,

整个项目需要,分为两部分:硬件与软件。硬件这边使用M1s Dock完成。

硬件上需要具备:

A,摄像头接口(开发板上内置一颗OV2685, 2百万像素 图像传感器)

B,Wifi 模块(M1s Dock模块内置)

C,摄像头、Wifi 驱动

D,摄像头图像采集、数据传输TCP推送

4 软件部分综合设计与分析

4.1 摄像头驱动与传输部分详细设计与分析

从https://gitee.com/sipeed/M1s_BL808_example 获取到的范例文件中,camera_streaming_through_wifi  项目,可以完成本项目以上软件的功能。需要注意的是,项目刚开始前,范例代码内有一处IP地址和端口被写入了固定地址。需要修改一下。

修改后的代码,就可以完成以上所有的图片采集、推流等工作了。在推流的时候,M1s Dock模块内部会有一个TCP Client,主动去链接代码内指定的一个TCP Server.(指定IP/端口) 连接后,等待Server发来数据。此时发来ASCII "1" ,即会向其推流1幅JPEG图片,每次推流一幅图片。所以只要Server这边的程序,进行定时发送ASCII "1" 即可定时收到图片序列了。在PC端接收到图片序列之后,将其按照顺序进行写入视频文件。即可完成项目要求了。

上面这一部分,因为使用矽速科技的代码作为驱动层,所以不再详细叙述了。下面详细叙述接收到图片文件之后,存储成为视频文件的操作。

4.2 图片传输与PC端生成文件详细设计

对于图像文件的处理,我选用了比较容易上手的python. 因为它可以引用 很多方便使用的库,在生成视频、接受网络数据包时候比较方便。

程序整体流程图如下:

FrqNMSsT9CsmY0g1kUExPj1ogGKd

图3

这里我们对代码分段进行分析叙述。代码主要包含图片接受、采集、写成单个JPEG文件、写入MP4视频文件这样的几部分。

import cv2
import socket
import time

print ("Open socket" )
s = socket.socket()         
host = '192.168.90.3'
port = 49003               # 设置端口
s.bind((host, port))        # 绑定端口
s.listen(5)
c,addr = s.accept()     # 建立客户端连接
time.sleep(3)
c.send('1'.encode('ASCII'))
data = c.recv(50) 
print('receive from {}:{}:{}bytes'.format(addr[0],addr[1],len(data)))
print(int.from_bytes(data, "little"))
imagelen = int.from_bytes(data, "little")

videofps = 5
videosize = (800,600)
videofourcc = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter("video.mp4", videofourcc, videofps,videosize,True)
totalframe = 30

while totalframe > 0:
    data = c.recv(200000) #1024为接收数据的最大大小
    print('receive from {}:{}:{}bytes'.format(addr[0],addr[1],len(data)))
    with open(r'image.jpg',mode='wb') as fd:
        fd.write(data)
        fd.close()
    print('write over')
    image_cv = cv2.imread("image.jpg")
    video.write(image_cv)
    time.sleep(0.2)
    c.send('1'.encode('ASCII'))
    totalframe = totalframe -1
    
video. Release()

 

以上为代码部分,这里分段详细描述如下;

最上面引入了三个用到的模块。cv,socket,time. 其中cv是OpenCV模块,它支持很多格式的视频、图片格式,并且可以支持从多帧jpeg文件生成视频文件的能力。socket模块是作为底层处理网络接口编程的模块。time模块主要为了完成程序执行时的定时、循环延时等与实际程序运行时间有关系事情。

5-11行,基本上是建立一个TCP server的标准流程,允许外部数据从49003端口进入。这里延时3秒是为了能够让M1s Dock模块能够连接上来。链接上来之后,首个数据包M1s这边会发出一个4个字节的数据包,代表接下来传输的JPEG图片的长度。这里我们在python程序段之中将其存储为一个长度并在接下来的recv接受程序段之中使用。

19-23行,是针对JPEG转视频文件的一个参数描述。这里我使用了openCV的视频生成库。每采集一幅图片,就在视频文件中写入一帧。这里简要描述下视频文件的模式。视频帧率5帧每秒,所以需要每0.2秒接受传递一帧图片。图片分辨率定位800*600尺寸。视频编码格式为MP4,生成的视频视频文件名为”video.mp4“ 视频总帧数为30帧。

25-36行,是一个按照帧数作为参数的循环。在此循环体内,每隔0.2秒向M1s Dock模块发送一个ASCII "1",在触发后,第26行接收到数据并存储进入data变量内。这里设置了接受数据最大尺寸为200K。程序28-30行,完成接收到的图片文件存储为image.jpg工作。在确定图片文件写入正确之后,在32-33行,调用OpenCV程序将其写入Video.mp4工作。这段程序完成30帧之后,退出循环,在程序最后执行video.release(), 完成视频文件打包,生成正确的视频文件。

5 遇到的问题与后续改进

通过实际测试,这段程序能够完成一个基于Wifi链接的网络摄像头的工作。并且将接收到的图片序列存储为视频文件。

在整个项目设计过程中,我学到了Risc-V编译、网路服务器知识、Python编程、OpenCV编程的很多知识点。也暴漏了自己的很多不足。

其中第一点是程序在完成图片数据采集之后,C906 APP这边需要将目标IP地址、端口通过函数参数传递地E905处理器,在这个过程中,需要实现数据的传递,这一部分Sipeed原始代码是有些问题的。另外就是如何实现多个接收IP的实现还是有些问题。

未来,对于AI处理器这边我还是有很多不足,需要深入的去学习。跟进时代的脚步!

感谢硬禾学堂,希望能够再有机会参加下次的活动!

 

附件下载

netcam.py
网络摄像机主程序

团队介绍

太原理工大学 信息工程学院
团队成员
tinySDR
业余无限电爱好者一枚。 会干活不太会写文档。 B3/BG7NQF,QTH山西太原

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号