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中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
python操作mysql中文显示乱码的解决方法
Oct 11 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
python调用其他文件函数或类的示例
Jul 16 Python
python opencv图片编码为h264文件的实例
Dec 12 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
如何在Python 游戏中模拟引力
Mar 27 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 31 Python
Python Django获取URL中的数据详解
Nov 01 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
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
JQery 渐变图片导航效果代码 漂亮
2010/01/01 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
python查询mysql,返回json的实例
2018/03/26 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
离婚协议书样本
2015/01/26 职场文书
八年级语文教学反思
2016/03/03 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js