将 X 配置为使用物理上大于显示屏的触摸表面?

将 X 配置为使用物理上大于显示屏的触摸表面?

我正在构建一个智能镜子(在双向镜子后面进行监控)。我有一个 27 英寸红外触摸框,我想将其与 22 英寸显示器一起使用。尺寸不匹配的一个原因是我将相机放置在镜子后面,并且触摸框必须是镜子的尺寸,因为镜子位于显示器和触摸框之间。

我正在使用 xinput_calibrator 工具来校准触摸框,但 X 假设触摸框和显示器尺寸相同,因此校准仅在屏幕中间正确(其中触摸框的中间和显示器的中间)监控重叠)。除此之外,触摸输入偏向屏幕中间。

在下图中,黑色矩形内的所有内容都在红外触摸区域内。监视器是绿色矩形。

触摸框和显示器的模型

如何配置 X 以使用比物理显示器更大的触摸表面?

我在 Raspberry Pi 4 上使用 Raspbian 10 (buster)。

答案1

xinput 可用于设置触摸输入设备的坐标变换矩阵。这是基于 Arch Linux wiki 上找到的步骤:https://wiki.archlinux.org/index.php/Calibration_Touchscreen

首先,获取X11识别的输入设备列表:

$ xinput list

结果之一应该是触摸框。接下来,获取其当前设置:

$ xinput list-props "Device Name"

将有一个名为“坐标变换矩阵”的属性,这是我们需要更新的。

有两件事需要考虑:

  1. 由于触摸框的物理尺寸大于显示屏,因此其像素尺寸也会更大。
  2. 触摸区域相对于显示屏水平和垂直偏移。

收集以下变量。我用卷尺对这些进行了物理测量,但只要一切都在相同的基础上(例如像素分辨率),数学最终就会计算出来。

Screen width        52cm
Screen height       32.5cm

Touch area width        60.5cm
Touch area height       34cm
Touch area x offset     -4cm (note the negative because the touch area begins beyond the left edge of the display)
Touch area y offset     0 (in my case the top of the touch frame aligned with the top of the display)

现在构建坐标变换矩阵。矩阵中有 4 个值必须计算。

矩阵是

[ c0 0  c1 ]
[ 0  c2 c3 ]
[ 0  0  1  ]

其表示为逐行数组:

c0 0 c1 0 c2 c3 0 0 1

c0 = touch_area_width / total_width
c1 = touch_area_x_offset / total_width
c2 = touch_area_height / total_height
c3 = touch_area_y_offset / total_height

对于我的测量结果是

c0  1.163461538
c1  -0.076923077
c2  1.046153846
c3  0

现在使用 xinput 设置新值:

xinput set-prop "Device Name" --type=float "Coordinate Transformation Matrix" c0 0 c1 0 c2 c3 0 0 1

代入计算值:

xinput set-prop "Device Name" --type=float "Coordinate Transformation Matrix" 1.16346 0 -0.0769 0 1.046150 0 0 1

这仅为当前会话设置它。要在设备插入(或启动时)时进行更改,请创建 udev 规则。您需要找到供应商 ID 和设备型号 ID。对于我的设备,这些是“aaec”和“c021”

/etc/udev/rules.d/99-touch-frame.rules

ENV{ID_VENDOR_ID}=="aaec",ENV{ID_MODEL_ID}=="c021",ENV{WL_OUTPUT}="DVI1",ENV{LIBINPUT_CALIBRATION_MATRIX}="1.16346 0 -0.0769 0 1.046150 0 0 1"

现在,只要插入设备,就会自动设置校准矩阵。

相关内容