我的问题是最后一段。
我正在尝试使用OpenCV的背景减法器之一作为检测人手的方法。尝试执行此操作的代码如下:
cv::Ptr<cv::BackgroundSubtractor> pMOG2 = cv::createBackgroundSubtractorMOG2();
cv::Mat fgMaskMOG2;
pMOG2->apply(input, fgMaskMOG2, -1);
cv::namedWindow("FG Mask MOG 2");
cv::imshow("FG Mask MOG 2", fgMaskMOG2);
当我最初在我自己的测试视频上运行该程序时,我受到了欢迎(忽略最右边窗口的名称): 正如你所看到的那样,我的移动手根本没有检测到遮罩,因为我视频中的背景是完全静止的(掩模中一次可能有一两个白色像素)。所以我尝试使用一个不同的视频,许多例子似乎使用的视频正在移动流量。
你可以看到它在轻微的移动车上捡到了。我尝试过(对于这两个视频)将apply
方法的“学习阈值”设置为0到1之间的许多值,并且您可以从上面看到的结果中得到很多变化。
我是否错过了关于设置背景减法的任何内容,还是视频特别难以处理?我在哪里可以调整背景减法的设置以支持我的设置(如果有的话)?我将重复这样一个事实:在两个视频中,相机都是静止的。
答案 0 :(得分:0)
我的答案是在python中,但请转换并尝试。批准是否可行。
if (cap.isOpened() == False):
print("Error opening video stream or file")
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
min_thresh=800
max_thresh=10000
fgbg = cv2.createBackgroundSubtractorMOG2()
connectivity = 4
# Read until video is completed
while (cap.isOpened()):
# Capture frame-by-frame
ret, frame = cap.read()
if ret == True:
print("Frame detected")
frame1 = frame.copy()
fgmask = fgbg.apply(frame1)
fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
output = cv2.connectedComponentsWithStats(
fgmask, connectivity, cv2.CV_32S)
for i in range(output[0]):
if output[2][i][4] >= min_thresh and output[2][i][4] <= max_thresh:
cv2.rectangle(frame, (output[2][i][0], output[2][i][1]), (
output[2][i][0] + output[2][i][2], output[2][i][1] + output[2][i][3]), (0, 255, 0), 2)
cv2.imshow('detection', frame)
cv2.imshow('detection', fgmask)
通过更改历史记录,varThreshold和detectShadows = True更新cv2.createBackgroundSubtractorMOG2。您还可以更改内核大小,消除噪音等。
答案 1 :(得分:-1)
尝试使用MOG减法器而不是MOG2背景减法器。它可能对你有帮助。
因为大多数时候MOG减法器会很方便。但最糟糕的是MOG减法器已被转移到bgsegm包。这是一个贡献包。它可以在OpenCv git中心页面中找到。