zygalaxy 发表于 2024-7-11 16:03

Sipeed MAix BiT AIoT 开发套件测评-进阶应用探索

<div class='showpostmsg'> 本帖最后由 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:, nms_value:
      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
<template>
        <el-card>
                <template #header>
                        监测数据
                        <el-text size="small">数据更新时间:{{ currentTime }}</el-text>
                </template>
                <!--检测到人脸就显示,如果没有就会显示空-->
                <div class="detect-wrap w-full">
                        <div class="img-wrap flex justify-between" v-if="isDetect">
                                <img class="w-1/2 max-h-" :src="imgsrc" alt="" />
                                <div
                                        class="text flex justify-center flex-col items-center flex-1"
                                >
                                        <el-button type="danger">已检测到</el-button>
                                        检测时间:{{ currentTime }}
                                </div>
                        </div>
                        <el-empty
                                v-else
                                description="当前暂无识别到人脸,请等待连接成功与识别"
                        />
                </div>
        </el-card>
</template>
```

后端关键代码:
```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
                  # 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.decode('utf-8'))
            print("Received data:", )

            print("Reception complete.")
            try:
                img_bytes = binascii.unhexlify(full_data)
                # 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=)
                            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使用起来功能强大,加速了项目的开发,并为项目的添加了更多的新能力。


</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                               
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: Sipeed MAix BiT AIoT 开发套件测评-进阶应用探索