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中用fork()函数生成的子进程
May 04 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
Python3处理HTTP请求的实例
May 10 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
Jan 02 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
使用python动态生成波形曲线的实现
Dec 04 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
查看keras各种网络结构各层的名字方式
Jun 11 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 Python
python manim实现排序算法动画示例
Aug 14 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
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
php算法实例分享
2015/07/14 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
js精度溢出解决方案
2012/12/02 Javascript
php与js的区别是什么
2013/08/05 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
环保倡议书怎么写
2014/05/16 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
工作表扬信范文
2015/01/17 职场文书
开票员岗位职责
2015/02/12 职场文书
大国崛起观后感
2015/06/02 职场文书
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫