本帖最后由 zygalaxy 于 2024-8-1 21:46 编辑
# 屏幕与摄像头集成应用
屏幕与摄像头集成应用 时间规划:评测第五天至第六天 内容要点: 综合应用实例:设计一个结合屏幕显示与摄像头输入的小型项目,如实时监控系统原型,评估套件在实际应用中的表现和灵活性。
## 时间规划
- **评测第五天至第六天**
## 内容要点
### 屏幕显示效果
- 测试不同分辨率、色彩深度的图像显示,评价屏幕的亮度、对比度及视角。
套件自带的屏幕是一款2.4寸的屏幕,显示图像信息比较细腻,正好比较适合k210的图像显示,能够在尽量不模糊的情况下保证显示得清晰
### 摄像头数据采集与处理:
- 编写程序实现摄像头数据的实时采集,并进行基础图像处理或AI分析,如人脸识别、物体追踪等。
以人脸检测为例子:
进入Maixpy hub 下载模型
https://dl.sipeed.com/MAIX/MaixPy/model
下载 face_model_at_0x300000.kfpkg 这个模型文件
用 kflash_gui 下载模型到 Flash, 或者放到 SD 卡中
```python
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
def lcd_show_except(e):
import uio
err_str = uio.StringIO()
sys.print_exception(e, err_str)
err_str = err_str.getvalue()
img = image.Image(size=(224,224))
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main(model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
try:
sensor.reset()
except Exception as e:
raise Exception("sensor reset fail, please check hardware connection, or hardware damaged! err: {}".format(e))
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.run(1)
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
anchors = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
try:
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
img.draw_rectangle(obj.rect())
img.draw_string(0, 200, "t:%dms" %(t), scale=2)
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is None:
kpu.deinit(task)
if __name__ == "__main__":
try:
main( model_addr=0x300000, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False)
# main(model_addr="/sd/m.kmodel")
except Exception as e:
sys.print_exception(e)
lcd_show_except(e)
finally:
gc.collect()
```
### 综合应用实例
- 设计一个结合屏幕显示与摄像头输入的小型项目,如实时监控系统原型,评估套件在实际应用中的表现和灵活性。
---
实现一个人脸预警平台:``基于LTE网络的人脸识别预警系统``
项目实现的思路:
1.K210开发板使用ov2640摄像头模块读取当前环境中人脸信息,k210使用yolov2训练的模型进行推理,当检测到人脸信息时,k210把图像信息转化为16进制数据通过串口通信方式,与air780epv模块通过相连接,采用数据包发送模式,通过TCP协议向后端发送16进制图片信息。
后端flask通过socket接受来自k210的16进制图片信息,接收完成后将16进制数据使用opencv转换为2进制图片数据,使用opencv库再次还原为原始图片信息,同时通过websocket向前端发送检测信息,并且通过发送邮件方式给注册的用户发送预警邮件。
2.前端通过websocket通信方式接收来自后端传输的信息,并展示在实时监测页面,可以在网页查看历史人脸检测信息,同时在控制台可以通过echarts可视化查看目前系统预警次数,使数据更加清晰明了。
实现的代码:
前端关键代码:
```javascript
监测数据
数据更新时间:{{ currentTime }}
已检测到
检测时间:{{ currentTime }}
```
后端关键代码:
```python
def receive_data():
while True:
client_socket, addr = server_socket.accept() # 接受客户端连接
print(f'Connected to {addr}')
start_marker = b'0x54'
stop_marker = b'0x50'
full_data = b''
while True:
data = client_socket.recv(4096)
if not data:
break
full_data += data
# 搜索当前接收的数据块中是否存在停止位
stop_pos = data.find(stop_marker)
if stop_pos != -1:
# 如果找到了停止位,截取从起始位到停止位之间的数据作为有效数据
start_pos = full_data.find(start_marker)
if start_pos != -1:
valid_data = full_data[start_pos + len(start_marker):stop_pos]
# print("Received data:", valid_data.decode('utf-8'))
print("Received data:")
else:
print("Warning: Start marker not found before stop marker.")
print("Reception complete.")
break
# print("Received data chunk:", data.decode('utf-8'), "(waiting for stop marker)")
print("Received data chunk:", "(waiting for stop marker)")
# 继续接收数据
# time.sleep(1) # 可能需要短暂延时,确保模块已切换到接收状态
# 如果循环正常结束(未接收到停止位),处理剩余数据
if full_data.endswith(stop_marker):
# print("Received data:", full_data[len(start_marker):-len(stop_marker)].decode('utf-8'))
print("Received data:", )
print("Reception complete.")
try:
img_bytes = binascii.unhexlify(full_data[len(start_marker):-len(stop_marker)])
# print(img_bytes)
timestamp = str(int(time.time() * 1000))
img_path = f'./static/{timestamp}.jpg'
with open(img_path, 'wb') as f:
f.write(img_bytes)
# 需要添加ip地址
with app.app_context():
detect_history = DetectHistory(image='http://localhost:5000' + f'/static/{timestamp}.jpg',
time=timestamp)
db.session.add(detect_history)
db.session.commit()
db.session.close()
# 查询数据库所有用户邮箱
# 发送邮件
# 读取本地email文件
receivers = []
# Read emails from the file and append to the list
# with open('email.txt', 'r') as f:
# for line in f:
# receivers.append(line.strip())
#
users = User.query.all()
for user in users:
if user.email in receivers:
continue
else:
receivers.append(user.email)
for receiver in receivers:
msg = Message("预警信息",
sender=app.config['MAIL_DEFAULT_SENDER'],
recipients=[receiver])
msg.body = "检测到人脸"
msg.attach("image.jpg", "image/jpg", img_bytes)
mail.send(msg)
socketio.emit('detect', {
'image': 'http://localhost:5000' + f'/static/{timestamp}.jpg',
'timestamp': timestamp
})
except Exception as e:
print(e)
print("Error occurred while processing data.")
# continue
else:
print("Warning: Reception incomplete. Stop marker not found.")
client_socket.close() # 关闭连接
```
项目部分页面展示:
套件在项目中的发挥了重要的作用,因为k210使用起来功能强大,加速了项目的开发,并为项目的添加了更多的新能力。