上一篇文章具体介绍了实现过程,这里就不多介绍了,有需要的可以转到上一篇去看看。
本文是在做上一篇文章的模块时,中间的实验代码,功能模块比较简单易懂,适合熟悉下逻辑。
代码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')
结果如下:
当数据不断扩大,最小值的编号也跟着改变了。