实现静态手势识别 opencv实现剪刀石头布游戏
实现剪刀石头布游戏
opencv实现静态手势识别
主要为大家详细介绍了opencv实现静态手势识别,opencv实现剪刀石头布游戏,具有一定的参考价值,感兴趣的小伙伴们可以
参考一下
本文实例为大家分享了opencv实现静态手势识别的具体代码,供大家参考,具体内容如下
要想运行该代码,请确保安装了:python 2.7,opencv 2.4.9
效果如下:
算法如下:
算法如下:
把图片先进行处理,处理过程:
1.用膨胀图像与腐蚀图像相减的方法获得轮廓。
2.用二值化获得图像
3. 反色
经过如上的处理之后,图片为:
这之后就简单了,设计一个办法把三种图像区分开来即可。
代码如下:
# -*- coding: cp936 -*-
import cv2
import numpy
import time
import random
import os
def judge( ):
#构造一个3×3的结构元素
# return 0 stone ,1 jiandao, 2 bu
img = cv2.imread("wif.jpg",0)
element = cv2.getStructuringElement(cv2.MORPH_RECT,(11,11))
dilate = cv2.dilate(img, element)
erode = cv2.erode(img, element)
#将两幅图像相减获得边,第一个参数是膨胀后的图像,第二个参数是腐蚀后的图像
result = cv2.absdiff(dilate,erode);
#上面得到的结果是灰度图,将其二值化以便更清楚的观察结果
retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY);
#反色,即对二值图每个像素取反
result = cv2.bitwise_not(result);
result =cv2.medianBlur(result,23)
a=[]
posi =[]
width =[]
count = 0
area = 0
for i in range(result.shape[1]):
for j in range(result.shape[0]):
if(result[j][i]==0):
area+=1
for i in range(result.shape[1]):
if(result[5*result.shape[0]/16][i]==0 and result[5*result.shape[0]/16][i-1]!=0 ):
count+=1
width.append(0)
posi.append(i)
if(result[5*result.shape[0]/16][i]==0):
width[count-1]+=1
"""
print 'the pic width is ',result.shape[1],'\n'
for i in range(count):
print 'the ',i,'th',' ','is';
print 'width ',width[i]
print 'posi ',posi[i],'\n'
print count,'\n'
print 'area is ',area,'\n'
cv2.line(result,(0,5*result.shape[0]/16),(214,5*result.shape[0]/16),(0,0,0))
cv2.namedWindow("fcuk")
cv2.imshow("fcuk",result)
cv2.waitKey(0)
"""
#判定时间
width_length=0
width_jiandao = True
for i in range(count):
if width[i]>45:
#print 'bu1';
return 2;
if width[i]<=20 or width[i]>=40:
width_jiandao= False
width_length += width[i]
if width_jiandao==True and count==2:
return 1;
if(area <8500):
#print 'shi tou';
return 0;
print "width_leng",width_length
if(width_length<35):
#这个时候说明照片是偏下的,所以需要重新测定。
a=[]
posi =[]
width =[]
count = 0
for i in range(result.shape[1]):
if(result[11*result.shape[0]/16][i]==0 and result[11*result.shape[0]/16][i-1]!=0 ):
count+=1
width.append(0)
posi.append(i)
if(result[11*result.shape[0]/16][i]==0):
width[count-1]+=1
"""
print 'the pic width is ',result.shape[1],'\n'
for i in range(count):
print 'the ',i,'th',' ','is';
print 'width ',width[i]
print 'posi ',posi[i],'\n'
print count,'\n'
print 'area is ',area,'\n'
"""
width_length=0
width_jiandao = True
for i in range(count):
if width[i]>45:
#print 'bu1';
return 2;
if width[i]<=20 or width[i]>=40:
width_jiandao= False
width_length += width[i]
if width_jiandao==True and count==2: