Python基于opencv的blob算法实现

       最近也是想试试blob算法检测个东西。发现Python方面讲这个的真不多,几乎都是说的算法原理,这里给出Python3代码,与 效果图。copy了别人的成果,代码什么的也是,原链接是:点击打开链接。这个网站是learnopencv,全英文的,无障碍的可以看看,我是为了自己学习整理了一下,如有错漏,欢迎指正。

1.什么是Blob?

       像素是图像中的一组连接像素,它们共享一些公共属性(例如灰度值)。在上面的图像中,暗连接区域是斑点,而斑点检测的目标是识别和标记这些区域。这个算法说白了就是检测图像的斑点,“一坨一坨”的异于周围背景的东西,代表的是一些“不同”的区域。

2. Blob检测是如何实现的?

      simpleblobdetector,顾名思义,就像下面描述的那样,是一个非常简单的算法。该算法由一些参数控制(如下所示),并具有以下步骤。从上往下来了解参数是如何设置的。

1.Thresholding :

      首先进行阈值分割。从设置的最小阈值minthreshold参数开始将源图分割为几个二值图。这些阈值是通过设置的步长thresholdStep 逐渐递增的,知道达到设置好的最大阈值maxThreshold参数。所以第一个阈值是minthreshold,第二个阈值是minthreshold+thresholdStep ,第三个阈值是minthreshold+2×thresholdStep ,以此类推。

2.Grouping:

      在每个二值图像中,连接的白像素被分组在一起。让我们调用这些斑点。

3.Merging  :

       合并。计算这些二值图中的斑点的中心,并且将相互之间距离小于设置的minDistBetweenBlobs 的斑点合并成一个

4.Center & Radius Calculation:

      中心和半径的计算。计算这些合并后的斑点的中心和半径,并返回。

3.通过颜色,大小和形状过滤这些斑点

可以通过设置SimpleBlobDetector 函数的参数对斑点进行过滤,来获得我们所需要的斑点

  • 通过颜色:【这个功能可能有点问题(当然博主不是很清楚这个问题,没试过),作者检查了这个代码,发现他有逻辑上的问题(也不知道他用的什么版本的opencv,是不是真有这个问题,官方是否已经对此进行了优化,知道的小伙伴可以告诉我)】。首先,需要设置filterByColor = 1,设置blobColor = 0来选择暗淡区域(应该就是黑色)的斑点,或者是blobColor = 255(来选择亮区域应该就是白色)的斑点。
  • 通过大小:可以通过将参数filterByArea =1,并且给minAreamaxArea设置恰当的参数。比如:将minArea=100,这样会将所有斑点里像素小于100的过滤掉。
  • 通过形状:现在形状有三种参数:
  1. 圆(Circularity  :这个仅仅衡量斑点和圆有多相似。比如:正六边形比正方形有更高的圆度。通过类圆性来过滤,可以设置filterByCircularity = 1,然后给minCircularity 和maxCircularity设置恰当的参数。类圆性定义如下:也就是(4π×面积)/(周长的平方)。也就是说圆的类圆性是1,正方形的类圆性是0.785等等。
  2. 凸性(Convexity ):凸性的定义是(斑点的面积/斑点凸包的面积)。一个形状的凸包是严格凸的形状,并且完全封闭(这玩意在手势识别里还是蛮好用的,不懂得可以去了解下)。将filterByConvexity =1,接下来设置 0 ≤ minConvexity ≤ 1maxConvexity ( ≤ 1) 。
  3. 惯量比(Inertia Ratio):不要被此吓倒(其实博主看的时候也不知道是啥)。数学经常使用一些迷惑性的语言去描述一些非常简单的东西。你所需要知道的是,这个测量了一个形状有多长。例如:对于一个圆,这个值是1,对于一个椭圆,它在0到1之间,对于一条直线,它是0。想要通过惯量比来过滤,需要设置filterByInertia =1, 0 ≤ minInertiaRatio ≤ 1,并且适当的设置参数maxInertiaRatio (≤ 1 )的值。

4.python代码实现

#!/usr/bin/python

# Standard imports
import cv2
import numpy as np;

# Read image
im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE)

# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()

# Change thresholds
params.minThreshold = 10
params.maxThreshold = 200


# Filter by Area.
params.filterByArea = True
params.minArea = 1500

# Filter by Circularity
params.filterByCircularity = True
params.minCircularity = 0.1

# Filter by Convexity
params.filterByConvexity = True
params.minConvexity = 0.87
    
# Filter by Inertia
params.filterByInertia = True
params.minInertiaRatio = 0.01

# Create a detector with the parameters
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3 :
	detector = cv2.SimpleBlobDetector(params)
else : 
	detector = cv2.SimpleBlobDetector_create(params)


# Detect blobs.
keypoints = detector.detect(im)

# 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(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show blobs
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

效果图如下:




  • 10
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
人脸识别门禁系统主要分为以下几个步骤: 1. 采集人脸数据:使用摄像头采集人脸数据,包括正面、侧面、斜视等角度的照片,并将这些数据存储在数据库中。 2. 人脸识别:使用OpenCV库中的人脸识别算法对人脸进行识别,判断是否为已经存储在数据库中的人脸数据。 3. 控制门禁:如果人脸识别结果是已经授权的用户,则开启门禁通过;否则,门禁保持关闭状态。 以下是一个基于PythonOpenCV的人脸识别门禁系统的设计和实现: 1. 安装OpenCV库:使用pip命令安装OpenCV库,命令为:pip install opencv-python。 2. 收集人脸数据:使用摄像头采集人脸数据。可以使用OpenCV库中的cv2.VideoCapture函数来获取摄像头捕获的视频流,使用cv2.imshow函数显示视频流。可以使用cv2.CascadeClassifier函数来检测人脸,并使用cv2.rectangle函数在图像上标记出人脸位置,然后使用cv2.imwrite函数保存人脸图像。 3. 创建人脸数据库:使用Python中的sqlite3库创建一个sqlite3数据库,用于存储已经采集到的人脸数据。可以使用sqlite3库中的execute函数执行SQL语句来创建数据库表格。 4. 人脸识别:使用OpenCV库中的人脸识别算法进行人脸识别。可以使用cv2.face.LBPHFaceRecognizer_create函数创建一个LBPH人脸识别器,并使用train函数训练识别器。在识别过程中,可以使用detectMultiScale函数检测人脸,并使用predict函数对人脸进行识别。 5. 控制门禁:如果人脸识别结果是已经授权的用户,则开启门禁通过;否则,门禁保持关闭状态。 代码示例: ```python import cv2 import sqlite3 # 定义摄像头编号 camera_port = 0 # 定义人脸检测器 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 定义LBPH人脸识别器 recognizer = cv2.face.LBPHFaceRecognizer_create() # 创建人脸数据库 def create_database(): conn = sqlite3.connect('face.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS faces (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, image BLOB NOT NULL)''') conn.commit() conn.close() # 添加人脸数据到数据库 def add_face(name, image): conn = sqlite3.connect('face.db') c = conn.cursor() c.execute("INSERT INTO faces (name, image) VALUES (?, ?)", (name, image)) conn.commit() conn.close() # 从数据库中获取人脸数据 def get_faces(): conn = sqlite3.connect('face.db') c = conn.cursor() c.execute("SELECT * FROM faces") rows = c.fetchall() conn.close() return rows # 训练人脸识别器 def train_recognizer(faces): images = [] labels = [] for id, name, image in faces: # 转换为灰度图像 gray_image = cv2.cvtColor(cv2.imdecode(image, cv2.IMREAD_GRAYSCALE), cv2.COLOR_GRAY2BGR) # 检测人脸 faces = face_cascade.detectMultiScale(gray_image, 1.3, 5) for (x, y, w, h) in faces: # 裁剪人脸图像 face = gray_image[y:y+h, x:x+w] # 添加到训练集中 images.append(face) labels.append(id) # 训练识别器 recognizer.train(images, np.array(labels)) # 人脸识别 def recognize_face(): # 打开摄像头 cap = cv2.VideoCapture(camera_port) while True: # 读取视频帧 ret, frame = cap.read() # 转换为灰度图像 gray_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray_image, 1.3, 5) for (x, y, w, h) in faces: # 裁剪人脸图像 face = gray_image[y:y+h, x:x+w] # 进行识别 id, confidence = recognizer.predict(face) # 如果置信度小于50,则认为识别成功 if confidence < 50: # 获取数据库中对应的人脸数据 conn = sqlite3.connect('face.db') c = conn.cursor() c.execute("SELECT * FROM faces WHERE id=?", (id,)) row = c.fetchone() conn.close() # 显示识别结果 cv2.putText(frame, row[1], (x, y-20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) # 控制门禁 open_door() else: # 显示识别失败的结果 cv2.putText(frame, 'Unknown', (x, y-20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2) # 显示视频帧 cv2.imshow('Face Recognition', frame) # 等待按键操作 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头 cap.release() cv2.destroyAllWindows() # 控制门禁 def open_door(): pass # 主函数 if __name__ == '__main__': create_database() # 添加人脸数据到数据库 add_face('Tom', cv2.imencode('.jpg', cv2.imread('tom.jpg'))[1].tostring()) add_face('Jerry', cv2.imencode('.jpg', cv2.imread('jerry.jpg'))[1].tostring()) # 获取人脸数据 faces = get_faces() # 训练识别器 train_recognizer(faces) # 开始人脸识别 recognize_face() ``` 在上面的代码示例中,我们首先创建了一个sqlite3数据库,用于存储人脸数据。然后,我们使用摄像头采集人脸数据,并将人脸数据添加到数据库中。接着,我们获取人脸数据,并使用训练数据训练了一个LBPH人脸识别器。最后,我们使用摄像头进行人脸识别,如果识别成功则开启门禁通过。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值