书本变形模型参数的最终确定和经过变形后的坐标计算

0.前言

在上一篇博客中通过手工标定确定了书本变形模型参数的大致范围,这一篇主要对书本模型进行进一步的细化,确定出想要的书本模型的参数范围。另外,通过确定的书本模型,计算出变形后的坐标值。

1.书本变形参数范围确定

由上篇博客实验可知,书本变形模型通过一元三次多项式即可完美拟合。

前文在固定三个值,改变一个值的思想下,得到了常数项的变化规律----常数项的作用是确定与z轴相交的位置。而其余三个参数共同决定曲线的形状。

所以,常数项取0.001.

1)实验之确定系数的变化规律

三阶系数的全部范围是:

X3Coeff = random.uniform(-1.75, -0.10)#all
二阶系数的全部范围是:
X2Coeff = random.uniform(0.12, 2.20)#all

一阶系数的全部范围是:

X1Coeff = random.uniform(-0.444, 0.335)#all

四个系数取默认值为:

 
 
[-1.21794645842, 1.454371525, -0.10029190271, 0.02622774]

改变三阶系数的值,固定其余几个值,画出模型,观察规律

   

根据实验结果得出以下结论:

a. 曲线结束点的运动轨迹随着系数的增大,从x轴向右侧z轴、上侧x轴进行移动。

b.大致范围如下:

X3Coeff = random.uniform(-1.28, -0.99)#0.1--0.4 
X3Coeff = random.uniform(-1.7, -1.39)#x0.8--x1.0
X3Coeff = random.uniform(-1.54, -1.39)#x0.9--x1.0
X3Coeff = random.uniform(-1.47, -1.39)#x0.95--x1.0
X3Coeff = random.uniform(-1.39, -1.33)#x1.0--0.05
X3Coeff = random.uniform(-1.39, -1.28)#x1.0--0.1

同样的实验针对于其余两个参数,可得到其大致范围如下:

X2Coeff = random.uniform(0.12, 2.20)#all
X2Coeff = random.uniform(1.4, 1.65)#0.1--0.4
        
X2Coeff = random.uniform(1.06, 1.29)#x0.8--x1.0
X2Coeff = random.uniform(1.18, 1.29)#x0.9--x1.0
X2Coeff = random.uniform(1.23, 1.29)#x0.95--x1.0
X2Coeff = random.uniform(1.29, 1.34)#x1.0--0.05
X2Coeff = random.uniform(1.29, 1.4)#x1.0--0.1
X1Coeff = random.uniform(-0.444, 0.335)#all
X1Coeff = random.uniform(-0.144, 0.128)#0.1--0.4
        
X1Coeff = random.uniform(-1.7, -0.140)#x0.8--x1.0
X1Coeff = random.uniform(-0.92, -0.140)#x0.9--x1.0
X1Coeff = random.uniform(-0.530, -0.140)#x0.95--x1.0
X1Coeff = random.uniform(-0.335, -0.140)#x0.95--x1.0,1/2 again
X1Coeff = random.uniform(-0.238, -0.140)#x0.95--x1.0,1/2 again
X1Coeff = random.uniform(-0.265, -0.204)#x1.0--0.05
X1Coeff = random.uniform(-0.265, -0.144)#x1.0--0.1

2)进一步确定三个系数之间的相互影响结果

进行实验,固定一个值,改变另外两个值,希望得到的结果是结束点位于x轴1.0处

a. x3和x2在x0.95到x1.0随机,x1取固定值-0.140

得到结果如下:

   

可见有好有坏,分析数据得到规律:

x3+x2+x1 == -0.4079999999999999 or x3+x2+x1 == -0.3979999999999999 or x3+x2+x1 == -0.4179999999999999

b. 其他实验

得到的规律和上面的一致。

最终确定系数的范围为:

X1Coeff = random.uniform(-0.238, -0.140)
X2Coeff = random.uniform(1.23, 1.29)
X3Coeff = random.uniform(-1.47, -1.39)
且三者之和必须等于
-0.4079999999999999 或 -0.3979999999999999  或 -0.4179999999999999

总共可得53种组合。

绘制这53种组合的结果图如下:

   

可见,大致符合预期结果。

2.变形文本模型上的坐标计算

由于书本发生了变形,所以之前的坐标也会发生相应的改变,遵从上述的书本模型进行改变。故想要得到变化的x值,则必须进行定积分求得弧长为之前字与字之间的距离长度。通过得到的x坐标,带入书本模型即可得到z坐标值。

由于拟合书本模型时,直接从书本边缘开始的拟合,然而文字一般不会从书本边缘开始出现,故应在求坐标时自动减去两侧边缘。

利用定积分求弧长的代码如下:

integrate.quad(getFx, prevPosX, nextPosX)

现在的工作就是需要不断地尝试出合适的x坐标,满足根据这个x坐标和上一个确定的x坐标求得的弧长是需要的值。

在这个工作的过程中,老师的指导思想是通过计算曲线的斜率,继而得到直线方程,近似弧长值为线段值,进行验证,如果不对,上下调整即可。

代码如下:

posXLst = []
    for colIndex in range(colNum):
        if colIndex == 0:
            print("colIndex=", colIndex)
            posX = getNextColX(leftBlankDist)
            print("posX", posX)
            difference, isPrecise = caluDifferentReal(leftBlankDist, posX)
            while not isPrecise:
                print("renew calu")
                if difference > 0.007:
                    posX = posX - 0.005
                elif difference <-0.001:
                    posX = posX + 0.005
                difference, isPrecise = caluDifferentReal(leftBlankDist, posX)
            posXLst.append(posX)
                          
        else:
            print("colIndex=", colIndex)
            posX = getNextColX(posXLst[colIndex-1])
            print("posX", posX)
            difference, isPrecise = caluDifferentReal(posXLst[colIndex-1], posX)
            while not isPrecise:
                print("renew calu")
                if difference > 0.007:
                    posX = posX - 0.005
                elif difference <-0.001:
                    posX = posX + 0.005
                difference, isPrecise = caluDifferentReal(posXLst[colIndex-1], posX) 
            posXLst.append(posX)

通过实验,得到的坐标值大致吻合,其最终的长度也符合期望。

3.接下来任务

1)整合书本模型参数范围和坐标计算的代码

2)根据得到的坐标,进行透视投影变化

3)生成样本,进行网络训练,得到8个值,是否能够预测到这8个值,这是一个问题

4)最难的逆映射,涉及到直线与曲面的相交问题,不同于上次的直线与平面相交问题,这次的有点复杂,希望可以解决

5)上述任务完成即可开始小论文的撰写,就是这样


猜你喜欢

转载自blog.csdn.net/qq_35546153/article/details/80653707