错误:(-215:断言失败)scn + 1 == m.cols 在函数'cv :: perspectiveTransform'中

7
以下是一个Python脚本,可以计算两个图像之间的单应性,并将一个期望的点从一个图像映射到另一个图像。
import cv2

import numpy as np


if __name__ == '__main__' :

  # Read source image.
  im_src = cv2.imread(r'C:/Users/kjbaili/.spyder-py3/webcam_calib/homography/khaledd 35.0 sec.jpg')

  # Five corners of the book in source image
  pts_src = np.array([[281, 238], [325, 297], [283, 330],[248, 325],[213, 321]])

  # Read destination image.
  im_dst = cv2.imread(r'C:/Users/kjbaili/.spyder-py3/webcam_calib/homography/20.jpg')

  # Five corners of the book in destination image.
  pts_dst = np.array([[377, 251],[377, 322],[316, 315],[289, 284],[263,255]])



  # Calculate Homography

  h, status = cv2.findHomography(pts_src, pts_dst)


  
  # provide a point i wish to map from image 1 to image 2
  a = np.array([[260, 228]])


  

  pointsOut = cv2.getPerspectiveTransform(a, h)

  # Display image
  cv2.imshow("treced_point_image", pointsOut)


  cv2.waitKey(0)
cv2.destroyAllWindows()

然而,当我显示包含映射点的图像时,会返回以下错误:
error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\core\src\matmul.dispatch.cpp:531: 
error: (-215:Assertion failed) scn + 1 == m.cols in function 'cv::perspectiveTransform'

据我的了解,这个错误意味着分配给透视变换函数的参数不正确或没有被读取。我在读取步骤中检查了两张图片,一切都很好。所以谁知道为什么会发生这种情况吗?
提前致谢 卡利德

请在此处查看答案:https://dev59.com/Bobca4cB1Zd3GeqPTUPl - Yosef Meller
4个回答

3
我认为你的代码中有两个错误。首先,你应该使用cv2.getPerspectiveTransform()来获取变换矩阵。其次,要对一个点进行实际的变换,你需要调用cv2.perspectiveTransform()。cv2.perspectiveTransform()期望输入一个3维或4维的矩阵。所以,你需要提供类似下面代码中的内容。请注意下面代码中的3维数组"pts"。我只在"pts"数组中有一个点。你可以添加更多。
import cv2    
import numpy as np

src = np.float32([[0, 1280], [1920, 1280], [1920, 0], [0, 0]])    
dst = np.float32([[0, 600], [400, 600], [400, 0], [0, 0]])    
perspective_transform = cv2.getPerspectiveTransform(src, dst)    
pts = np.float32(np.array([[[1920, 1280]]]))    
warped_pt = cv2.perspectiveTransform(pts, perspective_transform)[0]    
print ("warped_pt = ", warped_pt)

2
你正在向 `cv2.getPerspectiveTransform()` 传递错误的参数。该函数期望在原始图像中的四个坐标和变换后图像中的新坐标集。你可以直接将 `pts_src` 和 `pts_dst` 传递给该函数,然后你将获得转换矩阵。然后通过矩阵乘法获取点 "a" 的变换后坐标,例如:`a_transformed = np.dot(matrix, a)`。

我已经这样做了: trans_mtx = cv2.perspectiveTransform(pts_src,pts_dst),仍然是同样的错误。 - Khaled
1
你需要传递恰好四个点。在声明这些点时,也尝试添加数据类型:pts_src = np.array([[281, 238], [325, 297], [283, 330],[248, 325]], dtype=np.float32)。请注意,我已经随意删除了第五个值。你需要弄清楚要保留哪些坐标。 - chris
1
还是一样的。我使用了cv2.findHomography()解决了它。不过,还是谢谢你的回复。 - Khaled

0

我实际上发现函数cv2.findHomography()已经完成了任务,它可以找到两个平面之间的透视变换,因此我不再需要使用cv2.perspectiveTransform()。


0
注意:代码片段使用Python语言。 查找变换矩阵: 原则上,您可以使用以下任一方法来计算变换矩阵。
i) cv2.findHomography() 或 ii) cv2.getPerspectiveTransform()
小的区别在于,当您提供了4组您确信的手动点时,您可以使用cv2.getPerspectiveTransform(),但是当您有50个点并且想要使用RANSAC等技术来过滤点时,请使用cv2.findHomography()。 使用变换矩阵转换点: 您可以使用两种选项来使用变换矩阵转换点: i) 使用perspectiveTransform()转换一组点。您需要确保数据类型是float64的numpy数组(使用pts = np.array(pts,np.float64)),并且结果形状为(n,1,2)(pts = pts.reshape((-1, 1, 2)))。
ii) (从接受的答案中获得)使用'np.dot(transformation_matrix, a)'来转换单个点,其中'a'是一个XY坐标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接