基于opencv的姿态识别探索

给一个觉得比较好的数据集(http://www.nada.kth.se/cvap/actions/)

手势识别之手势检测

代码参考于(https://github.com/rainyear/lolita/issues/8)

import cv2
import numpy as np

def main():
   cap = cv2.VideoCapture(0)
   while(cap.isOpened()):
       ret, img       = cap.read()

       skinMask = HSVBin(img)
       contours = getContours(skinMask)
       cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
       cv2.imshow('capture', img)
       k = cv2.waitKey(10)
       if k == 27:
           break
def getContours(img):
   kernel = np.ones((5,5),np.uint8)
   closed = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
   closed = cv2.morphologyEx(closed, cv2.MORPH_CLOSE, kernel)
   _,contours, h  = cv2.findContours(closed, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
   validContours = [];
   for cont in contours:
       if cv2.contourArea(cont) > 9000:
           # x,y,w,h = cv2.boundingRect(cont)
           # if h/w > 0.75:
           validContours.append(cv2.convexHull(cont))
           # rect = cv2.minAreaRect(cont)
           # box = cv2.cv.BoxPoints(rect)
           # validContours.append(np.int0(box))
   return validContours
# 皮肤检测,皮肤颜色在HSV颜色空间下与周围环境区分度更高
# 所以把RGB转换到HSV颜色空间下针对皮肤颜色进行二值化,得到mask
def HSVBin(img):
   hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)

   lower_skin = np.array([100, 50, 0])
   upper_skin = np.array([125, 255, 255])

   mask = cv2.inRange(hsv, lower_skin, upper_skin)
   # res = cv2.bitwise_and(img, img, mask=mask)
   return mask
if __name__ == '__main__':
   main()
  • ctvColor:颜色空间转换

  • inRange: lower..指图像中低于这个值,图像值变为0,upper:指图像中高于这个值,图像值变为0,而在之间的值变为255

  • bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
    不太懂??

  • 去除一些噪点--腐蚀与膨胀,得到更完整的白色(皮肤)色块,最后找出色块的轮廓,并通过色块大小排除一些面积较小的噪点。

    • 膨胀:dilate,进行膨胀操作时,将内核 B划过图像,将内核B覆盖区域的最大像素值提取,并代替锚点位置的像素,这一最大化操作会导致图像中的亮区开始“扩展”

    • 腐蚀:erode,将最小像素值提取
      原始图片里的一个像素(1或者0)只有在核下的所有像素都是1的时候才被认为是1.否则它就被腐蚀掉了(变成0)

      根据核的大小来决定在边界附近的多少像素会被丢弃掉,所以前景物体的厚度或大小会缩小,或者说白色区域会减小。这个在移除小的白色噪点时很有用。

  • ones(shape[,dtype,order]) 依据一个给定的形状和类型返回一个新的元素全部为1的数组。
    • data type :uint8 -->range:0~255,一张图片的数据类型默认为unit8
      kernel = np.ones((5,5), np.uint8),,给一个5x5的核,
  • 开:腐蚀之后再膨胀的另一个名字。我们使用函数cv2.morphologyEx()
    opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
  • 闭:膨胀之后再腐蚀,在用来关闭前景对象里的小洞或小黑点很有用。
    closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
  • 轮廓检测 cv2.findContours
    接收参数为二值图,所以可以考虑先转换成灰度,再转成二值,如下:
import cv2  
  
img = cv2.imread('D:\\test\\contour.jpg')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
  
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  
cv2.drawContours(img,contours,-1,(0,0,255),3)  
  
cv2.imshow("img", img)  

函数原型:

contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

参数说明:

  1. mode:轮廓检索模式。RETR_TREE: 建立一个等级树结构的轮廓
  2. method:轮廓的近似办法。cv2.CHAIN_APPROX_SIMP:压缩水平方向、垂直方向、对角线方向的元素,只保留该方向的终点坐标。例如一个矩形轮廓只需要 4 个点来保存轮廓信息
  3. contours-返回的轮廓,返回一个list,list中每个元素是图像中一个轮廓
    4.hierarchy-每条轮廓对应的属性
    5.cv2.drawContours()绘制轮廓
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
 
  1. coutourIdx:指定绘制哪条轮廓,如果为-1则所有,
    7.(0,0,225)表颜色
  • cv.contourArea-计算面积
    8.cv2.waitKey()--waitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms。返回值为当前键盘按键值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 图像和视频分析 原文:Images and Video Analysis 译者:飞龙 协议:CC BY-NC-SA...
    布客飞龙阅读 14,318评论 0 94
  • 技术要点分析:此次项目中主要的技术划分为身份证号码区域提取和光学字符识别。身份证号码区域的提取涉及有:图像灰度化阀...
    HoFie阅读 8,890评论 12 34
  • 我走在夜里,过往与未来扑面而来。 我和舍友说起高中的同桌兼舍友是个文艺少女,会弹吉他和尤克里里。她向往丽江,所以大...
    苏檠空阅读 774评论 3 1
  • 一个高中遇到小学同学的故事 小时候看过伍美珍的一本书,讲的什么忘的差不多了,就记得一堆人名。直接用了。 只愿博君一...
    常言阅读 489评论 0 3