opencv实现静态手势识别 opencv实现剪刀石头布游戏


Posted in Python onJanuary 22, 2019

本文实例为大家分享了opencv实现静态手势识别的具体代码,供大家参考,具体内容如下

要想运行该代码,请确保安装了:python 2.7,opencv 2.4.9

效果如下:

opencv实现静态手势识别 opencv实现剪刀石头布游戏

opencv实现静态手势识别 opencv实现剪刀石头布游戏

opencv实现静态手势识别 opencv实现剪刀石头布游戏

opencv实现静态手势识别 opencv实现剪刀石头布游戏

opencv实现静态手势识别 opencv实现剪刀石头布游戏

opencv实现静态手势识别 opencv实现剪刀石头布游戏

opencv实现静态手势识别 opencv实现剪刀石头布游戏

算法如下:

把图片先进行处理,处理过程:

     1.用膨胀图像与腐蚀图像相减的方法获得轮廓。

     2.用二值化获得图像

     3. 反色

经过如上的处理之后,图片为:

opencv实现静态手势识别 opencv实现剪刀石头布游戏

这之后就简单了,设计一个办法把三种图像区分开来即可。

代码如下:

# -*- 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:
 return 1;
 if(area>14000 or count>=3):
 #print 'bu2';
 return 2;
 if(width_length<110):
 #print 'jian dao';
 return 1;
 else:
 #print 'bu3';
 return 2;
 
 
"""
print("这是通过摄像头来玩的剪刀石头布的游戏,输入y开始\n")
s = raw_input()
capture = cv2.VideoCapture(0)
cv2.namedWindow("camera",1)
start_time = time.time()
print("给你5秒的时间把手放到方框的位置\n")
while(s=='y' or s=='Y'):
 ha,img =capture.read()
 end_time = time.time()
 cv2.rectangle(img,(426,0),(640,250),(170,170,0))
 cv2.putText(img,str(int((5-(end_time- start_time)))), (100,100), cv2.FONT_HERSHEY_SIMPLEX, 2, 255)
 cv2.imshow("camera",img)
 
 if(end_time-start_time>5):
 break
 if(cv2.waitKey(30)>=0):
 break
ha,img = capture.read()
capture.release()
cv2.imshow("camera",img)
img = img[0:210,426:640]
cv2.imwrite("wif.jpg",img)
judge() 
cv2.waitKey(0)
print "fuck"
"""
def game():
 fuck =[]
 fuck.append("石头")
 fuck.append("剪刀")
 fuck.append("布")
 capture = cv2.VideoCapture(0)
 cv2.namedWindow("camera",1)
 start_time = time.time()
 print("给你5秒的时间把手放到方框的位置\n")
 while(1):
 ha,img =capture.read()
 end_time = time.time()
 cv2.rectangle(img,(426,0),(640,250),(170,170,0))
 cv2.putText(img,str(int((5-(end_time- start_time)))), (100,100), cv2.FONT_HERSHEY_SIMPLEX, 2, 255)
 cv2.imshow("camera",img)
 if(end_time-start_time>5):
  break
 if(cv2.waitKey(30)>=0):
  break
 ha,img = capture.read()
 capture.release()
 cv2.imshow("camera",img)
 img = img[0:210,426:640]
 cv2.imwrite("wif.jpg",img)
 p1 = judge()
 pc = random.randint(0,2)
 #print p1,' ',pc,'\n'
 print "你出的是",fuck[p1]," 电脑出的是",fuck[pc],"\n"
 cv2.destroyAllWindows()
 if(p1==pc):
 print "平局\n"
 return 0
 if((p1==0 and pc ==1)or(p1==1 and pc ==2)or(p1==2 and pc ==0)):
 print '你赢了\n'
 return 1
 else:
 print '你输了\n'
 return -1
def main():
 you_win=0
 pc_win=0
 print("这是通过摄像头来玩的剪刀石头布的游戏,请输入回车开始游戏\n")
 s = raw_input()
 while(1):
 print "比分(玩家:电脑) ",you_win,":",pc_win,'\n'
 s = raw_input()
 os.system('cls')
 ans =game()
 if(ans == 1):
  you_win+=1
 elif(ans == -1):
  pc_win+=1
 print "为了减少误判,请尽可能将手占据尽可能大的框框"
main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3中的2to3转换工具使用示例
Jun 12 Python
python3.5仿微软计算器程序
Mar 30 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
python保留小数位的三种实现方法
Jan 07 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
Python中的xlrd模块使用整理
Jun 15 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
Apr 11 Python
python自动发送测试报告邮件功能的实现
Jan 22 #Python
python3去掉string中的标点符号方法
Jan 22 #Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 #Python
python3.4爬虫demo
Jan 22 #Python
使用Template格式化Python字符串的方法
Jan 22 #Python
python实现公司年会抽奖程序
Jan 22 #Python
对python函数签名的方法详解
Jan 22 #Python
You might like
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php中设置多级目录session的问题
2011/08/08 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
基于JQuery的动态删除Table表格的行和列的代码
2011/05/12 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
详解python UDP 编程
2020/08/24 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
应用服务器有那些
2012/01/19 面试题
季度思想汇报
2014/01/01 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
厨房管理计划书
2014/04/27 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
出纳试用期自我评价
2015/03/10 职场文书
杨善洲观后感
2015/06/04 职场文书
被委托人身份证明
2015/08/07 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang