2017-06-20 75 views
0

私はgetPerspectiveTransform関数を使いたいですが、引数としてMatを受け付けるだけで、配列に座標データがあります。 「何かが間違っていた」、とlogcatに、私は次のエラーを取得しています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); 

をしかし、私は私のアプリを実行すると、それは私にエラーを与える:

だから私はポイントに変換した後、次のようにマットに
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実装には使用されていません。そうですか。ちょうど4つのポイントがありますか? 'getPerspectiveTransform'は正確に4つの点を使います。 4点以上ある場合は 'findHomography()'を使うべきです。 –

+0

@AlexanderReynoldsうん正確に4つのポイント – Ank

答えて

1

OPのポストにコメント・ディスカッション(彼らにすべてのクレジット)で述べたように、問題はリストlである:我々はList<Point> 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); 

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) 

だから、これが犯人です。あなたの2番目のマトリックスは8ポイントを持っています。 Java docs for ArrayListから

l.addを挿入し、古いリストを上書きしません使用

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

。だから、解決策は、各変換行列の新しいリストを作ることです。

関連する問題