人脸定位程序及结果
来源:互联网 发布:软件测试的作用 编辑:程序博客网 时间:2024/06/16 05:12
人脸定位理论方法,参考冯伟兴的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)
定位结果:
为什么每阶段选择的是颖宝不同的照片?
因为保存了很多颖宝的图片作为实验用,虽然不是粉丝,但是做实验用看着不会心烦,比较可爱。用此图片,不用上一张,是因为上一张的定位效果并不能很好用在此图片上。导致脸圈的太长。
别的颖宝的脸在定位的时候,甚至与出现定位到饰品上,因为裸露胳膊、以及木色背景,导致整张图片定位到整幅图片,出现定位失败。
阅读全文
0 0
- 人脸定位程序及结果
- I2C测试程序及结果
- 人脸肤色相似度检测——程序及运行结果
- FFmpeg X265试用及测试程序结果
- 香农编码C程序及演示结果
- 哈夫曼编码C程序及演示结果
- 微信小程序产品定位及功能介绍
- p180冒泡排序的完整程序及输出结果
- 8086汇编语言学习实验3个程序及运行结果
- 费诺编码C程序及演示结果
- KNN分类算法及MATLAB程序与结果
- Keras 示例程序结果演示及代码解析
- 基于QT和opencv的瞳孔定位及跟踪程序
- 人脸区域定位
- 标准程序结果
- 【C语言】程序结果
- 读程序写结果:
- 写程序结果
- Linux之文件与目录管理
- 纯CSS实现自适应正方形
- 如何模块化swift中的状态?
- ios-模拟imageView的类
- swift 使用Kingfisher进行网络图片的下载
- 人脸定位程序及结果
- 将datagrid表格数据导出为Excel(动态列)
- 计算语音识别结果编辑距离的开源软件:sclite的编译、安装与运行
- 《产品的视角》- 书摘整理
- 二分查找的次数
- React.js refs 和props传递数据
- 【HDU
- linux系统下如何对用户进行赋权操作。
- F