本文概述
- BLOB提取
- BLOB表示
- BLOB分类
- 如何进行背景减法?
BLOB提取斑点提取是指将二进制图像中的BLOB(对象)分开。 BLOB包含一组连接的像素。我们可以通过连通性确定是否连接了两个像素, 即哪个像素与另一个像素相邻。有两种连接类型。 8连接性和4连接性。 8连接性远胜于4连接性。
BLOB表示【OpenCV 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()将视频文件中的背景排除在外。
推荐阅读
- OpenCV教程 | Python使用OpenCV
- 使用OpenCV进行人脸识别和人脸检测
- python|python-opencv快速上手教程
- c++|opencv安装及配置,对源码进行编译并配置环境
- opencv学习|OpenCV中的图像金字塔与图片尺寸缩放(18)
- 奇怪的工具增加了!|Python实现AI视频识别——手势控制
- [OpenCV实战]23 使用OpenCV获取高动态范围成像HDR
- QT学习之路|【qt+opencv】实现人脸识别打卡系统2.0
- Python|Python人脸识别考勤打卡系统