资源描述:
《如何用Opencv实现静态手势识别玩石头剪刀布?.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、如何用Opencv实现静态手势识别玩石头剪刀布? 要想运行该代码,请确保安装了:python2.7,opencv2.4.9 效果如下: 算法如下: 把图片先进行处理,处理过程: 1.用膨胀图像与腐蚀图像相减的方法获得轮廓。 2.用二值化获得图像 3.反色 经过如上的处理之后,图片为: 这之后就简单了,设计一个办法把三种图像区分开来即可。 代码如下: #-*-coding:cp936-*-importcv2importnumpyimportTImeimportrandomimportosdefjudge()
2、: #构造一个3&TImes;3的结构元素 #return0stone,1jiandao,2bu 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); #上面得到的
3、结果是灰度图,将其二值化以便更清楚的观察结果 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 foriinrange(result.shape[1]): forjinrange(result.shape[0]): if(resu
4、lt[j][i]==0): area+=1 foriinrange(result.shape[1]): if(result[5*result.shape[0]/16][i]==0andresult[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‘thepicwidthis‘,result.shape[1],’
5、n’ foriinrange(count): print‘the‘,i,’th’,’‘,’is’; print‘width‘,width[i] print‘posi‘,posi[i],’’ printcount,’’ print‘areais‘,area,’’ 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.wait
6、Key(0) ”““ #判定时间 width_length=0 width_jiandao=True foriinrange(count): ifwidth[i]>45: #print‘bu1’; return2; ifwidth[i]=40: width_jiandao=False width_length+=width[i] ifwidth_jiandao==Trueandcount==2: return1; if(area45: #print‘bu1’; return2; ifwidth[i]=40: width_j
7、iandao=False width_length+=width[i] ifwidth_jiandao==Trueandcount==2: return1; if(area>14000orcount>=3): #print‘bu2’; return2; if(width_length5): break if(cv2.waitKey(30)>=0): breakha,img=capture.read()capture.release()cv2.imshow(“camera”,img)img=img[0:210,426:640]cv2.imw
8、rite(“wif.jpg”,img)judge()