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)上述任务完成即可开始小论文的撰写,就是这样