gpt4 book ai didi

opencv - 将 CvSeq 保存到数组

转载 作者:太空宇宙 更新时间:2023-11-03 20:48:57 24 4
gpt4 key购买 nike

我有点迷失在 OpenCV 文档中,我想将 cvFindContours 返回的 CvSeq 保存到一个数组中,据我所知它将返回 CvContour 的序列,但我找不到它包含的内容?我应该保存它的哪些部分,稍后我可以遍历它并说调用 cvBoundingRect 等。

最佳答案

CvContour 是一个结构体,具有与 CvSeq 相同的字段以及其他一些字段,其中最重要的是 CvRect 矩形(请参阅 include/opencv/cxtypes.h)。所以它真的归结为 CvSeq 是什么。

OpenCV 源代码中有一个名为 opencv.pdf 的文件,在 p. 138(对于 OpenCV 2.1)它说 CvSeq 定义如下:

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

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

,其中contours调用 cvFindContours 后将指向第一个轮廓.如果你想得到它的边界矩形,你只需将它传递给 cvBoundingRect .序列中的下一个轮廓可以通过 contours->h_next 访问.在轮廓树的情况下,即当一个轮廓可以在图像中的另一个轮廓内部时,可以通过contours->v_next访问当前轮廓的第一个内部轮廓。 .下一个内部轮廓(如果存在)将是 contours->v_next->h_next , 等等。

如果你想将序列转换为数组,你可以使用 cvCvtSeqToArray .

您还可以使用从 OpenCV 2.0 开始的 C++ 接口(interface),这似乎更好用。例如,CvSeq** contours参数 cvFindContours变成 vector<vector<Point> >& contours .

关于opencv - 将 CvSeq 保存到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4719661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com