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 线程的暂停, 恢复, 退出详解及实例
Dec 06 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
python音频处理用到的操作的示例代码
Oct 27 Python
Python socket实现简单聊天室
Apr 01 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
Python实现验证码识别
Jun 15 Python
Python3.7安装pyaudio教程解析
Jul 24 Python
Python pandas求方差和标准差的方法实例
Aug 04 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环境
2013/08/31 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
php图片添加水印例子
2016/07/20 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
基于vue展开收起动画的示例代码
2018/07/05 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
用Python进行TCP网络编程的教程
2015/04/29 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python编程之string相关操作实例详解
2017/07/22 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
教师绩效工资方案
2014/02/01 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
校本课程教学计划
2015/01/19 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server