【发布时间】:2019-09-19 01:04:22
【问题描述】:
我正在尝试制作一个使用我的笔记本电脑(win 10)网络摄像头检测对象的程序。为此,我使用的是 python 3.7 和 openCV 3.4 。这是我的代码:
import cv2
first_frame = None
video = cv2.VideoCapture(0)
while True:
check, frame = video.read()
status = 0
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
if first_frame is None:
first_frame = gray
continue
delta_frame = cv2.absdiff(first_frame, gray)
thresh_frame = cv2.threshold(delta_frame, 40, 255, cv2.THRESH_BINARY)[1]
thresh_frame = cv2.dilate(thresh_frame, None, iterations=2)
(_, cnts, _) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in cnts:
if cv2.contourArea(contour) < 10000:
continue
status = 1
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow("Gray Frame", gray)
cv2.imshow("Delta Frame", delta_frame)
cv2.imshow("Threshold Frame", thresh_frame)
cv2.imshow("Color Frame", frame)
key = cv2.waitKey(1)
if key == ord("q"):
break
print(status, end=" ")
cv2.destroyAllWindows()
video.release()
它应该在移动或刚刚进入框架的对象周围绘制一个红色矩形。我在没有太多移动的地方使用它,所以当某些东西正在拍摄时它可以正常工作。首先它将图片作为第一帧并将其与其余帧进行比较,依此类推。问题是,每当我运行脚本时,它都会检测到作为对象出现在窗口中的整个视频帧(一个大的红色矩形覆盖了显示窗口的所有边缘和角落)。房间(更准确地说,静态背景)并不黑暗。为了测试它是否将背景检测为对象,我添加了一个status,它最初为零,并且每当对象进入框架或移动它时应该更改为 1,在控制台中打印状态。即使没有任何内容进入框架 1 也会打印,表明有问题。当脚本运行时,阈值窗口全是白色的,我相信如果它是黑色的,问题就会得到解决。另外,我该如何改进我的代码,以便它能够更快更好地检测到?
【问题讨论】:
-
你能分享两张图片吗:1)你的背景图片,2)要进行检测的图片
-
@ShubhamJaiswal 我发布了解决方案,问题不在于背景图像,而在于光线条件,但我不知道为什么解决方案有效。
标签: python python-3.x opencv computer-vision