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 接口)

我已经通过以下方式尝试了 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);

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 期望啥数据?的主要内容,如果未能解决你的问题,请参考以下文章

JavaCV 中的密集光流 (DualTVL1)

JavaCV人脸识别三部曲之一:视频中的人脸保存为图片

JavaCV人脸识别三部曲之一:视频中的人脸保存为图片

javaCV开发详解之14:音频重采样

javacv跟opencv有啥区别

检查图像是不是有效(损坏)javaCV