新聞中心

EEPW首頁(yè) > 消費(fèi)電子 > 設(shè)計(jì)應(yīng)用 > 如何用Opencv實(shí)現(xiàn)靜態(tài)手勢(shì)識(shí)別玩石頭剪刀布?

如何用Opencv實(shí)現(xiàn)靜態(tài)手勢(shì)識(shí)別玩石頭剪刀布?

作者: 時(shí)間:2017-10-22 來(lái)源:網(wǎng)絡(luò) 收藏

要想運(yùn)行該代碼,請(qǐng)確保安裝了:python 2.7, 2.4.9

本文引用地址:http://2s4d.com/article/201710/367547.htm

效果如下:

算法如下:

把圖片先進(jìn)行處理,處理過(guò)程:

1.用膨脹圖像與腐蝕圖像相減的方法獲得輪廓。

2.用二值化獲得圖像

3. 反色

經(jīng)過(guò)如上的處理之后,圖片為:

這之后就簡(jiǎn)單了,設(shè)計(jì)一個(gè)辦法把三種圖像區(qū)分開來(lái)即可。

代碼如下:

# -*- coding: cp936 -*-import cv2import numpyimport TImeimport randomimport osdef judge( ):#構(gòu)造一個(gè)3&TImes;3的結(jié)構(gòu)元素# 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)#將兩幅圖像相減獲得邊,第一個(gè)參數(shù)是膨脹后的圖像,第二個(gè)參數(shù)是腐蝕后的圖像result = cv2.absdiff(dilate,erode);#上面得到的結(jié)果是灰度圖,將其二值化以便更清楚的觀察結(jié)果retval, result = cv2.threshold(result, 40, 255, cv2.THRESH_BINARY);#反色,即對(duì)二值圖每個(gè)像素取反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]+=1print the pic width is ,result.shape[1],nfor i in range(count):print the ,i,th, ,is;print width ,width[i]print posi ,posi[i],nprint count,nprint area is ,area,ncv2.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)#判定時(shí)間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_length35):#這個(gè)時(shí)候說(shuō)明照片是偏下的,所以需要重新測(cè)定。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]+=1print the pic width is ,result.shape[1],nfor i in range(count):print the ,i,th, ,is;print width ,width[i]print posi ,posi[i],nprint count,nprint area is ,area,nwidth_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_length110):#print jian dao;return 1;else:#print bu3;return 2;print(這是通過(guò)攝像頭來(lái)玩的剪刀石頭布的游戲,輸入y開始n)s = raw_input()capture = cv2.VideoCapture(0)cv2.namedWindow(camera,1)start_TIme = TIme.time()print(給你5秒的時(shí)間把手放到方框的位置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):breakha,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 fuckdef game():fuck =[]fuck.append(石頭)fuck.append(剪刀)fuck.append(布)capture = cv2.VideoCapture(0)cv2.namedWindow(camera,1)start_time = time.time()print(給你5秒的時(shí)間把手放到方框的位置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,nprint 你出的是,fuck[p1], 電腦出的是,fuck[pc],ncv2.destroyAllWindows()if(p1==pc):print 平局nreturn 0if((p1==0 and pc ==1)or(p1==1 and pc ==2)or(p1==2 and pc ==0)):print 你贏了nreturn 1else:print 你輸了nreturn -1def main():you_win=0pc_win=0print(這是通過(guò)攝像頭來(lái)玩的剪刀石頭布的游戲,請(qǐng)輸入回車開始游戲n)s = raw_input()while(1):print 比分(玩家:電腦) ,you_win,:,pc_win,ns = raw_input()os.system(cls)ans =game()if(ans == 1):you_win+=1elif(ans == -1):pc_win+=1print 為了減少誤判,請(qǐng)盡可能將手占據(jù)盡可能大的框框main()


關(guān)鍵詞: opencv 手勢(shì)識(shí)別

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉