2011-12-16 13 views
1

OpenCVを使用しているコードを楕円に合わせて移植しています。私は後で書き直すかもしれませんが、今はOpenCVルーチンを使う必要があります。 このコードはほんの数行ですが、cvFitEllipse2()のプロファイルが変更されたため、ほとんどすべてを変更しなければなりませんでした。OpenCV効率的な方法でucharの配列からシーケンスを作成する

私の問題は、次のいずれかです。私はコードサンプルの多くを発見していなかったと私はOpenCVのことを見つける私は

で)(cvFitEllipse2を養うことができるものに(UCHARのペア)ポイントの配列を変換します文書化されていない(しかし、私は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を置き換えることはできますか?あなたの助けを

おかげでたくさん!

答えて

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. 

EDIT私はUCHARするタイプを変更した

+0

あなたは** opencv **に夢中ですね。 – karlphillip

+0

それを愛する!あなたは(void *)&でトリックを知っていましたか? – Sam

+0

ところで、@karlphillip、それはあなたが私と同じくらい中毒であるようです;) – Sam

関連する問題