基于物联网的智能实时视频采集系统
2022-04-22陆欣欣李晓欣
陆欣欣,李晓欣
(贺州学院人工智能学院,贺州 542899)
0 引言
随着互联网体系的成熟,物联网技术已经逐渐被广泛应用到各个领域。在日常生活中,手机已经成为人们生活中不可或缺的一部分。人们除了将手机用来通讯之外,还更多的是将它作为生活娱乐的重要工具。现在的人们越来越喜欢在社交平台上分享自己的自拍视频来记录自己的美好生活,但是在拍摄过程当中或多或少会出现一些拍摄的问题,比如需要他人帮忙,或是需要人为的控制拍摄的方向等等,都不能达到智能的效果。如果手机在视频拍摄过程当中可以检测出人脸,并且可以跟随人脸的位置移动而移动,这样就可以使拍摄效果更加的智能化,人们的拍摄效果和体验感更佳。
1 总体方案设计
本设计由2部分组成,Android手机视频采集端以及由STM32单片机、蓝牙模块、2个舵机模块以及放置手机的支架组成的硬件端。整个系统的流程是:Android手机在实时视频采集过程中检测出单人脸,根据人脸位置通过蓝牙技术将不同的指令发送到硬件端,硬件端通过蓝牙模块接收指令后,经STM32模块处理后驱动舵机的做出相应的转动,手机放置在舵机的支架上,从而可以实现对手机的控制,最终达到智能实时视频采集的效果。整体设计如图1所示。
图1 系统的整体框架
2 Android手机视频采集端设计
Android手机视频采集端最终要实现的是一个手机APP,采用的开发的语言以及开发工具分别是JAVA和Android Studio。Android Studio提供了集成的Android开发工具,对于编写手机软件的PC端程序来说,在其提供的工具下,能够快速的建立Android开发环境,以及程序的实时调试,开发过程中开发者可以利用模拟器进行调试,也可以用手机连接电脑,直接进行调试。
Android手机视频采集端主要实现的功能是先与硬件端的蓝牙模块连接,然后在实时视频采集过程中检测出每帧视频的人脸位置信息,最后再根据人脸位置信息给硬件端发送不同的控制指令。
2.1 蓝牙连接
Android手机视频采集端与硬件端的通信需要通过蓝牙技术来实现,所以手机在实时视频采集前需要与硬件端的蓝牙模块连接。连接的过程是:①要想手机使用蓝牙功能,首先需要先添加蓝牙权限。②蓝牙的初始化设置。利用管理者对象调用getAdapter()方法检查当前手机是否支持蓝牙,并将蓝牙状态设置为打开状态,如图2所示。③搜索设备,调用BluetoothAdapter类中的startLeScan()方法来搜索硬件端的蓝牙模块,通过回调函数LeScanCallback()获得蓝牙设备的设备名称和MAC地址,如图3所示。④实现蓝牙的连接,连接之前先获取目标蓝牙设备BluetoothDevice对象,调用connectGatt()方法进行连接,并将BluetoothGattCallback作为connect⁃Gatt方法的参数,然后最这些参数status进行分析,如果status为GATT_SUCCESS时表明蓝牙连接成功。如图4所示。
图2 蓝牙开启
图3 蓝牙搜索
图4 蓝牙连接
2.2 人脸检测
要想实现智能实时视频采集,在实时视频采集过程中获取到每一帧视频的人脸位置信息非常关键。实现的过程是:①在设计实时视频采集界面的时候用两个View进行叠加,底层的View用来实现实时视频采集,顶层的View用来绘制人脸框,并默认设置为透明状态。②打开手机摄像头,获取CameraDevice的mCameraDe⁃vice对象,利用mCameraDevice对象调用create⁃CaptureRequest()方法实现视频预览和监听每一帧视频数据。③利用回调方法CameraCapture⁃Session.CaptureCallback()获取每帧视频的人脸的模式以及人脸的Face[]数据。④在顶层View通过画布和画笔将人脸框绘制出来。
在人脸检测过程中绘制人脸框的时候要特别注意,因为屏幕看到的人脸位置和实际测出的人脸位置信息不匹配。主要的原因是Android默认坐标系和视图坐标系不同,默认坐标系的原点在手机屏幕左上角,而视图坐标系是相对默认坐标系而言,需要通过一定的方法来获取控件相对默认坐标系的位置。人脸位置信息的采集是在默认坐标系的基础上进行的,而人脸框的绘制是以视图坐标系为基准的,所以为了可以使检测出来的人脸位置和在屏幕上看到的人脸位置一样,需要将检测出的人脸位置信息进行一定的转换。在转换的之前又需要先区分是手机前置摄像头还是后置摄像头,因为两者的转换方法有区别,如果是前置摄像头,需要先将获取到的人脸位置信息在水平方向左右转换,再旋转90°,如果是后置摄像头,只需旋转90°。最后再将转换后的人脸信息根据视图坐标系绘制在顶层的View即可。还需要注意的是,在绘制新的一帧视频人脸位置信息时需要重新刷新一下顶层的View。图5和图6分别是2种情况下在实时视频采集时采集到的单人脸位置结果。
图5 前置摄像头单人脸检测
图6 后置摄像头单人脸检测
2.3 手机发送控制指令
手机在实时视频采集过程中检测到每一帧视频人脸位置信息后,还需要将人脸位置信息通过蓝牙技术发到给硬件端。但是因为检测到的人脸信息是一个矩形数据,如果要将所有的数据都发送给硬件端,那么无论是在手机发送和还是硬件接收的过程中要处理的数据都太复杂。所以为了方便,只取矩形的中点作为人脸位置信息,根据与上一帧人脸位置中点信息的不同,给硬件端发送上下左右不同的控制指令。
3 硬件端设计
硬件端主要由一个微型STM32单片机、一个蓝牙模块、2个舵机、电源和一个手机支架构成,主要实现的功能是通过蓝牙模块来接收手机发送的控制指令,转交给STM32处理后驱动舵机的转动,手机放置在手机支架上,从而达到实现智能实时视频采集的效果。
3.1 硬件选型
硬件部分的主控芯片采用的是STM32F103C 8T6,它是基于高性能ARM®CortexTM-M3的32位RISC内核处理器,芯片主频高达72 MHz,拥有I2C,SPI,PWM等总线接口。
因为只需要接收手机控制端发出的指令,所以蓝牙模块采用的是BT05从模块。它引出的端口包括VCC、GND、TXD、RXD以及预留LED状态输出引脚。它的输出电压为3.6~6 V,在空旷的地方有效距离可超过10 m。蓝牙模块中的TXD为发送端,需与STM32的RDX端连接,RDX为接收端,需与STM32的TXD端连接。
因为手机在实时视频采集过程中需要根据人脸位置移动而移动,所以需要用舵机来实现。舵机模块采用的是MG995,本设计其工作的时候使用的电压为5 V,需要旋转的角度在0~180之间。舵机上有三根线,分别为电源、接地和信号线。
电源模块主要是为STM32单片机和蓝牙模块供电,本系统设计采用的电源模块为可充电电池,可以方便实现对STM32单片机3.3 V以及蓝牙模块5 V的稳压供电。
3.2 主控芯片程序设计
硬件端的主控芯片是STM32单片机,程序设计的过程主要包含定时器的初始化,串口的初始化以及主程序的实现。
3.2.1 定时器的初始化
(1)打开TIM4的时钟。因为设计需要控制2个舵机上下左右的转动,所以需要用到定时器的两个输出通道CH1和CH2,并将对应的引脚PB6和PB7设置为复用功能输出。
(2)设置定时器的基本参数,主要是用来设置定时器的时钟周期、预分频器和定期器的计数模式。
(3)设置定时器输出通道,主要是用来确定输出波形的占空比和输出比较极性。
(4)使用定时器,可以利用库函数TIM_Cmd()来实现。
3.2.2 串口的初始化
(1)需要使能串口时钟以及它相应的GPIO端口才能实现数据的输入输出。
(2)设置GPIO端口模式。
(3)设置串口参数。
(4)开启中断并且初始化NVIC。
(5)编写中断处理函数。
(6)实现串口数据收发。
(7)获取串口传输的状态。
3.2.3 主程序的实现
在主函数里面主要实现的是处理蓝牙模块收到的数据,并控制舵机的转动,处理函数如下:
4 系统实现
程序设计好后,首先将蓝牙模块上的RXD、TXD、VCC、GND引脚分别连接STM32上的串口2的PA2引脚、PA3引脚,3.3V引脚、GND引脚,两个舵机的信号线分别连接STM32上的PB6、PB7引脚,剩下的两根线分别接电源和地。然后通过MDK的方式将程序下载到STM32上。硬件部分效果如图7所示。
图7 硬件效果
启动手机APP后,在手机实时视频采集之前首先需要在蓝牙界面搜索连接硬件端的蓝牙模块,如果连接成功,这个时候的蓝牙模块上的LED灯会由闪烁状态变成一直亮着的状态。蓝牙成功后可以开始实时视频采集,视频采集过程中会检测到每一帧视频的人脸信息,手机根据人脸信息位置不同给硬件端发送不同的控制指令,从而可以实现对手机的前后左右的控制,达到智能实时视频采集的效果。
5 结语
本设计采用STM32最小系统为控制中心,结合蓝牙模块、舵机模块等,在Android手机平台上,利用蓝牙传输技术,通过软件编程的方式来实现智能实时视频采集的效果,这为将来智能家居的遥控设计提供一定的参考意义。
将编译的手机APP安装成功以及硬件部分的主控芯片的程序下载好后,经过反复测试,可以在一定距离之内很好的实现手机在实时视频采集时可以根据人脸位置的转动而转动,达到了预期的设想。
本控制系统采用人脸检测+接收端信号转化控制,这种方式采用的终端软件具有易移植和通用性,市场的应用价值较高,便于推广,本系统所需硬件系统符合国产化要求。