关于----微软触摸屏校准算法----

来自微软public目录源码:

BOOL
TouchPanelSetCalibration(
    INT32   cCalibrationPoints,     //@PARM The number of calibration points
    INT32   *pScreenXBuffer,        //@PARM List of screen X coords displayed
    INT32   *pScreenYBuffer,        //@PARM List of screen Y coords displayed
    INT32   *pUncalXBuffer,         //@PARM List of X coords collected
    INT32   *pUncalYBuffer          //@PARM List of Y coords collected
    );

//此函数主要用于计算触摸屏的校准参数,A1,B1,C1,A2,B2,C2,(delta)。

//cCalibrationPoints为校准的点的个数,这里一般取的是5个。pScreenXBufferpScreenYBuffer是校准时的十字叉的显示坐标(这里是显示坐标),pUncalXBuffer和//pUncalYBuffer是触摸屏上十字叉的位置得到的采样点(这里是触摸屏上的采样值)。


至于是怎么计算出这6个参数的呢?看下文就知道了


触摸屏上的点,是怎么和屏幕一个一个对应起来的呢?

首先,我们要建立模型,假设屏幕上的点和触摸屏上的点,可以一个一个对应,通过一个公式,可以算出所有对应的点。这个方法跟数学上的建模类似,通过最后分析,得到一个通用公式:

Xd = A1 *x+ B1*y + C1;

Yd = A2 *x +B2*y + C2;

至于如何建模得到这一个公式,有脑子想想就知道了,平面上的点嘛,一次性方程很容易得到的,关键是精细度有多高。这个公式的建模还是很精细的,可参考以下链接:

http://usbing.com/thread-18681-1-19.html



下面我们来分析这个算法过程,即如何根据5组坐标,得到这6个参数A1,B1,C1,A2,B2,C2,(delta)(或者说7个,以下统称6个):

假设传入的5组参数分别为:

 x1,x2,x3,x4,x5

y1,y2,y3,y4,y5             //这几个是触摸屏采样得到的坐标

Xd1,Xd2,Xd3,Xd4,Xd5;

Yd1,Yd2,Yd3,Yd4,Yd5;           //这几个是和上边五个点对应的显示坐标

//触摸屏的点,和显示的点,是一一对应的。因为是通过该点的触摸屏坐标,GWES要得到该点的显示坐标。


这样,把参数带入方程     (记住,x,y,Xd,Yd是已知数,要计算的是A1,B1,C1,A2,B2,C2)

A1 *x+ B1*y + C1   = Xd;

A2 *x +B2*y + C2   = Yd;

可得:

A1*x1 + B1*y1 + C1    = Xd1;

A1*x2 + B1*y2 + C1    = Xd2;

........

A1*x5 + B1*y5 + C1     = Xd5;



A2*x1 + B2*y1 + C2    = Yd1;

A2*x2 + B2*y2 + C2    = Yd2;

........

A2*x5 + B2*y5 + C2     = Yd5;



上边是得到的两组 三元一次方程组,第一组可计算出A1,B1,C1,  第二组和计算出A2,B2,C2,  下面,我们就第一组方程组的解法来讨论:


要解的方程组为:

A1*x1 + B1*y1 + C1    = Xd1;

A1*x2 + B1*y2 + C1    = Xd2;

........

A1*x5 + B1*y5 + C1     = Xd5;


一共有5个等式,但是呢,只有3个未知数,3个等式 就足够计算出一条相对准确的参数出来了。但是呢,给了5个等式,为的是校准更加精确,但是呢,又不能舍弃任何两组参数,怎么办呢? Look here,微软是这么处理的:


原方程5个等式直接相加,得:

A1 * ( x1 + x2 +... + x5 )      +    B1 * ( y1 + y2 + ... + y5 )     +  C1 * 5            =                 Xd1 + Xd2 + ... + Xd5;         //第一个总等式


5个等式分别乘以参数x,得:

A1*x1*x1 + B1*y1*x1 + C1*x1    = Xd1* x1;

A1*x2*x2 + B1*y2*x2 + C1*x2    = Xd2* x2;

........

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值