OpenCV Blob检测

本文概述

Blob代表Binary Large Object, 是指二进制图像中连接的像素。术语”大”集中于特定大小的对象, 而其他”小”二进制对象通常是噪声。关于BLOB分析有三个过程。

BLOB提取

斑点提取是指将二进制图像中的BLOB(对象)分开。 BLOB包含一组连接的像素。我们可以通过连通性确定是否连接了两个像素, 即哪个像素与另一个像素相邻。有两种连接类型。 8连接性和4连接性。 8连接性远胜于4连接性。

BLOB表示

BLOB表示只是意味着将BLOB转换为几个代表数字。提取BLOB之后, 下一步是对几个BLOB进行分类。 BLOB表示过程有两个步骤。第一步, 每个BLOB由几个特征表示, 第二步是应用一些匹配方法来比较每个BLOB的特征。

BLOB分类

在这里, 我们确定BLOB的类型, 例如, 给定BLOB是否为圆。这里的问题是如何根据我们前面介绍的BLOB特征来定义哪些BLOB是圆形的, 哪些不是。为此, 通常我们需要为要寻找的对象制作一个原型模型。

import cv2
import numpy as np;

img = cv2.imread(r"filename", cv2.IMREAD_GRAYSCALE)
# Set up the detector with default parameters.
detector = cv2.SimpleBlobDetector()

# Detecting blobs.
keypoints = detector.detect(img)
# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(img, keypoints, np.array([]), (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# Show keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

如何进行背景减法?

背景减法被广泛用于生成前景蒙版。二值图像包含属于场景中移动对象的像素。背景减法计算前景蒙版, 并在当前帧和背景模型之间执行减法。

背景建模有两个主要步骤

  • 背景初始化-在此步骤中, 将计算背景的初始模型。
  • 后台更新-在此步骤中, 将更新模型以适应场景中可能发生的变化。

从第一帧手动减法

首先, 我们导入库并加载视频。接下来, 我们获取视频的第一帧, 将其转换为灰度, 然后应用高斯模糊以消除一些噪声。我们使用while循环, 因此一帧一帧地加载。完成此操作后, 我们获得了减法背景的核心部分, 在其中我们计算了第一帧与当前帧之间的绝对差。

示例1

import cv2
import numpy as np
cap = cv2.VideoCapture(0)

first_frame = cap.read()
first_gray = cv2.cvtColor(first_frame, )
first_gray_col = cv2.GaussianBlur(first_gray, (5, 5), 0)

while True:
    frame = cap.read()
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray_frame = cv2.GaussianBlur(gray_frame, (5, 5), 0)

difference = cv2.absdiff(first_gray, gray_frame)
difference = cv2.threshold(difference, 25, 255, cv2.THRESH_BINARY)

使用减法器MOG2进行减法

OpenCV提供的减法器MOG2比手动模式有效。减法器MOG2的优点是可以处理帧历史记录。语法如下:

cv2.createBackgroundSubtractorMOG2(history, varTheshold, detectShadow)

第一个参数, history是最后一帧的编号(默认为120)。

第二个参数varThreshold是评估差异以提取背景时使用的值。较低的阈值将利用噪声较大的图像发现更多变化。

第三个参数detectShadows是算法的功能, 如果启用, 可以删除阴影。

示例2:

import cv2
import numpy as np
cap = cv2.VideoCapture("filename")

subtractor = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=50, detectShadows=True)

while True:
    _, frame = cap.read()
    mask = subtractor.apply(frame)
    cv2.imshow("Frame", frame)
    cv2.imshow("mask", mask)
    key = cv2.waitKey(30)
    if key == 27:
        break
cap.release()
cv2.destroyWindowKey()

在上面的代码中, cv2.VideoCapture(” filename”)接受包含文件的完整路径, 其中cv2.createBackgroundSubtractorMOG2()将视频文件中的背景排除在外。


微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?