【问题标题】:OpenCV: Understanding warpPerspective / perspective transformOpenCV:理解 warpPerspective / 透视变换
【发布时间】:2017-08-16 15:12:46
【问题描述】:

我为自己做了一个小例子来玩 OpenCVs wrapPerspective,但输出并不完全符合我的预期。

我的输入是一个 45° 角的条形。我想对其进行转换,使其垂直对齐/呈 90° 角。没问题。但是,我不明白的是,实际目的地点周围的一切都是黑色的。我不明白这一点的原因是,实际上只有转换矩阵被传递给 wrapPerspective 函数,而不是目标点本身。所以我的预期输出将是一个 90° 角的条形,并且它周围的大部分是黄色而不是黑色。我的推理错误在哪里?

# helper function
def showImage(img, title):
    fig = plt.figure()
    plt.suptitle(title)
    plt.imshow(img)


# read and show test image
img = mpimg.imread('test_transform.jpg')
showImage(img, "input image")


# source points
top_left = [194,430]
top_right = [521,103]
bottom_right = [549,131]
bottom_left = [222,458]
pts = np.array([bottom_left,bottom_right,top_right,top_left])


# target points
y_off = 400; # y offset
top_left_dst = [top_left[0], top_left[1] - y_off]
top_right_dst = [top_left_dst[0] + 39.6, top_left_dst[1]]
bottom_right_dst = [top_right_dst[0], top_right_dst[1] + 462.4]
bottom_left_dst = [top_left_dst[0], bottom_right_dst[1]]
dst_pts = np.array([bottom_left_dst, bottom_right_dst, top_right_dst, top_left_dst])

# generate a preview to show where the warped bar would end up
preview=np.copy(img)
cv2.polylines(preview,np.int32([dst_pts]),True,(0,0,255), 5)
cv2.polylines(preview,np.int32([pts]),True,(255,0,255), 1)
showImage(preview, "preview")


# calculate transformation matrix
pts = np.float32(pts.tolist())
dst_pts = np.float32(dst_pts.tolist())
M = cv2.getPerspectiveTransform(pts, dst_pts)

# wrap image and draw the resulting image
image_size = (img.shape[1], img.shape[0])
warped = cv2.warpPerspective(img, M, dsize = image_size, flags = cv2.INTER_LINEAR)
showImage(warped, "warped")

使用这段代码的结果是:

这是我的输入图像 test_transform.jpg: 这是添加了坐标的相同图像:

根据要求,这里是变换矩阵:

[[  6.05504680e-02  -6.05504680e-02   2.08289910e+02]
 [  8.25714275e+00   8.25714275e+00  -5.12245707e+03]
 [  2.16840434e-18   3.03576608e-18   1.00000000e+00]]

【问题讨论】:

  • 能输出变换矩阵吗?我猜有一些相当大的透视部分。如果您只想执行 2D 旋转和平移(没有透视部分的仿射变换),最后一行应该是 (0,0,1)。您可以通过将其与平移(旋转中心到 0)、围绕 (0,0) 旋转(具有某个角度)和另一个平移组合来计算 2D 旋转,以将中心移回原始位置或您希望对象所在的任何位置放置。这些操作可以组合成一个单一的变换矩阵。
  • @Micka:在我最初的帖子末尾添加了转换矩阵。实际上这只是一个简化的示例/测试,最后我想将街道车道(汽车透视到鸟瞰透视)

标签: python opencv computer-vision perspective


【解决方案1】:

您在数组中的排序或它们的位置可能是错误的。检查这个转换后的图像:dst_pts 数组是:np.array([[196,492],[233,494],[234,32],[196,34]]),这或多或少像预览图像中的蓝色矩形。 (我自己制作了坐标以确保它们是正确的) 注意:您的源点和目标点应按正确的顺序排列

【讨论】:

  • 这是正确答案。斜线的top_left 对应于竖线的bottom_left(所有其他人都遵循同样的错误)。这就是为什么垂直条的顶部和底部是模糊的,以及为什么 OP 扭曲图片中的黄色如此狭窄。
  • 谢谢你们,你们两个是对的!对我来说固定的工作源点是top_left = [521,103] top_right = [549,131] bottom_right = [222,458] bottom_left = [194,430],我调整了偏移量:y_off = 50
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2021-01-05
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多