2012-06-30 93 views
31

opencv java apiを使用して、 question のサンプルコードを実装しようとしています。 findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);をjavaに実装するには、この構文Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);を使用しました。opencv java apiでMatOfPointをMatOfPoint2fに変換するには

これで輪郭線はvector<vector<cv::Point> > contours;ではなくList<MatOfPoint> contours = new ArrayList<MatOfPoint>();になります。

これを実装する必要がありますapproxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);。 java apiでは、Imgproc.approxPolyDPは引数をapproxPolyDP(MatOfPoint2f curve, MatOfPoint2f approxCurve, double epsilon, boolean closed)として受け入れます。 MatOfPointをMatOfPoint2fに変換する方法はありますか?

これを実装するには、C++インターフェイスと同じようにベクトルを使用する方法があります。どんな提案やサンプルコードも大歓迎です。

答えて

32

MatOfPoint2fは、要素の種類(それぞれ32ビット浮動小数点数と32ビット整数)でのみ異なります。 MatOfPoint2fのインスタンスを作成し、その要素を(ループ内で)ソースMatOfPointの要素と等しくなるように設定することは、実行可能なオプションです(パフォーマンスペナルティはありますが)。

クラスの両方で

public void fromArray(Point... lp); 
public Point[] toArray(); 

の方法があります。

だから、あなただけの

/// Source variable 
MatOfPoint SrcMtx; 

/// New variable 
MatOfPoint2f NewMtx = new MatOfPoint2f(SrcMtx.toArray()); 
30

私はこの質問はすでによく回答されているが、将来的にそれを見つけた人のための代替を追加して実現を行うことができます -

Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); 

for(int i=0;i<contours.size();i++){ 
    //Convert contours(i) from MatOfPoint to MatOfPoint2f 
    contours.get(i).convertTo(mMOP2f1, CvType.CV_32FC2); 
    //Processing on mMOP2f1 which is in type MatOfPoint2f 
    Imgproc.approxPolyDP(mMOP2f1, mMOP2f2, approxDistance, true); 
    //Convert back to MatOfPoint and put the new values back into the contours list 
    mMOP2f2.convertTo(contours.get(i), CvType.CV_32S); 
} 
+2

mMOP2f2はどこから来ていますか? – user2534365

13

この質問が、すでに答えられている、私は受け入れられた答えは最高ではないと信じています。行列を配列に変換してから元に戻すと、時間とメモリの両方でかなりのパフォーマンス上のペナルティが発生します。

代わりに、OpenCVにはすでにこれを行う機能があります:convertTo。

MatOfPoint src; 
// initialize src 
MatOfPoint2f dst = new MatOfPoint2f(); 
src.convertTo(dst, CvType.CV_32F); 

私は、これがはるかに高速でメモリに優しいことを発見しました。

MatOfPoint2fをMatOfPointに変換するには、代わりにCvType.CV_32Sを使用します。

関連する問題