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

效果如下:

算法如下:
       把图片先进行处理,处理过程:

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

2.用二值化获得图像

3. 反色

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

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

代码如下:

# -*- coding: cp936 -*-
import cv2
import numpy
import time
import random
import os
def judge( ):#构造一个3×3的结构元素# return 0 stone ,1 jiandao, 2 buimg = 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 = 0area = 0 for i in range(result.shape[1]):for j in range(result.shape[0]):if(result[j][i]==0):area+=1for 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+=1width.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=0width_jiandao = Truefor i in range(count):if width[i]>45:#print 'bu1';return 2;if width[i]<=20 or width[i]>=40:width_jiandao= Falsewidth_length += width[i]if width_jiandao==True and count==2:return 1;if(area <8500):#print 'shi tou';return 0;print "width_leng",width_lengthif(width_length<35):#这个时候说明照片是偏下的,所以需要重新测定。a=[]posi =[]width =[]count = 0for 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+=1width.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=0width_jiandao = Truefor i in range(count):if width[i]>45:#print 'bu1';return 2;if width[i]<=20 or width[i]>=40:width_jiandao= Falsewidth_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):breakif(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):breakif(cv2.waitKey(30)>=0):breakha,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 0if((p1==0 and pc ==1)or(p1==1 and pc ==2)or(p1==2 and pc ==0)):print '你赢了\n'return 1else:print '你输了\n'return -1
def main():you_win=0pc_win=0print("这是通过摄像头来玩的剪刀石头布的游戏,请输入回车开始游戏\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+=1elif(ans == -1):pc_win+=1print "为了减少误判,请尽可能将手占据尽可能大的框框"
main()

opencv 实现的静态手势识别 进而玩剪刀石头布相关推荐

  1. 周末项目:使用scikit-learn进行手语和静态手势识别

    by Sreehari 通过Sreehari 周末项目:使用scikit-learn进行手语和静态手势识别 (Weekend project: sign language and static-ges ...

  2. 基于OpenCV的简易实时手势识别(含代码)

    基于OpenCV的简易实时手势识别 1.基本信息介绍 1.1实验步骤 1.2效果展示 2.肤色检测+二值化+开运算+高斯模糊 2.1 flip()函数原型 2.2cvtColor()函数原型 2.3s ...

  3. 毕业设计 - 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

    文章目录 1 简介 2 传统机器视觉的手势检测 2.1 轮廓检测法 2.2 算法结果 2.3 整体代码实现 2.3.1 算法流程 3 深度学习方法做手势识别 3.1 经典的卷积神经网络 3.2 YOL ...

  4. 静态手势识别总体方案

    静态手势识别总体方案 0.说明 1.实现目标 2.实现步骤 1)总体思路 2)每部分效果 基于高斯肤色模型和动态阈值的手势分割 基于Canny算法的轮廓提取 基于Hu矩的量化 基于傅里叶描述子的量化 ...

  5. Python使用Opencv图像处理方法完成手势识别(一)

    Opencv完成手势识别 HSV的提取 特征提取 轮廓绘制 完整代码 由于是使用Opencv完成手势识别,所以首先利用颜色特征是对手的颜色进行提取,获得HSV的最小值与最大值. HSV的提取 HSV颜 ...

  6. 基于MATLAB视觉的静态手势识别系统

    基于MATLAB视觉的静态手势识别系统 一.课题介绍及思路 为了丰富手势识别方法的多样性,提高手势识别的正确率,提出了一种基于手势轮廓像素变化的手势识别方法.在Matlab环境下,设计并开发了一个基于 ...

  7. 复杂背景下的静态手势识别研究

    摘要 为了解决聋哑人在日常生活和工作中的沟通障碍及传统手势识别方法易受复杂环境影响的问题,提出一种基于YCbCr颜色空间和卷积神经网络相结合的静态手势识别算法.该算法首先基于YCbCr颜色空间对手部区 ...

  8. 静态手势识别控制游戏方向

    这个主要通过的是静态的手势识别,从而根据判断得到的结果调用模拟键盘相应的W,A,S,D的按下与弹起的API函数,从而实现通过手势即可控制游戏中人物的跑位,和行驶方向.由于自己的电脑很差,运行其来很卡, ...

  9. 天啦噜!在家和爱豆玩剪刀石头布,阿里工程师如何办到?

    2019独角兽企业重金招聘Python工程师标准>>> 阿里妹导读:如今,90.00后一代成为消费主力,补贴.打折.优惠等"价格战"已很难建立起忠诚度,如何与年轻 ...

最新文章

  1. 决策树算法原理(ID3,C4.5)
  2. 机器学习:线性回归简单有效,但是千万不要踩到雷区!
  3. 如何反编译,防止反编译,常见问题总结
  4. .java生成dex文件
  5. 程序猿永远就是程序员的命么?
  6. sharepoint修改密码
  7. 仙剑四--IT的同仁有,是仙剑迷的请浏览
  8. ipad浏览器安装java_360浏览器苹果平板下载
  9. android 模拟器 电脑配置,手机安卓模拟器多开对电脑配置要求与占用浅谈
  10. Java性能优化全攻略
  11. 基于 OS X Mavericks 系统
  12. 西安电子科技大学计算机学院保研政策,西安电子科技大学计算机学院(专业学位)计算机技术保研条件...
  13. 一份Yann LeCun等16个顶级数据科学家给新人的建议
  14. ipados链接android,iPadOS怎么升级 iPadOS升级教程
  15. 文件查找(c语言 findfirst函数,findnext函数)
  16. EAS小贷系统(财务业务一体化)
  17. 先立业or先成家? 从收益矩阵来分析
  18. unity+高通vuforia开发增强现实(AR)教程(一)
  19. 深圳多区发布小一初一学位政策-查查吧深圳学区房地图
  20. 最小生成树--还是畅通工程

热门文章

  1. 移动前端手机输入法自带emoji表情字符处理
  2. 9. python 入门教程快速复习,序列,数值类型,字符串方法,列表、集合、字典方法,文件操作,解析式
  3. 参赛必备 | “互联网+”大赛参赛攻略
  4. 【解决方案】VR视频行业急速发展,如何搭建一套16K高清的公网视频传输系统?
  5. 免费Word简历+PPT模板下载网站
  6. Python requests模块高级用法
  7. 代码之外——名人哲语
  8. 深度Linux安装火狐,deepin或Ubuntu安装最新版Firefox,并设置去掉标题栏
  9. ClickHouse技术分享第二弹(英文讲义)
  10. selenium实现163邮箱自动登录