【问题标题】:Transform/warp coordinates变换/扭曲坐标
【发布时间】:2021-11-08 16:38:21
【问题描述】:

我有一组坐标来标记地板上的一个区域。

我想生成一个新数组,其中所有坐标都被转换,所以我得到一个扭曲的数组。这些点应如下图所示。请注意,我想使用新数组生成图形。它还不存在。它是在必须新数组后生成的。

如果有帮助,我知道所有坐标之间的距离。坐标 json 看起来像这样,其中distance_to_next 包含到下一个点的距离,以厘米为单位:

[
  {
    "x": 295,
    "y": 228,
    "distance_to_next": 200
  },
  {
    "x": 559,
    "y": 263,
    "distance_to_next": 30
  },
  {
    "x": 551,
    "y": 304,
    "distance_to_next": 50
  },
  {
    "x": 473,
    "y": 290,
    "distance_to_next": 70
  },
  {
    "x": 451,
    "y": 352,
    "distance_to_next": 150
  },
  {
    "x": 249,
    "y": 313,
    "distance_to_next": 100
  }
]

第一个点总是在左上角。

我正在使用 python 和 opencv2,我知道各种函数,例如 cv.warpAffinecv.warpPerspectivecv.findHomographycv.perspectiveTransform 等,但我不确定在这里使用哪一个。

有人能指出我正确的方向吗?我错过了什么明显的东西吗?

【问题讨论】:

  • 你需要使用 cv.findHomography
  • @yannziselman 但 cv.findHomography 需要两张图片,而我只有一张。我想使用单应性生成第二个。这有意义吗?
  • cv.findHomography 不需要两个图像。它需要两组点。一组是第一张图像上关键点的位置,第二组是您要将这些关键点转换到的位置。只需在您的问题中显示的图表中找到相应点的位置
  • 而且转换肯定是仿射的,而不是透视的。
  • @CaptainTrojan “仿射”?你能解释一下那个说法吗?这没有任何意义。

标签: python numpy opencv image-processing computer-vision


【解决方案1】:

坐标 json 中的点与白色多边形不对齐。如果我使用它们,我会得到如下所示的绿色多边形:

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
 
# Load the image
img = cv2.imread('./input.jpg') 
 
# Create a copy of the image
img_copy = np.copy(img)
img_copy = cv2.cvtColor(img_copy,cv2.COLOR_BGR2RGB)
 
pts = np.array([[295,228],[559,263],[551,304],[473,290],[451,352],[249,313]], np.int32)
pts = pts.reshape((-1,1,2))
img_copy2 = cv2.polylines(img_copy,[pts],True,(0,255,0), thickness=3)
plt.imshow(img_copy2)

所以我手动找到了你的白色多边形的近似坐标,并将它们覆盖在绿色的白色多边形上。 您需要所需多边形的坐标。我将它们显示为红色。

img = cv2.imread('./input.jpg') 
img_copy = np.copy(img)
img_copy = cv2.cvtColor(img_copy,cv2.COLOR_BGR2RGB)

input_pts = np.array([[300,300],[890,380],[830,600],[200,480]], np.int32)
pts = input_pts.reshape((-1,1,2))
img_copy3 = cv2.polylines(img_copy,[pts],True,(0,255,0), thickness=3)

output_pts= np.array([[300,300],[850,300],[850,520],[300,520]], np.int32)
pts = output_pts.reshape((-1,1,2))
img_copy3 = cv2.polylines(img_copy3,[pts],True,(255,0,0), thickness=3)

plt.imshow(img_copy3)

我们需要在这里使用cv2.getPerspectiveTransform。但是它只需要4分作为输入,所以丢弃2分。

img = cv2.imread('./input.jpg') 
img_copy = np.copy(img)
img_copy = cv2.cvtColor(img_copy,cv2.COLOR_BGR2RGB)

input_pts = np.float32(input_pts)
output_pts = np.float32(output_pts)

# Compute the perspective transform M
M = cv2.getPerspectiveTransform(input_pts,output_pts)
 
# Apply the perspective transformation to the image
out = cv2.warpPerspective(img_copy,M,(img_copy.shape[1], img_copy.shape[0]),flags=cv2.INTER_LINEAR)
 
# Display the transformed image
plt.imshow(out)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多