python实现运动探测并用绿框表示运动并显示是否检测到并用另一个转为轻度灰度照片
时间: 2023-07-31 22:10:21 浏览: 84
好的,这个问题跟之前的问题类似,只需要将两个功能合并即可。以下是实现代码:
```python
import cv2
# 读取视频
cap = cv2.VideoCapture(0)
# 获取第一帧图像
ret, frame1 = cap.read()
# 将第一帧图像转换为灰度图像
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
# 设置阈值
threshold = 30
# 循环读取每一帧图像
while True:
# 获取当前帧图像
ret, frame2 = cap.read()
# 将当前帧图像转换为灰度图像
gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# 计算两帧图像之间的差异
diff = cv2.absdiff(gray1, gray2)
# 对差异图像进行二值化处理
_, thresh = cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY)
# 对二值化图像进行膨胀操作,填充物体内部的空洞
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
thresh = cv2.dilate(thresh, kernel, iterations=3)
# 查找二值化图像中的轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓列表,找到包含面积最大的轮廓
max_contour = None
max_area = 0
for contour in contours:
area = cv2.contourArea(contour)
if area > max_area:
max_contour = contour
max_area = area
# 如果检测到运动物体,则在图像上用绿色框框标记出来,并将图像转换为灰度照片
if max_contour is not None:
x, y, w, h = cv2.boundingRect(max_contour)
cv2.rectangle(frame2, (x, y), (x + w, y + h), (0, 255, 0), 2)
gray = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
low_contrast_gray = cv2.addWeighted(gray, 0.5, gray, 0.5, 0)
cv2.imshow('gray', gray)
cv2.imshow('low_contrast_gray', low_contrast_gray)
else:
cv2.imshow('frame', frame2)
# 更新前一帧图像
gray1 = gray2
# 等待用户按下ESC键退出程序
if cv2.waitKey(1) == 27:
break
# 释放视频流对象
cap.release()
# 关闭图像窗口
cv2.destroyAllWindows()
```
这段代码实现了从摄像头读取视频流,进行帧差运动检测,并在图像上用绿色框框标记出检测到的运动物体。如果检测到运动物体,则将图像转换为灰度照片,并展示出来。你可以在代码中调节阈值等参数,看看效果如何。
阅读全文