人脸定位程序及结果

来源:互联网 发布:软件测试的作用 编辑:程序博客网 时间:2024/06/16 01:19


人脸定位理论方法,参考冯伟兴的Visual C++ 数字图像模式识别典型案例详解

整个程序用python 写成。因为初涉python和opencv ,不足之处,请看客多多提出,共同交流。

人脸定位建立在肤色相似度检测的基础上,将检测后的图片,进行二值化处理,阈值设置为整幅图片的灰度均值,高于均值的设为255,相反则设为0.

人脸定位的关键在于找出人脸轮廓的边界。因为二值化后的人脸图片为白,因此利用水平和竖直投影计数的方法,阈值设为每行和每列的投影计数最大值的50%。这个阈值根据识别的人脸不同,需要有灵活的调整。

左右上用投影计数,为避免下部脖子影响定位,以1.2乘以脸宽,作为脸长。

用opencv的cv2.line(img1,(left,0),(left,h),(0,255,0),2) 和 cv2.rectangle(img2,(img_left,img_top),(img_right,img_bottom),(0,200,200),1,1,0) 函数确定边界,并实现矩形轮廓定位。


# -*- coding: utf-8 -*-# the location and splitimport cv2import numpy as npimg = cv2.imread("image/grayface.jpg")img2 = cv2.imread("image/t4.jpg")h = img.shape[0]      #图像高宽w = img.shape[1]print(h)print(w)sum = 0         midle = 0print(img[34,67])for i in range(h):    for j in range(w):        sum += img[i,j][1]   midle = sum/(h*w)     #图像的灰度均值print(midle)for i in range(h):      #二值化    for j in range(w):        if img[i,j][1] > midle:            img[i,j] = 255        else:            img[i,j] = 0cv2.imshow('split',img)                cv2.imwrite('image/split.jpg',img)lwrite = np.zeros(h,np.int)hwrite = lwritemax = 0print(img[34,67])print(lwrite[34])for j in range(w):      #统计每列中白色像素点个数    for i in range(h):        if img[i,j][1] == 255:            lwrite[j] +=1    if lwrite[j] > max:        max = lwrite[j]print(max)img1 = img.copy()#画出脸左侧轮廓线for left in range(w):    if lwrite[left + 1] > max/2:        #cv2.line(img1,(left,0),(left,h),(0,255,0),2)        img_left = left        break#画出脸右侧轮廓线    for right in range(w-1,0,-1):    if lwrite[right - 1] > max/2:        #cv2.line(img1,(right,0),(right,h),(0,255,0),2)        img_right = right        breakww = img_right - img_leftprint(ww)for i in range(h):      #统计每行中白色像素点个数    for j in range(w):        if img[i,j][1] == 255:            hwrite[i] +=1    if lwrite[i] > max:        max = hwrite[i]        #画出脸上侧轮廓线for top in range(h):    if hwrite[top + 1] > max/3:       # cv2.line(img1,(0,top),(w,top),(0,255,0),2)        img_top = top        break    #画出脸下侧轮廓img_bottom = int(1.3*ww + img_top)print(img_bottom)#cv2.line(img1,(0,img_bottom),(w,img_bottom),(0,255,0),2)#在二值化图上画出脸轮廓cv2.rectangle(img1,(img_left,img_top),(img_right,img_bottom),(0,0,255),1,1,0)cv2.imshow('img1',img1)cv2.imwrite('image/location1.jpg',img1)#在原图上画出脸轮廓cv2.rectangle(img2,(img_left,img_top),(img_right,img_bottom),(0,200,200),1,1,0)cv2.imwrite('image/location2.jpg',img2)    


定位结果:






为什么每阶段选择的是颖宝不同的照片?

因为保存了很多颖宝的图片作为实验用,虽然不是粉丝,但是做实验用看着不会心烦,比较可爱。用此图片,不用上一张,是因为上一张的定位效果并不能很好用在此图片上。导致脸圈的太长。

别的颖宝的脸在定位的时候,甚至与出现定位到饰品上,因为裸露胳膊、以及木色背景,导致整张图片定位到整幅图片,出现定位失败。


原创粉丝点击