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 相关文章推荐
Python中使用PDB库调试程序
Apr 05 Python
Python语言的面相对象编程方式初步学习
Mar 12 Python
Python实现的下载网页源码功能示例
Jun 13 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
5分钟 Pipenv 上手指南
Dec 20 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
使用Python发现隐藏的wifi
Mar 04 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
Pycharm github配置实现过程图解
Oct 13 Python
python 获取计算机的网卡信息
Feb 18 Python
Python 全局空间和局部空间
Apr 06 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
Terran魔法科技
2020/03/14 星际争霸
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
用jscript实现新建word文档
2007/06/15 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
angularJS 入门基础
2015/02/09 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
vue之延时刷新实例
2019/11/14 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
详解Python的Lambda函数与排序
2016/10/25 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
python动态文本进度条的实例代码
2020/01/22 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
Linux的主要特性
2016/09/03 面试题
土木工程师岗位职责
2013/11/24 职场文书
运动会解说词50字
2014/01/18 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书