用最大距离判定的指尖检测算法(Python代码+OpenCV库,可直接运行)

用最大距离判定的指尖检测算法(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', 
  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值