我正在尝试使用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
我提供给函数的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)
感谢您的帮助!
答案 0 :(得分:6)
尝试以下代码,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)