行空板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
楼主头像很酷
页:
[1]