OpenCV以有效的方式从uchar数组创建序列

时间:2011-12-16 16:48:41

标签: c++ opencv

我正在移植一些使用OpenCV的代码以适合椭圆。我可以稍后重写它,但是现在我需要使用OpenCV例程。 这段代码只是几行,但我不得不改变几乎所有内容,因为cvFitEllipse2()的配置文件已经改变。

我的问题是以下一个:将点数组(uchar对)转换成我可以用

提供cvFitEllipse2()的东西

我没有找到很多代码示例,我发现OpenCV记录很差(但由于我是OpenCV的新手,也许这种感觉是错误的)。 无论如何这里是我写的:

/* centers is the input uchar array */
CvBox2D box;    //output
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq(CV_32FC2, sizeof(CvSeq), sizeof(CvPoint2D32f), storage);

for(int h=0; h<mm; ++h) 
{
    CvPoint2D32f p;
    p.x = (float)centers[h].x;
    p.y = (float)centers[h].y;
    cvSeqPush(seq, &p);
}

// Fits ellipse to current contour.
box = cvFitEllipse2(seq);

问题:与原始代码相比,此代码非常慢。

  • 有没有办法预先分配seq所需的内存? (使用 CvMemStorage对象)
  • 是否有更好的(更简单?容器比 CvSeq?
  • 我可以用更快的速度替换cvSeqPush吗?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

我认为centers是点的向量。

如果您乐意使用C ++界面而不是旧界面,那么您的痛苦就会结束。

根据声明中心的方式,您可以:

vector<cv::Point> centers;
RotatedRect rect = fitEllipse(centers);

或者是核心方法:

struct {
    uchar x, y
} myPoint;

vector<myPoint> centers;
...
int sz = centers.size();

// if you have a different type for x and y, modify here to CV_MY_TYPE
// Here I have taken a pointer to the vector data storage, 
// and fed it into the Mat.
// Check Mat documentation on constructors
Mat pts(1,sz,CV_8UC2, (void*)&centers[0].x); 
RotatedRect rect = fitEllipse(pts);
...
// take care not to change/ delete your vector 
// before finishing with the pts Mat.

修改

我已将类型修改为UCHAR