opencv python 先进行实时的动态检测,发现有运动的物体是,再进行行人检测,发现有人再进行钓鱼竿检测代码
时间: 2024-02-13 10:05:13 浏览: 78
用python和OpenCV进行动态物体检测
5星 · 资源好评率100%
好的,以下是基于 OpenCV 和 Python 的动态检测、行人检测和钓鱼竿检测的代码示例:
```python
import cv2
# 创建运动检测对象
fgbg = cv2.createBackgroundSubtractorMOG2()
# 加载行人检测分类器
pedestrian_cascade = cv2.CascadeClassifier('pedestrian.xml')
# 加载钓鱼竿检测模型
fishing_rod_net = cv2.dnn.readNet('fishing_rod_model.weights', 'fishing_rod_model.cfg')
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取视频帧
ret, frame = cap.read()
# 将帧转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 运动检测
fgmask = fgbg.apply(gray)
# 去除噪声
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
# 行人检测
pedestrians = pedestrian_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
# 钓鱼竿检测
for (x, y, w, h) in pedestrians:
# 提取行人图像
pedestrian_roi = gray[y:y+h, x:x+w]
# 缩放行人图像
pedestrian_roi = cv2.resize(pedestrian_roi, (224, 224), interpolation=cv2.INTER_AREA)
# 归一化行人图像
pedestrian_roi = pedestrian_roi / 255.0
# 将行人图像传递给钓鱼竿检测模型
blob = cv2.dnn.blobFromImage(pedestrian_roi, 1/255.0, (224, 224), (0, 0, 0), swapRB=True, crop=False)
fishing_rod_net.setInput(blob)
detections = fishing_rod_net.forward()
# 钓鱼竿检测结果处理
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
class_id = int(detections[0, 0, i, 1])
if class_id == 1 and confidence > 0.5:
# 绘制钓鱼竿检测结果
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.putText(frame, 'Fishing rod', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2, cv2.LINE_AA)
# 显示检测结果
cv2.imshow('frame', frame)
# 按下 q 键退出程序
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
```
在这个示例中,我们首先创建了一个运动检测对象,然后加载了一个行人检测分类器和一个钓鱼竿检测模型。接着,我们使用 `cv2.VideoCapture()` 打开摄像头,循环读取视频帧并进行动态检测、行人检测和钓鱼竿检测。最后,我们使用 `cv2.imshow()` 显示检测结果,并在按下 q 键时退出程序。请注意,您需要根据您的具体情况修改代码中的参数和模型文件路径。
阅读全文