2017-06-20 37 views
0

我想使用getPerspectiveTransform函数,但它只接受Mat作为参数,并且我有一个数组中的坐标数据。所以,我将它们转换成分数,然后垫上如下:Opencv4Android getPerspectiveTransform错误

List<Point> l = new ArrayList<Point>(); 
for (int i = 0; i < pts_1.length; i++) { 
    Point pt = new Point(pts_1[0][i], pts_1[1][i]); 
    l.add(i,pt); 
} 
Mat mat1 = Converters.vector_Point2f_to_Mat(l); 
for (int i = 0; i < pts_2.length; i++) { 
    Point pt = new Point(pts_2[0][i], pts_2[1][i]); 
    l.add(i,pt); 
    } 
Mat mat2 = Converters.vector_Point2f_to_Mat(l); 
Mat perspectiveTransform = Imgproc.getPerspectiveTransform(mat1,mat2); 

但是当我运行我的应用程序,那么它给了我错误“出事了”,并在logcat中我收到以下错误:

E/cv::error(): OpenCV Error: Assertion failed (src.checkVector(2, CV_32F) == 4 && dst.checkVector(2, CV_32F) == 4) in cv::Mat cv::getPerspectiveTransform(cv::InputArray, cv::InputArray), file /build/master_pack-android/opencv/modules/imgproc/src/imgwarp.cpp, line 6748 
E/org.opencv.imgproc: imgproc::getPerspectiveTransform_10() caught cv::Exception: /build/master_pack-android/opencv/modules/imgproc/src/imgwarp.cpp:6748: error: (-215) src.checkVector(2, CV_32F) == 4 && dst.checkVector(2, CV_32F) == 4 in function cv::Mat cv::getPerspectiveTransform(cv::InputArray, cv::InputArray) 

我是OpenCV4Android的新手,所以我不明白为什么会发生这种情况。如何解决它?有没有其他更好的方法来做到这一点?

感谢您的帮助!

注意:我知道这里有一个类似的程序:Can't get OpenCV's warpPerspective to work on Android但他没有得到这个错误,所以我在这里发布它。

+0

@AlexanderReynolds我没有得到你,但我的Android工作室告诉我'Imgproc.getPerspectiveTransform(Mat src,Mat dst)'的格式为 – Ank

+0

对不起---不习惯Java的实现。我懂了。你有四点? 'getPerspectiveTransform'恰好使用四点。如果你有四个以上的点,你应该使用'findHomography()'。 –

+0

@AlexanderReynolds yup正好四点 – Ank

回答

1

正如评论讨论OP的帖子(所有争光)提到的,问题出在列表l

List<Point> l = new ArrayList<Point>(); 
for (int i = 0; i < pts_1.length; i++) { 
    Point pt = new Point(pts_1[0][i], pts_1[1][i]); 
    l.add(i,pt); 
} 
Mat mat1 = Converters.vector_Point2f_to_Mat(l); 

如果我们看一看在List<Point> l的内容:

for (Point pt : l) 
    System.out.println("(" + pt.x + ", " + p.ty + ")"); 

(x0, y0) 
(x1, y1) 
(x2, y2) 
(x3, y3) 

而移动到下一个矩阵:

for (int i = 0; i < pts_2.length; i++) { 
    Point pt = new Point(pts_2[0][i], pts_2[1][i]); 
    l.add(i,pt); 
    } 
Mat mat2 = Converters.vector_Point2f_to_Mat(l); 

再看看内容List<Point> l

for (Point pt : l) 
    System.out.println("(" + pt.x + ", " + p.ty + ")"); 

(x4, y4) 
(x5, y5) 
(x6, y6) 
(x7, y7) 
(x0, y0) 
(x1, y1) 
(x2, y2) 
(x3, y3) 

所以这是罪魁祸首;你的第二个矩阵将有8个点。

Java docs for ArrayList

Parameters: index - index at which the specified element is to be inserted

使用l.add插入而不是覆盖旧的列表。所以解决方案是为每个转换矩阵创建一个新列表。

相关问题