人脸姿态对比---挑出最接近的照片(简化版)

上一篇文章具体介绍了实现过程,这里就不多介绍了,有需要的可以转到上一篇去看看。

本文是在做上一篇文章的模块时,中间的实验代码,功能模块比较简单易懂,适合熟悉下逻辑。

代码1:

计算眉间距、左右侧脸、俯仰值、光强

txt格式:

import glob
from PIL import Image
import os
import numpy as np
import xlrd
import xlutils.copy

def get_arr(line):
	lens=len(line)
	list2=[]
	for i in range(lens-7,lens-1):
		line[i]=line[i].strip()
		line[i]=line[i].strip('[]')
		line[i]=line[i].split(",")
		list2.append(line[i])
	arr=np.array(list2)
	arr=arr.astype(int)
	return arr

def get_distance(line,arr):
	lens=len(line)
	#眉角:3-9,左右:12-24  24-18,鼻尖26
	brow=arr[1][0]-arr[0][0]   #眉角
	left=arr[4][0]-arr[2][0]
	right=arr[3][0]-arr[4][0]
	left_right=abs(left-right)   #左右
	pitch=line[lens-1]    #鼻尖
	return brow,left_right,pitch

def avg(list1):
    avg = float(sum(list1))/len(list1)
    return avg

def get_light(files):
    im = Image.open(files)
    #取图片的中心区域坐标,获取该区域的平均RGB;或者900X2900;或者通过特征点取区域
    img_size = im.size
    w = img_size[0] // 2-100
    h = img_size[1] // 2-100
    # w =900
    # h = 2900
    pix = im.load()
    r=[]
    g=[]
    b=[]
    for x in range(201):
        RGB = pix[w+x, h+x]
        r.append(RGB[0]*0.3)
        g.append(RGB[1]*0.6)
        b.append(RGB[2]*0.1)
    light=(avg(r)+avg(g)+avg(b))/3
    light='%.2f' %light
    return light

#打开表格,选中表sheet1
data = xlrd.open_workbook('txt/a1.xls')
ws = xlutils.copy.copy(data)
table=ws.get_sheet(1)
n=0
path='txt/'
files = os.listdir(path)
for file in files:
	if file.endswith('txt'):
		n=n+1
		f1 = open(path+file, 'r')
		line=f1.readlines()
		arr=get_arr(line)
		distance=get_distance(line,arr)
		
		table.write(n,0,float(distance[0]))
		table.write(n,1,float(distance[1]))
		table.write(n,2,float(distance[2]))
		# ws.save('txt/a1.xls')

		print("眉角间距离为:",distance[0])
		print("左右距离为:",distance[1])
		print("俯仰值为:",distance[2])
		print("第"+str(n)+"次------计算完毕")
n=0
path2='img/'
files=os.listdir(path2)
for file in files:
	if file.endswith('.jpg'):
		n=n+1
		files=path2+file
		lights=get_light(files)
		print("光照亮度为:",lights)
		table.write(n,3,float(lights))

ws.save('txt/a1.xls')

结果如下:

代码2:

计算分数(罚分),分数越小越接近

import xlrd
import xlutils.copy
import os

def get_min(row1,n,m):
	rows1=(row1-1)*n+1
	rows2=(row1-1)*n+row1
	lists=[]
	# print(rows1,rows2)
	for i in range(rows1,rows2):
		values=float(table4.cell_value(i,m))
		lists.append(values)
	lists.sort()
	min_value=lists[0]

	for i in range(rows1,rows2):
		values=table4.cell_value(i,m)
		if values==min_value:
			min_num=i
	return min_value,min_num

def get_difference(row1,row2):
	#计算sheet1与sheet2的差
	for n in range(0,4):
		for i in range(1,row2):
			for j in range(1,row1):
				temp1 = float(table1.cell_value(j,n))
				temp2 = float(table2.cell_value(i,n))
				temp3 = abs(temp2-temp1)
				score = int((temp3/temp1)/0.05)
				index=(i-1)*(row1-1)+j
				table3.write(index,n,int(score))

def get_sum(row1,row2,n):
	#计算sheet3的和,得到总分
	row_all=(row1-1)*(row2-1)
	for i in range(1,row_all+1):
		sums=0
		for j in range(4):
			temp4 = float(table4.cell_value(i,j))
			sums+=temp4
		table3.write(i,n,int(sums))
		print("总分为:",sums)

#打开表格,选中表sheet1
data = xlrd.open_workbook('txt/a1.xls')
ws = xlutils.copy.copy(data)
table3=ws.get_sheet(2)
table1 = data.sheets()[0]
table2 = data.sheets()[1]
table4 = data.sheets()[2]
row1 = table1.nrows
row2 = table2.nrows

get_difference(row1,row2)
get_sum(row1,row2,5)

for n in range(row2-1): 
	min=get_min(row1,n,5)
	print("最小分数为:",min[0])
	print("最小分的号数为:",min[1])

ws.save('txt/a1.xls')

结果如下:

当数据不断扩大,最小值的编号也跟着改变了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值