Python Open CV perspectiveTransform()

use*_*912 4 python opencv numpy

我正在尝试使用OpenCV将透视变换应用于整个图像.为此,我首先根据我选择的点计算初始变换,然后尝试变换图像角并转换它们以获得最终的最佳变换.我成功地获得了转换,但随后应用cv2.perspectiveTransform()函数总是抛出此错误:

OpenCV Error: Assertion failed (scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F)) in perspectiveTransform, file /tmp/opencv-PEaA0A/opencv-2.4.9/modules/core/src/matmul.cpp, line 1936
Run Code Online (Sandbox Code Playgroud)

我提供给函数的numpy数组都是float64 dtype所以我认为错误来自scn + 1 == m.cols.这是我的代码的快照:

initTransform = cv2.getPerspectiveTransform(pointsIn,pointsOut)
imgCorners = np.array([[0,0],[self.image.size/float(self.image.shape[0]),0]],dtype=np.float64)
outputCorners = cv2.perspectiveTransform(corners,initTransform) 
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

HYR*_*YRY 7

尝试下面的代码,perspectiveTransform的第一个参数是一个Mat对象,它对应于numpy中的3个dim数组:

import cv2
import numpy as np

w, h = 512, 512
src = np.array(
    [[0, 0], [w - 1, 0], [w - 1, h - 1], [0, h - 1]], dtype=np.float32)
dst = np.array(
    [[300, 350], [800, 300], [900, 923], [161, 923]], dtype=np.float32)

m = cv2.getPerspectiveTransform(src, dst)
result = cv2.perspectiveTransform(src[None, :, :], m)
Run Code Online (Sandbox Code Playgroud)

  • 为什么`perspectiveTransform()`的输入是`src [None,:,:]`而不仅仅是`src`?每个元素必须是2D矩阵而不是向量吗?@ user1549912 (3认同)
  • 谢谢,从文档中我肯定不清楚,并且每隔一段时间被问到这个问题,人们就会专注于错误的浮点部分。 (2认同)