YeezB 发表于 昨天 13:58

行空板K10网络摄像头——实现openCV/yoloV5视觉算法

本帖最后由 YeezB 于 2025-4-3 16:26 编辑

借由行空板K10的摄像头以及联网功能,我们可以将摄像头画面传输到局域网上,并且随时在局域网中任意一台电脑访问。在电脑端可以调用很多现成的计算机视觉库。进行图像识别。

该项目分成两个部分:
- 将行空板K10的摄像头映射到网络上
- 连入这个局域网的电脑本地运行openCV/yolo等算法

1. 行空板K10网络摄像头

用户库链接:
https://gitee.com/yeezb/k10web-cam


可以在Mind+的用户库中复制粘贴上述链接来加载用户库

编写代码:
上述链接中有示例程序的截图,对应修改WiFi名称和密码后上传。

打开串口监视器,可以看到K10的IP。


浏览器打开IP/stream可以看到摄像头画面,比如上图中的IP,浏览器就可以输入192.168.9.180/stream


2.本地运行openCV

电脑本地安装openCV库:
Mind+切换到Python模式->代码->库管理

在PIP模式下分别输入并运行
- numpy
- request
- opencv-python
- opencv-contrib-python
安装四个依赖库

在电脑中任意位置新建一个python文件并打开,文件名任意但是需要以.py结尾

运行下列Python代码
import cv2
import requests
import numpy as np

url = 'http://192.168.9.60/stream'# ESP32-CAM的IP地址

cv2.namedWindow("live transmission", cv2.WINDOW_AUTOSIZE)# 创建一个窗口用于显示实时图像

# 启动 HTTP 请求获取视频流
try:
    response = requests.get(url, stream=True, timeout=10)
    print("Connected to stream")
   
    img_data = b''# 用于存储接收到的图像数据
   
    # 按块读取数据
    for chunk in response.iter_content(chunk_size=1024):
      if chunk:
            img_data += chunk# 将接收到的数据累加到 img_data 中

            # 判断是否接收到完整的 JPEG 数据
            start_idx = img_data.find(b'\xff\xd8')# 查找 JPEG 开始标志
            end_idx = img_data.find(b'\xff\xd9')    # 查找 JPEG 结束标志

            if start_idx != -1 and end_idx != -1:
                jpg_data = img_data# 提取出完整的 JPEG 数据

                # 转换为 NumPy 数组
                img_np = np.frombuffer(jpg_data, dtype=np.uint8)
                img = cv2.imdecode(img_np, cv2.IMREAD_COLOR)# 解码 JPEG 图像数据

                if img is not None:
                  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将图像转换为灰度图像
                  canny = cv2.Canny(cv2.GaussianBlur(gray, (11, 11), 0), 30, 150, 3)# 使用Canny算法进行边缘检测
                  dilated = cv2.dilate(canny, (1, 1), iterations=2)# 对边缘图像进行膨胀操作
                  contours, _ = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# 查找轮廓
                  cv2.drawContours(img, contours, -1, (0, 255, 0), 2)# 在原始图像上绘制轮廓

                  cv2.imshow("mit contour", canny)# 显示边缘检测结果图像
                  cv2.imshow("live transmission", img)# 显示实时图像

                  # 按下 'q' 键退出
                  if cv2.waitKey(1) & 0xFF == ord('q'):
                        break

                # 清除已处理的数据
                img_data = img_data# 移除已处理的图像数据部分
      else:
            print("No data received!")

except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

cv2.destroyAllWindows()
可以看到电脑上弹出两个对话框,openCV库正在对K10捕获的图像进行边缘检测。







3.本地运行Yolo V5

电脑本地安装yolo库:
Mind+切换到Python模式->代码->库管理
在PIP模式下分别输入并运行
- numpy
- yolov5
安装两个依赖库,yolo V5安装耗时较久。


在电脑中任意位置新建一个python文件并打开,文件名任意但是需要以.py结尾并且将文末网盘中的.pt模型放置在python文件的同级目录下。


运行下列Python代码import cv2
import torch
import time
import requests
import numpy as np
from yolov5 import YOLOv5

url = 'http://192.168.9.181'# ESP32-CAM的IP地址

# 加载YOLOv5模型
model_path = "yolov5s.pt"# 模型路径
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = YOLOv5(model_path, device=device)

cv2.namedWindow("YOLOv5 Detection", cv2.WINDOW_AUTOSIZE)# 创建窗口

# 启动HTTP请求,获取图像流
try:
    response = requests.get(url, stream=True, timeout=10)
    print("Connected to stream")

    img_data = b''# 存储接收到的图像数据

    while True:
      # **1. 读取完整 JPEG 数据**
      while True:
            chunk = response.raw.read(1024)# 直接读取数据
            if not chunk:
                break# 连接断开
            img_data += chunk# 累加数据

            start_idx = img_data.find(b'\xff\xd8')# JPEG 开头
            end_idx = img_data.find(b'\xff\xd9')    # JPEG 结尾

            if start_idx != -1 and end_idx != -1:
                jpg_data = img_data# 提取完整 JPEG
                img_data = img_data# 删除已处理部分
                break# 退出读取循环

      # **2. 解码 JPEG**
      img_np = np.frombuffer(jpg_data, dtype=np.uint8)
      frame = cv2.imdecode(img_np, cv2.IMREAD_COLOR)

      if frame is None:
            continue# 跳过损坏帧

      # **3. YOLOv5 目标检测**
      start_time = time.time()
      results = model.predict(frame, size=640)# 进行检测
      annotated_frame = results.render().copy()# 解除只读限制

      # **4. 计算 FPS**
      processing_time = time.time() - start_time
      fps = 1 / processing_time if processing_time > 0 else 0

      # **5. 显示检测结果**
      cv2.putText(annotated_frame, f"FPS: {fps:.2f}", (10, 30),
                  cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)

      cv2.imshow("YOLOv5 Detection", annotated_frame)
      print(f"Processed frame in {processing_time:.4f} seconds, FPS: {fps:.2f}")

      # 按 'q' 退出
      if cv2.waitKey(1) & 0xFF == ord('q'):
            break

except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

cv2.destroyAllWindows(

可以看到电脑上弹出一个对话框,yoloV5正在对K10捕获的图像进行识别。


Yolo V5模型:链接: https://pan.baidu.com/s/1d09IYfpdk-fP2GE8KIBngg?pwd=bvsx 提取码: bvsx





hnyzcj 发表于 昨天 18:46

楼主头像很酷
页: [1]
查看完整版本: 行空板K10网络摄像头——实现openCV/yoloV5视觉算法