OpenCV Blob检测

OpenCV Blob检测

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

BLOB提取

BLOB提取是指将二进制图像中的BLOB(对象)分离出来。一个BLOB包含一组连通的像素。我们可以通过连接性来确定两个像素是否连接在一起,即哪个像素是另一个像素的邻居。有两种类型的连接性,即 8连接4连接 。8连接远优于4连接。

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)

使用Subtractor MOG2进行减法运算

OpenCV提供了比手动模式更有效的Subtractor MOG2。Subtractor MOG2的优点是可以使用帧历史记录。语法如下:

cv2.createBackgroundSubtractorMOG2(history, varTheshold, detectShadow)

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

第二个参数a 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() 将从视频文件中排除背景。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程