python实现运动探测动的地方用绿框画出不动的时候是红框并显示是否检测到运动并展开另一个转为轻度灰度照片
时间: 2024-03-12 15:43:21 浏览: 52
RGB图像的运动检测
3星 · 编辑精心推荐
好的,根据您的要求,我们需要在之前的代码基础上做出一些修改。下面是实现的步骤:
1. 导入必要的库:
```python
import cv2
import numpy as np
```
2. 加载原始图像:
```python
img = cv2.imread('input.jpg')
```
3. 将图像转换为灰度图像:
```python
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
```
4. 定义运动物体检测器:
```python
detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=50, detectShadows=False)
```
5. 对灰度图像进行运动物体检测:
```python
mask = detector.apply(gray)
```
6. 对检测到的运动物体进行轮廓检测:
```python
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
```
7. 定义一个变量来判断当前是否检测到了运动物体:
```python
isDetected = False
```
8. 根据是否检测到了运动物体来绘制矩形框:
```python
if len(contours) > 0:
isDetected = True
color = (0, 255, 0) # 绿色框表示检测到了运动物体
else:
color = (0, 0, 255) # 红色框表示没有检测到运动物体
for c in contours:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
```
9. 在图像上展示是否检测到了运动物体:
```python
if isDetected:
cv2.putText(img, 'Detected', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
else:
cv2.putText(img, 'Not Detected', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('Result', img)
```
10. 将检测到的运动物体区域转换为轻度灰度照片并保存:
```python
for i, c in enumerate(contours):
x, y, w, h = cv2.boundingRect(c)
roi = img[y:y+h, x:x+w]
roi_gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
cv2.imwrite(f'output_{i}.jpg', roi_gray)
```
完整代码如下:
```python
import cv2
import numpy as np
img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=50, detectShadows=False)
mask = detector.apply(gray)
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
isDetected = False
if len(contours) > 0:
isDetected = True
color = (0, 255, 0) # 绿色框表示检测到了运动物体
else:
color = (0, 0, 255) # 红色框表示没有检测到运动物体
for c in contours:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
if isDetected:
cv2.putText(img, 'Detected', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
else:
cv2.putText(img, 'Not Detected', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
for i, c in enumerate(contours):
x, y, w, h = cv2.boundingRect(c)
roi = img[y:y+h, x:x+w]
roi_gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
cv2.imwrite(f'output_{i}.jpg', roi_gray)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
运行代码后,检测到的运动物体部分将会用绿框画出,没有检测到运动物体部分将会用红框画出,并保存为灰度图像。同时,程序会在图像上展示是否检测到了运动物体的信息。
阅读全文