我正在尝试将椭圆拟合到javacv中的一组2D整数点并继续遇到问题。所以我的问题是,cvFitEllipse2期望什么样的数据?
从OpenCV的手册中我发现了
CvBox2D cvFitEllipse2(const CvArr* points)
参数 points - 输入2D点集,存储在:
我尝试过以下方式 CvSeq 以及 CvMat :
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/shapedescr.cpp,第790行 线程“main”中的异常java.lang.RuntimeException:/tmp/opencv-2.4.3+dfsg/modules/imgproc/src/shapedescr.cpp:790:错误:( - 5)函数cvFitEllipse2中不支持的序列类型
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行 线程“main”中的异常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小组上问了这个问题,但还没有得到任何意见。
答案 0 :(得分:0)
我使用简单的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)