error: (-215:Assertion failed) scn + 1 == m.cols in function 'cv::perspectiveTransform'
error: (-215:Assertion failed) scn + 1 == m.cols in function 'cv::perspectiveTransform'
下面是一个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()
但是,当我显示包含映射点的图像时 returns 出现以下错误:
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'
据我所知,此错误意味着分配给函数透视变换的参数不正确或未被读取。我在阅读步骤检查了两张图片,一切都很好。 所以有人知道为什么会这样吗?
提前致谢
哈立德
您向 cv2.getPerspectiveTransform()
传递了错误的参数。该函数需要原始图像中的一组四个坐标和变换图像中的新坐标。您可以直接将 pts_src
和 pts_dst
传递给函数,您将得到转换矩阵。然后,您可以通过 a_transformed = np.dot(matrix, a)
.
等矩阵乘法获得点“a”的变换坐标
我实际上发现函数 cv2.findHomography() 已经通过找到两个平面之间的透视变换来完成工作,因此我不再需要 cv2.perspectiveTransform()。
我认为您的代码中有两个错误。首先,你使用
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)
下面是一个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()
但是,当我显示包含映射点的图像时 returns 出现以下错误:
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'
据我所知,此错误意味着分配给函数透视变换的参数不正确或未被读取。我在阅读步骤检查了两张图片,一切都很好。 所以有人知道为什么会这样吗?
提前致谢 哈立德
您向 cv2.getPerspectiveTransform()
传递了错误的参数。该函数需要原始图像中的一组四个坐标和变换图像中的新坐标。您可以直接将 pts_src
和 pts_dst
传递给函数,您将得到转换矩阵。然后,您可以通过 a_transformed = np.dot(matrix, a)
.
我实际上发现函数 cv2.findHomography() 已经通过找到两个平面之间的透视变换来完成工作,因此我不再需要 cv2.perspectiveTransform()。
我认为您的代码中有两个错误。首先,你使用 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)