opencv perspectiveTransform函数异常

时间:2011-12-22 07:54:55

标签: opencv

如何使用perspectiveTransform功能?

运行我的代码时,会产生以下异常:

  

OpenCV错误:断言失败(scn + 1 == m.cols&&(depth == CV_32F)   || depth == CV_64F))在perspectiveTransform,file中   /Users/donbe/Documents/opencv/opencv/modules/core/src/matmul.cpp,line   1916年

谁能帮帮我?

我的代码如下:

Point2f srcTri[4];
Point2f dstTri[4];

Mat warp_mat;
Mat src;

/// Load the image
src = imread( argv[1], 1 );

srcTri[0] = Point2f(0,0);
srcTri[1] = Point2f(src.cols,0);
srcTri[2] = Point2f(src.cols,src.rows);
srcTri[3] = Point2f(0,src.rows);

dstTri[0] = Point2f(0,0);
dstTri[1] = Point2f(src.cols/2,0);
dstTri[2] = Point2f(src.cols/2,src.rows);
dstTri[3] = Point2f(0,src.rows);


warp_mat =  getPerspectiveTransform(srcTri, dstTri);

Mat warp_dst(src.size(), src.type());    

//There will produce a exception.
perspectiveTransform(src, warp_dst, warp_mat);

namedWindow( "Warp", CV_WINDOW_AUTOSIZE );
imshow( "Warp", warp_dst );

waitKey(0);
return 0;

3 个答案:

答案 0 :(得分:3)

您是否检查了源图像是否检查了要求?

void perspectiveTransform(InputArray src, OutputArray dst, InputArray mtx)

Parameters: 

src – Source two-channel or three-channel floating-point array. Each element is a 2D/3D vector to be transformed.
dst – Destination array of the same size and type as src .
mtx – 3x3 or 4x4 floating-point transformation matrix.

注意:

该函数转换稀疏的2D或3D矢量集。如果要使用透视变换转换图像,请使用warpPerspective()。

查看文档以获取更多详细信息:http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html?highlight=perspectivetransform#cv2.perspectiveTransform

希望这有帮助。

答案 1 :(得分:1)

在我的情况下,我也遇到了同样的错误,问题在于InputArray mtx的类型。将CvMat * obj的类型更改为CV_32FC1而不是CV_8UC1后解决了它!

答案 2 :(得分:0)

当我在 Python 中遇到这个问题时,我发现这是因为输入应该是 3 维的:

>>> cv2.perspectiveTransform(np.float32([[1,1]]), np.float32([[1,0,0],[0,1,0],[0,0,1]]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cv2.error: OpenCV(4.5.1) /tmp/pip-req-build-1syr35c1/opencv/modules/core/src/matmul.dispatch.cpp:531: error: (-215:Assertion failed) scn + 1 == m.cols in function 'perspectiveTransform'

>>> cv2.perspectiveTransform(np.float32([[[1,1]]]), np.float32([[1,0,0],[0,1,0],[0,0,1]]))
array([[[1., 1.]]], dtype=float32)

这在 docs 中非常清楚地说明了“src:输入两通道或三通道浮点数组;每个元素都是要转换的 2D/3D 向量”,所以混淆是值得期待。

为了使函数按预期运行 - 即对点数组进行操作 - 像这样调用它:

dst = cv2.perspectiveTransform(src[np.newaxis], m)[0]