2011-01-18 34 views
6

Ben OpenCV docs biraz kayboldum, cvFindContours tarafından döndürülen CvSeq'i bir diziye kaydetmek istiyorum, anladığım kadarıyla bir CvContour s sq döndürecek ama ne olduğunu bulamadım içeriyor? daha sonra bunu hangi bölümlere kaydetmeliyim ki daha sonra bunu yineleyebilirim ve cvBoundingRect çağrısı diyebilirimBir diziye CvSeq kaydet

cevap

8

CvContour, CvSeq ile aynı alanlara sahip bir yapıdır. hangi bir CvRect rect (bakınız include/opencv/cxtypes.h). Yani gerçekten bir CvSeq'in ne olduğuna bağlı.

OpenCV kaynakları ile birlikte gelen opencv.pdf adlı bir dosya var ve p. contourscvFindContours çağrıldıktan sonra ilk kontur işaret edilecektir

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

:

#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; 

Diyelim ki böyle cvFindContours diyoruz diyelim: 138 (OpenCV 2.1 için) aşağıdaki gibi CvSeq tanımlandığını söylüyor . Eğer sınırlayan dikdörtgeni almak istiyorsanız, onu cvBoundingRect'a aktarın. Sıradaki sonraki kontura contours->h_next üzerinden erişilebilir. Kontur ağaçları durumunda, yani bir kontur görüntüde başka bir konturun içinde olabildiğinde, contours->v_next aracılığıyla mevcut konturun ilk iç konturuna erişebilirsiniz. Varsa, sonraki iç kontur contours->v_next->h_next ve benzeri olacaktır.

Diziyi bir diziye dönüştürmek isterseniz cvCvtSeqToArray'u kullanabilirsiniz.

Ayrıca, kullanımı daha güzel görünen OpenCV 2.0'dan başlayarak C++ arayüzünü de kullanabilirsiniz. Örneğin, CvSeq** contours parametresi cvFindContours için vector<vector<Point> >& contours olur.