创新实训第五周总结
程序员文章站
2024-03-22 22:04:28
...
2019/4/17
上周我们得出smpl模型的法线图,深度图后,我们就要进行对smpl的轮廓和原图轮廓进行匹配了
1.得到smpl的黑白轮廓图mask 和原图的黑白轮廓图mask
使用抠图算法和opencv库的图像分割
2.求出原图mask与smpl.mask的对应关系
对应关系的含义:原图中每一个像素点寻找其对应在smpl像素点中的一个f(x)
首先获取内部点集合
import matplotlib.image as mpimg # mpimg 用于读取图片
def getPointIn(path,outPoint):
outPoint=list(outPoint)
img =mpimg.imread(path)
q=[]
if not len(img.shape)==2:
img= img[:,:,2]
print (img.shape)
w,h=img.shape
for i in range(w):
for j in range(h):
if not img[i,j]==0 and (not [i,j] in outPoint ):
q.append([i,j])
return q
data1=data1.tolist()
inyuan=getPointIn('C:/Users/hsy/Desktop/xmsx/DIna/kuli_mask1.png',data1)
data2=data2.tolist()
insmpl=getPointIn('C:/Users/hsy/Desktop/xmsx/DIna/a.png',data2)
inyuan=np.array(inyuan)
insmpl=np.array(insmpl)
print(insmpl.shape)
print(inyuan.shape)
insmpl+=[35,0]
data2=np.array(inyuan)
data2+=[35,0]
data2=data2.tolist()
3.求解f(x)
参考论文: M. S. Floater. Mean value coordinates. Computer aided geometric design, 20(1):19–27, 2003.
其中的角度关系
求解tan(α/2)用数学公式:
已知两个矢量,使用矢量叉乘可以得到sin α 以及cos alpha
根据半角公式 tan(α/2)=(1+cos α )/sin α
相应代码
result=[]
for pos,j in enumerate(list_in_contours):
tan=[]
for i in range(1,len(data1)):
tan.append(getTan(data1[i-1],j,data1[i]))
tan.append(getTan(data1[-1],j,data1[0]))
w=[]
sum=0
for i in range(len(data1)):
w.append( (tan[i]+tan[i-1])/np.sqrt((data1[i][0]-j[0])*(data1[i][0]-j[0])+(data1[i][1]-j[1])*(data1[i][1]-j[1])))
sum=sum+w[-1]
w=w/sum
a=0
b=0
for q in range(len(data1)):
a=a+w[q]*data2[ (int)( lis[len1-1-q][1]) ][0]
b=b+w[q]*data2[ (int)( lis[len1-1-q][1]) ][1]
result.append((list_in_contours[pos],[a,b]))
if(pos%1000==0):
print(pos,result[-1])
接下来就是求解f(x)了