1

javacv の 2D 整数点のセットに楕円を当てはめようとしていますが、問題が発生し続けています。私の質問は、cvFitEllipse2 が期待するデータの種類は何ですか?

OpenCVのマニュアルから、私はそれを見つけました

CvBox2D cvFitEllipse2(const CvArr* points)

パラメータ points – 入力 2D ポイント セット。保存先:

  • std::vector<> または Mat (C++ インターフェイス)
  • CvSeq* または CvMat* (C インターフェイス)
  • Nx2 numpy 配列 (Python インターフェイス)

次の方法で、CvSeqCvMatの両方を試しました。

1 CvSeq

CvMemStorage mem = cvCreateMemStorage(0);
CvSeq seq = cvCreateSeq(0, Loader.sizeof(CvSeq.class), Loader.sizeof(CvPoint.class), mem);
CvPoint pts = new CvPoint(6);
pts.position(0).put(cvPoint(3, 0));
pts.position(1).put(cvPoint(1, 5));
pts.position(2).put(cvPoint(2, 9));
pts.position(3).put(cvPoint(1, 15));
pts.position(4).put(cvPoint(0, 9));
pts.position(5).put(cvPoint(1, 5));
for(int i=0; i<6; i++){
    CvPoint v = new CvPoint(pts.position(i).x(), pts.position(i).y());
    cvSeqPush(seq, v);
}
cvFitEllipse2(seq);

OpenCV エラー: cvFitEllipse2、ファイル /tmp/opencv-2.4.3+dfsg/modules/imgproc/src/shapeescr.cpp の不正な引数 (サポートされていないシーケンス タイプ)、スレッド「メイン」での 790 例外 java.lang.RuntimeException: / tmp/opencv-2.4.3+dfsg/modules/imgproc/src/shapeescr.cpp:790: エラー: (-5) 関数 cvFitEllipse2 でサポートされていないシーケンス タイプです

2 CvMat

CvMat mat = cvCreateMat(pts.capacity(), 2, CV_32S);
mat.getIntBuffer().put(pts.asByteBuffer().asIntBuffer());
cvFitEllipse2(mat);

エラー: OpenCV エラー: サポートされていない形式または形式の組み合わせ (要素の型が不適切なため、行列を点列に変換できません) が不明な関数、ファイル ......\src\opencv\modules\imgproc\src\utils .cpp、59 行目スレッド「メイン」での例外 java.lang.RuntimeException: ......\src\opencv\modules\imgproc\src\utils.cpp:59: エラー: (-210) 行列はできません不適切な要素タイプのため点列に変換されます

私も CvMat mat = cvCreateMat(1, pts.capacity()*2, CV_32S); をやってみました。同じ結果で。当然のことながら、CV_32S が間違っているようです。わからない。

私はこれをまったく理解できません。javacv の Google グループでこれを尋ねましたが、まだ入力がありません。

4

1 に答える 1

1

代わりに単純な float 配列を使用して、問題の解決策を見つけました。これが私の解決策です:

//6  2D-points stored in a 1-dimensional float array
float points[] = { 1.0f, 1.1f, 1.0f, 3.0f, 3.0f, 7.0f, 7.0f, 3.0f, 3.0f, 0.0f, 2.0f,       1.0f,1.0f, 0.0f};
//1 row matrix with 6 2-D points of type CV_32FC2 and a FloatPointer to the points array.
CvMat mat = cvMat(1, 6, CV_32FC2, new FloatPointer(points));
CvBox2D result = cvFitEllipse2(mat);
System.out.println(result);

結果: ((4.42315, 4.259364), (5.7341976, 9.166761), 146.46394)

于 2013-06-17T11:24:10.687 に答える