我正在尝试将椭圆拟合到 javacv 中的一组 2D 整数点并不断遇到问题。所以我的问题是,cvFitEllipse2 期望什么样的数据?
从 OpenCV 的手册中我发现
CvBox2D cvFitEllipse2(const CvArr* points)
参数 points - 输入 2D 点集,存储在:
- std::vector<> 或 Mat(C++ 接口)
- CvSeq* 或 CvMat*(C 接口)
- Nx2 numpy 数组(Python 接口)
我已经通过以下方式尝试了CvSeq和CvMat :
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 组上问过这个问题,但还没有得到任何输入。