用最大距离判定的指尖检测算法(Python代码+OpenCV库,可直接运行)
1 编译环境
编程语言:Python
IDE:PyCharm 2017
OpenCV库
2 原理介绍
2.1 指尖检测应用
指尖检测应用范围非常广,常见应用如手势识别、人机交互等等领域,
2.2 实现原理
1、首先实现手掌部位的图像提取。
目前实现的算法主要有:一、基于人体颜色的提取,即根据人体肤色的HSV值的范围,确定图像中属于手掌的图像,提取出来。二、利用掩模来进行运算,即选取一帧图像作为背景,在此基础之上,判断图像的变化值即为伸入的手掌,但是该方法受光照的影响较大。
2.3 实现步骤
a.从摄像头获取视频,设置视频属性,设置窗口尺寸。
b.对图像进行双边滤波,保持边缘。
c.从摄像头获取的图像中取一个子窗口出来,将背景移除之后,转换为灰度图。
d.对上一步骤的灰度图进行二值化处理,然后运用cv2.findContours()函数寻找轮廓。
e.通过计算每一块轮廓的面积,进行比较确定最大的轮廓为手掌轮廓。
f.找出最大轮廓后,用cv2.convexHull()得出最大轮廓点集的凸包
g.画出最大区域轮廓和凸包轮廓
h.通过求最大轮廓的各阶矩(cv2.moments),来计算轮廓的重心,即为手掌的重心,
i.确定指尖点的位置,通过每一个轮廓点到重心的距离,结合周围点到重心的距离,找到距离的局部峰值,即为指尖点的位置,画出指尖点的位置即可。
3 代码
import cv2
import numpy as np
import copy
import math
import win32api
import win32con
# 参数
cap_region_x_begin = 0.5 # 起点/总宽度
cap_region_y_end = 0.8
threshold = 25 # 二值化阈值
blurValue = 41 # 高斯模糊参数
bgSubThreshold = 50
learningRate = 0
# 变量
isBgCaptured = 0 # 布尔类型, 背景是否被捕获
triggerSwitch = False # 如果正确,键盘模拟器将工作
def printThreshold(thr):
print("! Changed threshold to " + str(thr))
def removeBG(frame): #移除背景
fgmask = bgModel.apply(frame, learningRate=learningRate) #计算前景掩膜
kernel = np.ones((3, 3), np.uint8)
fgmask = cv2.erode(fgmask, kernel, iterations=1) #使用特定的结构元素来侵蚀图像。
res = cv2.bitwise_and(frame, frame, mask=fgmask) #使用掩膜移除静态背景
return res
# 相机/摄像头
camera = cv2.VideoCapture(0) #打开电脑自带摄像头,如果参数是1会打开外接摄像头
camera.set(10, 200) #设置视频属性
cv2.namedWindow('trackbar') #设置窗口名字
cv2.resizeWindow("trackbar", 640, 200) #重新设置窗口尺寸
cv2.createTrackbar('threshold', 'trackbar', threshold, 100, printThreshold)
#createTrackbar是Opencv中的API,其可在显示图像的窗口中快速创建一个滑动控件,用于手动调节阈值,具有非常直观的效果。
while camera.isOpened():
ret, frame = camera.read()
threshold = cv2.getTrackbarPos('threshold',