Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv javacv中的cvFitEllipse2需要什么数据?_Opencv_Javacv - Fatal编程技术网

Opencv javacv中的cvFitEllipse2需要什么数据?

Opencv javacv中的cvFitEllipse2需要什么数据?,opencv,javacv,Opencv,Javacv,我试图将一个椭圆拟合到javacv中的一组2D整型点,并不断遇到问题。所以我的问题是,cvFitEllipse2期望什么样的数据 从OpenCV的手册中我发现 CvBox2D cvFitEllipse2(const CvArr* points) 参数 点–输入二维点集,存储在: std::vector或Mat(C++接口) CvSeq*或CvMat*(C接口) Nx2 numpy数组(Python接口) 我用以下方法尝试了CvSeq和CvMat: 1 CvSeq 错误:OpenCV错误:未

我试图将一个椭圆拟合到javacv中的一组2D整型点,并不断遇到问题。所以我的问题是,cvFitEllipse2期望什么样的数据

从OpenCV的手册中我发现

CvBox2D cvFitEllipse2(const CvArr* points)
参数 –输入二维点集,存储在:

  • std::vector或Mat(C++接口)
  • CvSeq*或CvMat*(C接口)
  • Nx2 numpy数组(Python接口)
我用以下方法尝试了CvSeqCvMat

1 CvSeq 错误: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_32似乎是错的?我不确定


我不太明白这一点。我在javacv的googlegroup上问过这个问题,但还没有得到任何反馈。

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

//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)

我找到了使用简单浮点数组解决问题的方法。以下是我的解决方案:

//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)

您尝试过使用CV_32F吗?有些函数只处理少数几个数据类型。可能std::vector也可以做到这一点。我尝试过CV_32F,但是:由于元素类型不合适,矩阵无法转换为点序列。我也尝试过将CvPoint2D32f存储到CvSeq中。同样的结果。我使用cvFitEllipse2的唯一方法是发送应用canny后发现的轮廓。但这对我没用。我需要能够发送特定的点,而不是全部。您是否尝试过使用CV_32F?有些函数只处理少数几个数据类型。可能std::vector也可以做到这一点。我尝试过CV_32F,但是:由于元素类型不合适,矩阵无法转换为点序列。我也尝试过将CvPoint2D32f存储到CvSeq中。同样的结果。我使用cvFitEllipse2的唯一方法是发送应用canny后发现的轮廓。但这对我没用。我需要能够发送特定的点,而不是全部。
//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);