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,线程“main”中的第 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);

Error: OpenCV Error: Unsupported format or combination of formats (The matrix can not be convert to point sequence because in proper element type) in unknown function, file ......\src\opencv\modules\imgproc\src\utils .cpp,第 59 行线程“main”中的异常 java.lang.RuntimeException: ......\src\opencv\modules\imgproc\src\utils.cpp:59: error: (-210) 矩阵不能由于不适当的元素类型而被转换为点序列

我也试过做 CvMat mat = cvCreateMat(1, pts.capacity()*2, CV_32S); 结果相同。不出所料,CV_32S 好像有问题?我不确定。

我无法完全理解这一点。我在 javacv 的 google 组上问过这个问题,但还没有得到任何输入。

4

1 回答 1

1

我找到了一个使用简单浮点数组来解决我的问题的方法。这是我的解决方案:

//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 回答