采用opencv实现实时摄像头识别水果,至少包含苹果、香蕉,并在实时画面以及调试窗口打印出水果位置信息以及物体分类信息,用红框框住水果。 立即签到待办任务
时间: 2024-12-05 19:21:34 浏览: 23
使用OpenCV(Open Source Computer Vision Library)实现实时水果识别,首先需要准备一些步骤:
1. **数据集准备**:收集大量苹果和香蕉的图片作为训练样本,并确保它们有清晰的标签区分。
2. **目标检测模型选择**:可以选择预训练的深度学习模型,如YOLOv5 (You Only Look Once) 或 SSD (Single Shot MultiBox Detector),它们适合于实时物体检测任务。
3. **模型加载和训练**:如果已有模型,从磁盘加载;如果没有,可以在线下载预训练模型并进行微调,以适应水果分类。
4. **设置视频流**:使用`cv2.VideoCapture`获取摄像头输入,初始化一个循环来处理每一帧。
5. **图像预处理**:对每一帧进行灰度化、缩放等操作以便进行后续处理。
6. **物体检测**:通过模型对当前帧进行预测,得到每个水果的位置和类别。
7. **结果解析**:根据检测结果,定位水果的位置,并确定其是苹果还是香蕉。
8. **绘制结果**:在原始帧上画出红框标识水果位置,以及文本显示水果类别。这一步通常需要用到`cv2.rectangle`和`cv2.putText`函数。
9. **实时展示和调试**:将处理后的图像显示在监控窗口和调试日志中。
```python
import cv2
import numpy as np
# 加载模型
model = cv2.dnn.readNetFromDarknet("yolov5s.cfg", "yolov5s.weights")
# 初始化摄像头
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416), swapRB=True, crop=False)
model.setInput(blob)
outs = model.forward()
# 解析结果
for out in outs:
class_ids = []
confidences = []
boxes = []
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
center_x = int(detection[0] * frame.shape[1])
center_y = int(detection[1] * frame.shape[0])
width = int(detection[2] * frame.shape[1])
height = int(detection[3] * frame.shape[0])
x = center_x - width / 2
y = center_y - height / 2
class_ids.append(class_id)
confidences.append(float(confidence))
boxes.append([x, y, width, height])
indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
for i in indices:
i = i[0]
box = boxes[i]
x, y, w, h = box
label = ["Apple", "Banana"][class_ids[i]]
color = (0, 0, 255) if label == 'Apple' else (0, 255, 0)
cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
cv2.putText(frame, f"{label}", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
# 显示结果
cv2.imshow('Fruit Detection', frame)
# Debug信息(这里只是示例,实际可以更详细)
print(f"Detected {label} at ({x}, {y}) with confidence {confidence:.2f}")
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
阅读全文