2011-01-18 34 views
6

OpenCVドキュメントでは少し失われていますが、CvSeqがCvContextから返されるCvSeqを配列に保存したいと思います。含まれますか?どの部分を保存しておかなければならないのですか?後で私はそれを繰り返し処理し、cvBoundingRectなどを呼び出すことができます。CvSeqを配列に保存する

答えて

8

CvContourはCvSeqと同じフィールドを持つ構造体です。これはCvRect rectです(include/opencv/cxtypes.hを参照)。だから、CvSeqが本当に沸騰しているのです。

OpenCVソースに付属のopencv.pdfと呼ばれるファイルがあります。

#define CV_SEQUENCE\_FIELDS() 
    int flags; /* micsellaneous flags */ \ 
    int header_size; /* size of sequence header */ \ 
    struct CvSeq* h_prev; /* previous sequence */ \ 
    struct CvSeq* h_next; /* next sequence */ \ 
    struct CvSeq* v_prev; /* 2nd previous sequence */ \ 
    struct CvSeq* v_next; /* 2nd next sequence */ \ 
    int total; /* total number of elements */ \ 
    int elem_size;/* size of sequence element in bytes */ \ 
    char* block_max;/* maximal bound of the last block */ \ 
    char* ptr; /* current write pointer */ \ 
    int delta_elems; /* how many elements allocated when the sequence grows 
    (sequence granularity) */ \ 
    CvMemStorage* storage; /* where the seq is stored */ \ 
    CvSeqBlock* free_blocks; /* free blocks list */ \ 
    CvSeqBlock* first; /* pointer to the first sequence block */ 

typedef struct CvSeq 
{ 
    CV_SEQUENCE_FIELDS() 
} CvSeq; 

は、あなたがこのようなcvFindContoursを呼ぶとしましょう::contourscvFindContoursを呼び出した後に最初の輪郭を指します

cvFindContours(img, storage, &contours, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

、それは次のようにCvSeqが定義されていることを述べている(OpenCVの2.1用)138 。範囲の四角形を取得する場合は、単にcvBoundingRectに渡します。シーケンスの次の輪郭にはcontours->h_nextでアクセスできます。輪郭ツリーの場合、つまり、輪郭が画像の別の輪郭の内側にある場合、現在の輪郭の最初の内側輪郭にはcontours->v_nextでアクセスできます。次の内側の輪郭が存在する場合はcontours->v_next->h_nextとなります。

シーケンスを配列に変換する場合は、cvCvtSeqToArrayを使用できます。

また、OpenCV 2.0からC++インターフェイスを使用することもできますが、これは使いやすいと思われます。たとえば、CvSeq** contoursのパラメータをcvFindContoursに設定すると、vector<vector<Point> >& contoursになります。

関連する問題