【问题标题】:How do I convert pixel/screen coordinates to cartesian coordinates?如何将像素/屏幕坐标转换为笛卡尔坐标?
【发布时间】:2020-03-29 17:54:20
【问题描述】:

如何将像素/屏幕坐标转换为笛卡尔坐标(x,y)?

我在图片上的信息是(见下图):

vFov 以度为单位,hFov 以度为单位,像素宽度,像素高度

基本上我想要的是获取图像上的任何像素,并以度数为单位计算距图像中心的像素位置。

【问题讨论】:

  • 转发不会改变旧版(stackoverflow.com/questions/60835316/…)被关闭的原因。而且您的语法和拼写更改并没有提高这个问题的清晰度。
  • @QuantumDeveloper 没有办法让它更清楚。我对此进行了最后一个问题的编辑,但它从未重新打开,我无法删除该问题。它确实说我可以发布一个新问题。
  • 不清楚您所说的“离中心的相对度数”是什么意思。
  • @QuantumDeveloper 抱歉,我不明白有什么不清楚的地方。从中心计算像素位置(以度为单位)。见图片。粉红色的点是一个像素位置。
  • "从中心计算像素位置,以度为单位。"这样就清楚多了。

标签: image-processing coordinates coordinate-systems coordinate-transformation cartesian-coordinates


【解决方案1】:

对于我的回答,我假设您的图像代表平面上的投影。

然后可以构建一个虚拟相机,使其在正确的视野中看到图像的宽度/高度。要获得图像和相机之间的距离d(以像素为单位),可以使用构造的直角三角形:

tan(FOV/2) = width/2 / dd = width/(2tan(FOV/2))

同样的公式应该适用于高度。

以类似的方式可以计算像素的角度(假设图像的中心是(0, 0)):

tan(angleX) = x/dangleX = arctan(x/d) = arctan(x/width * 2tan(hFov)) tan(angleY) = y/dangleY = arctan(y/d) = arctan(y/width * 2tan(vFov))

如果图像变形,垂直和水平的 d 可能不同,因此您不应预先计算 d

【讨论】:

  • 感谢您的回答。但我认为我做错了什么。这不应该变成0,0吗? int Xpx = 1280 / 2, Ypx = 720 / 2; float anglex, angleY; float WidthPx = 1280, HeightPx = 720; float hFov = DegreesToRadians(45), vFov = DegreesToRadians(45); anglex = atan(Xpx / WidthPx * 2 * tan(hFov)); angleY = atan(Ypx / HeightPx * 2 * tan(vFov)); cout << RadiansToDegrees(anglex) << "\n"; cout << RadiansToDegrees(angleY) << "\n\n";
  • 不是它不应该变成0。我假设0,0是图像的中心,所以你必须将你的坐标偏移宽度/2和高度/2:Xpx -= width/2; Xpy -= height/2;
  • 感谢 agen :D 但是现在如果 x 是 1280,宽度是 1280。返回度数是 45。但我想我确实看到了我做错了什么。 anglex = (Xpx - WidthPx / 2) / WidthPx * hFov; 这返回 22,5
猜你喜欢
  • 2020-07-05
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多