Posts 触摸屏与LCD坐标转换
Post
Cancel

触摸屏与LCD坐标转换

想要弄明白LCD屏幕坐标和触摸屏坐标的关系,得先从LCD触摸屏的结构说起。

一般我们接触到的触摸屏都有两层,一层是纯粹的LCD液晶显示面板,其上就是一层透明的触摸屏薄膜。要说的是,LCD显示屏和触摸屏都有各自的分辨率指标,也就相当于它们的坐标系,现假定他们的坐标系分别为(x,y)和(X,Y)。就像我所测试的LCD显示屏的分辨率为1024*600,它的坐标原点(0,0)是左上角,右下角坐标为(1024,600),而触摸屏也有它本身的坐标原点O(物理的,固定的,在屏幕中的某一位置,很可能该原点在装配过程中已经被切割掉,但没关系,不影响坐标确定)。

在实际使用过程中,我们不会关心某个时刻触摸屏的具体坐标是什么,我们所关心的是在LCD屏的坐标系(x,y),然而驱动程序得到的却是触摸屏的坐标系(X,Y),那么我们怎么把两个2维线性坐标系通过几个采样值,对应起来,即(X,Y)—>(x,y), 例,具体的做法是:

  1. 取定LCD屏幕的四个角的坐标作为采样值(因为在没有其他工具的情况下,只有这四个点才知道确切的坐标(x1,y1),(x2,y2),(x3,y3),(x4,y4))

  2. 运行之前做的输入设备检测程序,分别点击LCD的四个角,在程序中读出这些点对应的触摸屏坐标值(X1,Y1),(X2,Y2),(X3,Y3),(X4,Y4)

  3. 将这四个采样值代入如下方程,求解出方程中的7个系数(a,b,c,d,e,f,s),就可以得到两个坐标系的对应关系了:

1
2
3
sx=aX+bY+c, sy=dX+eY+f 
sx1=aX1+bY1+c
sy1=dX1+eY1+f

示例

使用tslib校准后,校准文件/etc/pointercal内容如下:

1
179 22061 -1562268 18335 -124 -3481056 65536 640 480 1

前9个数据依次为a,b,c,d,e,f,xres,yres。

使用evtest打开/dev/input/event2(该示例中,触摸屏事件为event2)

1
evtest /dev/input/event2

此时点击触摸屏某处,终端输出如下信息:

1
2
3
4
Testing ... (interrupt to exit)
Event: time 1421730181.099925, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1421730181.099925, type 3 (EV_ABS), code 0 (ABS_X), value 1889
Event: time 1421730181.099925, type 3 (EV_ABS), code 1 (ABS_Y), value 1952

事件类型为EV_ABS时,value即相应的触摸屏坐标:X=1889,Y=1952

python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a = 179
b = 22061
c = -1562268
d = 18335
e = -124
f = -3481056
s = 65536

def convert(X , Y):
    x = 0
    y = 0
    x = (a*X + b*Y + c)/s
    y = (d*X + e*Y + f)/s
    return (x,y)

print convert(1889, 1952)

输出结果如下:

1
(638, 471)

即LCD坐标。

This post is licensed under CC BY 4.0 by the author.