我正在移植一些使用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);
问题:与原始代码相比,此代码非常慢。
非常感谢你的帮助!
答案 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*)¢ers[0].x);
RotatedRect rect = fitEllipse(pts);
...
// take care not to change/ delete your vector
// before finishing with the pts Mat.
修改强>
我已将类型修改为UCHAR