背景:在做图像关键点标注工具时,希望同一scene重载文件夹时,图元回归中心(拖拽缩放导致的偏移)。
解决:获取始末坐标;计算x方向和y方向的坐标偏移,然后再重载图元时,反向设置图元偏移即可。
1. bug说明
图元在第一次重载,设置Offset
后,画面显示回归正常。但是此时我去跟踪图元的鼠标事件的坐标变化时发现如下情况:
- 初始,我选择拖动位置为图元的原点(左上角),起始状态均为0.0
- 然后,拖动图元结束,拖动变化为:
x: 271.0, y: 99.0
- 然后,重新载入其他图片文件夹,并设置
Offset
为x: -271.0, y: -99.0
- 最后,通过图元的单击鼠标事件获取新加载的图元的原点坐标:
x: -271.0, y: -99.0
- 结论:图元的
setOffset
:虽然还原了图元的位置,但是坐标系并未更新。因此,如果在此基础上标图,则所有坐标需要重新计算,得不偿失。
# Test log...
# init state
>>>>>> move check: itemPos: (34.0, 28.0), scenePos: (34.0, 28.0)
>>>>>> state tracking: oriPos(0.0, 0.0), rtPos(0.0, 0.0), x: 0.0, y: 0.0
# drag completed
>>>>>> state tracking: oriPos(0.0, 0.0), rtPos(271.0, 99.0), x: 271.0, y: 99.0
# setOffset
>>>>>>>> Scene, point: (0.0, 0.0)
======== item pos: (-271.0, -99.0)
2. 解决办法(临时)
- 考虑新增的工作量,建议取消该功能,由标注选手,直接拖到合适位置;
- 直接以scene的坐标基础进行操作。
- 每次重载会重新生成新的(错误)图元坐标,根据scene的坐标进行校正位置,并将其改动新增到相关部分。
3. 补充
关键代码说明:
- 首先,将缩放后的图元还原为1.0;
- 其次,将偏移反向加到新的图元上;
- 最后,更新
buffer
和历史参数。
self.pixmap_item.setScale(self.resize_ratio)
self.pixmap_item.setOffset(-self.item_offset_x, -self.item_offset_y)