opencv透视变换函数异常

opencv透视变换函数异常,opencv,Opencv,如何使用透视变换功能 运行我的代码时,将产生以下异常: OpenCV错误:断言失败(scn+1==m.cols&&(depth==CV_32F ||透视变换文件中的深度==CV_64F /Users/donbe/Documents/opencv/opencv/modules/core/src/matmul.cpp,第行 1916年 谁能帮我 我的代码如下: Point2f srcTri[4]; Point2f dstTri[4]; Mat warp_mat; Mat src; /// Loa

如何使用透视变换功能

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

OpenCV错误:断言失败(scn+1==m.cols&&(depth==CV_32F ||透视变换文件中的深度==CV_64F /Users/donbe/Documents/opencv/opencv/modules/core/src/matmul.cpp,第行 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;

您是否检查了源映像,以确保其符合要求

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.
注:

该函数用于变换一组稀疏的二维或三维向量。如果要使用透视变换变换图像,请使用warpPerspective()

有关更多详细信息,请查看文档:


希望这能有所帮助。

在我的例子中,我也遇到了同样的错误,问题是InputArray mtx的类型。将CvMat*obj的类型改为CV_32FC1而不是CV_8UC1后,问题解决了

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

cv2.perspectiveTransform(np.float32([[1,1]]),np.float32([[1,0,0],[0,1,0],[0,0,1]])) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 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==函数“perspectiveTransform”中的m.cols >>>透视变换(np.float32([[[1,1]]),np.float32([[1,0,0],[0,1,0],[0,0,1]])) 数组([[1,1.]],dtype=float32) 这是一个非常糟糕的通信方式,它的状态是“src:输入两通道或三通道浮点数组;每个元素都是要转换的2D/3D向量”,因此可能会出现混淆

为了使函数按预期的方式运行(即对点数组进行操作),请按如下方式调用它:

dst=cv2.透视变换(src[np.newaxis],m)[0]

我在Python中遇到了同样的问题,并得出结论,它需要一个3x3矩阵的mxnx2输入和输出数组,而我有nx2数据,
x
。因此,这是可行的:
y=cv2.perspectiveTransform(x[np.newaxis],H)[0]
@Ben的评论应该是一个答案,这正是我的问题,我只是在运行示例代码后才发现:
H,w=img1.shape
pts=np.float32([0,0],[0,H-1],[w-1,H-1],[w-1,0])。重塑(-1,1,2)
dst=cv2.透视变换(pts,M)