javacv 中的 cvFitEllipse2 期望啥数据?
Posted
技术标签:
【中文标题】javacv 中的 cvFitEllipse2 期望啥数据?【英文标题】:What data does cvFitEllipse2 in javacv expect?javacv 中的 cvFitEllipse2 期望什么数据? 【发布时间】:2013-06-14 13:11:07 【问题描述】:我正在尝试将椭圆拟合到 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,第 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 群组上问过这个问题,但还没有得到任何输入。
【问题讨论】:
您是否尝试过使用 CV_32F?有些函数只处理少数几种数据类型。可能 std::vector<:point2f> 也可以解决问题。 我尝试过 CV_32F,仍然:由于元素类型不合适,矩阵无法转换为点序列我也尝试将 CvPoint2D32f 存储到 CvSeq 中。结果相同。我设法使用 cvFitEllipse2 的唯一方法是发送应用 canny 后找到的轮廓。不过这对我没用。我需要能够发送特定的点,而不是全部。 【参考方案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)
【讨论】:
以上是关于javacv 中的 cvFitEllipse2 期望啥数据?的主要内容,如果未能解决你的问题,请参考以下文章