转自:http://gulianjun.blog.163.com/blog/static/2134621522013427439237/
在网上找到一个点校正法,号称是最佳的校正方法,但是在我的7寸屏上X轴的误差还是比较大,达到30个像素。而Y轴则相对好的多,不到10个像素。以前没有做过电阻屏,这次做电阻屏,可谓是困难重重呀。现在做出来的效果还是有很大毛病的,我后期会改进。
先介绍校正的方法的:
X,Y表示LCD上的坐标,x,y表示电阻屏A/D后的数据那么:
X1 = A*x1 + B*y1 + C
X2 = A*x2 + B*y2 + C
X3 = A*x3 + B*y3 + C
因为电阻屏和LCD可能有角度问题,所以X的坐标和触摸的y是有关系的。
Y1 =D*x1 + E*y1 + F
Y2 = D*x2 + E*y2 + F
Y3 = D*x3 + E*y3 + F
http://blog.csdn.net/allen6268198/article/details/7432013 这个博客上也介绍了这个方法,只是用的表示符号不同而已,
Xa’=k1*xa + k2*ya+k3 --------- 2-1
Ya’=k4*ya + k5ya+k6 ---------- 2-2
Xb’=k1*xb + k2*yb+k3 --------- 2-1
Yb’=k4*yb + k5yb+k6 ---------- 2-2
Xc’=k1*xc + k2*yc+k3 --------- 2-1
Yc’=k4*yc + k5yc+k6 ---------- 2-2
通过高数上的各种算法,求出
Divider = (Xa’ – Xc’)*(Yb’ – Yc’) - (Xb’ – Xc’)*(Ya’ – Yc’)
(Xa- Xc)*(Yb - Yc) - (Xb - Xc)*(Ya - Yc)
k1 = ---------------------------------------------------
Divider
(Xa’ – Xc’)*(Xb - Xc) - (Xa - Xc)*(Xb’ – Xc’)
k2 = -------------------------------------------------------------
Divider
Ya’*(Xc’*Xb – Xb’*Xc) +Yb’*(Xa*Xc’ – Xc’*Xa) +Yc’*(Xb’*Xa – Xa’*Xb)
K3 = --------------------------------------------------------------------------------------------------------
Divider
(Ya - Yc)*(Yb’ – Yc’) - (Yb - Yc)*(Ya’ – Yc’)
k4 = ----------------------------------------------------------
Divider
(Xa’- Xc’)*(Yb - Yc) - (Ya - Yc)*(Xb’ – Xc’)
k5 = ----------------------------------------------------------
Divider
Ya’*(Xc’*Yb – Xb’*Yc) +Yb’*(Xa’*Yc – Xc’*Ya) + Yc’*(Xb’*Ya – Xa’*Yb)
K6 = -----------------------------------------------------------------------------------------------
Divider
说实话我是真看不明白这是怎么算出来的。三个变量,三个等式就可以算出来了为什么算三个要用到六个?搞的那么复杂。X的三个等式可以得到X里的三个参数A,B,C;Y的三个等式可以得到Y里的三个参数D,E,F。X,Y的三个参数的算法是完全一样的:
可以把等式改写为:
Z0 = K1*x0 + K2*y0 + K3 式1
Z1 = K1*x1 + K2*y1 + K3 式2
Z2 = K1*x2 + K2*y2 + K3 式3
三元一次方程,忘记是初中还是高中的知识了,想办法变成二元一次方程,先解出两个参数,第三个参数自然也得到了。就算忘记看到这里也知道怎么做了吧?把K3通过 式1,2,3的减法消去就变成二元一次方程了。
解得:
K1 = [(Z0-Z1)*(y2-y1) - (Z2-Z1)*(y0-y1)] / [(x0-x1)*(y2-y1) - (x2-x1)*(y0-y1)];
K1 = [(Z0-Z1)*(x2-x1) - (Z2-Z1)*(x0-x1)] / [(x2-x1)*(y0-y1) - (x0-x1)*(y2-y1)];
K3随便代入任何一个式都可以得到结果。
个人感觉这个算法说的是挺有道理的,也在大虾的论坛里看到有人说这个算法比较精确,可是我算完后X轴的偏差还是比较大。可能是我用的7寸屏的原因,480×800的,搜到的一些信息是电阻屏越大边缘部分误差越大,校正也越不好做。这个算法是2002年的(大虾论坛里有下载),那时候的屏都比较小,所以会比较精确。现在都是电容屏了似乎很少有高人去弄电阻大屏的校正算法了。