42

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

したがって、輪郭はでList<MatOfPoint> contours = new ArrayList<MatOfPoint>();はなくになりvector<vector<cv::Point> > contours;ます。

次に、これを実装する必要があります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++インターフェイスと同じベクトルを使用する方法はありますか。提案やサンプルコードは大歓迎です。

4

3 に答える 3

44

MatOfPoint2fは、要素のタイプ(それぞれ、32ビットfloatと32ビットint)のみがMatOfPointと異なります。実行可能なオプション(パフォーマンスの低下はありますが)は、MatOfPoint2fインスタンスを作成し、その要素を(ループ内で)ソースMatOfPointの要素と等しくなるように設定することです。

がある

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

両方のクラスのメソッド。

だからあなたはただすることができます

 /// Source variable
 MatOfPoint SrcMtx;

 /// New variable
 MatOfPoint2f  NewMtx = new MatOfPoint2f( SrcMtx.toArray() );
于 2012-06-30T11:14:15.400 に答える
34

私はこの質問がすでによく答えられていることを理解していますが、将来それを見つけた人のために代替案を追加するために-

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);
}
于 2012-10-04T01:00:52.700 に答える
26

この質問にはすでに回答がありますが、受け入れられた回答は最善ではないと思います。行列を配列に変換してから元に戻すと、時間的にもメモリ的にもパフォーマンスが大幅に低下します。

代わりに、OpenCVにはすでにこれを正確に実行する関数convertToがあります。

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

私はこれが非常に速く、よりメモリに優しいことを発見しました。

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

于 2016-11-06T10:56:29.570 に答える