(三)CvSeq数据结构

CvSeq类型在cvFindContours()中的使用 一.cvFindContours()函数实例 图像分割是图像处理中算是比较核心的部分了,就图像分割方法很多但也很灵活,切忌拘泥于一种算法而套用。图像分割的主要应用是利用一些特性从复杂环境中把需要的目标分割出来处理。比如说交通监制系统把视野中的车辆分割提取出来,从而实现对车辆的监控的。 这里假设已经通过基本的分割方法,得到了图像分割结果的Mask图像。那么,如果从Ma 阅读详情

源代码定义

#define CV_TREE_NODE_FIELDS(node_type)                               /
    int       flags;             /* Miscellaneous flags.     */      /
    int       header_size;       /* Size of sequence header. */      /
    struct    node_type* h_prev; /* Previous sequence.       */      /
    struct    node_type* h_next; /* Next sequence.           */      /
    struct    node_type* v_prev; /* 2nd previous sequence.   */      /
    struct    node_type* v_next  /* 2nd next sequence.       */

/*
   Read/Write sequence.
   Elements can be dynamically inserted to or deleted from the sequence.
*/
#define CV_SEQUENCE_FIELDS()                                              /
    CV_TREE_NODE_FIELDS(CvSeq);                                           /
    int       total;          /* Total number of elements.            */  /
    int       elem_size;      /* Size of sequence element in bytes.   */  /
    schar*    block_max;      /* Maximal bound of the last block.     */  /
    schar*    ptr;            /* Current write pointer.               */  /
    int       delta_elems;    /* Grow seq this many at a time.        */  /
    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;

 

还有一个结构序列块

typedef struct CvSeqBlock
{
    struct CvSeqBlock*  prev; /* Previous sequence block.                   */
    struct CvSeqBlock*  next; /* Next sequence block.                       */
  int    start_index;         /* Index of the first element in the block +  */
                              /* sequence->first->start_index.              */
    int    count;             /* Number of elements in the block.           */
    schar* data;              /* Pointer to the first element of the block. */
}
CvSeqBlock;

 

就我的理解是

一个序列里面有许多序列块,而每个序列块里面存储着多个元素。多个序列之间可以通过

宏CV_TREE_NODE_FIELDS(CvSeq)进行联系,进而形成各种数据结构。序列中的

多个序列块也是通过序列块中的prev,next指针连接起来形成双向链表。

 

序列的创建需要从动态存储器中申请分配空间,元素的增加插入等操作也需要向存储器申请空间。

 

比较难以理解的结构中变量

 schar*    block_max;最后一个序列块中已经分配空间的最远地址边界,主要用于与下一个指针进行比较,判断未用空间是否满足元素增加的分配。

 schar*    ptr;指示当前元素存储位置,依次存储增加的新元素,在地址空间[ptr,block_max)中可以用于存储新元素。

 int       delta_elems; 当[ptr,block_max)地址空间不够存储新元素时,重新向存储器申请的空间大小。

 CvSeqBlock* free_blocks;空的序列块列表

 

int start_index; 每个块中的第一个元素在整个序列元素中的索引。一般第一块第一个元素为0,插入删除操作后会变化。

序列数据结构 (CvSeq) 序列是内存存储器中可以存储的一种对象。在opencv中,序列可以存储多种不同的结构。你可以将序列想象为许多编程语言中都存在的容器类或容器类模版(如C++中的vector).序列在内存被实现为一个双端队列(deque).因此序列可以实现快速的随机访问,已经快速删除顶端的元素,但是从中间删除元素则稍慢些.  结构CvSeq的定义 typeedef struct CvSeq{ int flags 阅读详情

相关推荐

OpenCV中调用cvReleaseMemStorage释放CvSeq内存时的一个奇怪问题

关于两个CvSeq的定义及初始操作如下: CvSeq* point_seq = 0; point_seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage ); CvSeq* labels = 0; 用完过后,使用 cvReleaseMemStorage(&(point_seq->s

Bai的博客 6281

CvSeq动态结构序列

动态结构序列CvSeq是所有OpenCv动态数据结构的基础。有两种类型的序列:稠密序列,稀疏序列: (1) 稠密序列都派生自CvSeq,他们用来代表可扩展的一维数组 — 向量、栈、队列和双端队列。数据间不存在空隙(连续存储)。如果元素元素从序列中间被删除或插入新的元素到序列,那么此元素后边的相关元素全部被移动。 (2)稀疏序列派生自CvSet,CvSet也是基于CvSeq的,他们都是由节点所组

fulva的专栏 3419

opencv序列结构CvSeq和轮廓提取cvFindContours的简单运用

我们检测出输入图像的轮廓,然后逐个绘制每个轮廓。从这个例子中,我们可以了解到轮廓测量的方法(如代码中是CV_RETR_LIST)以及max_depth(代码中是0)等参数的细节。如果设置的max_depth是一个比较大的值,你会发现cvFindContours返回的轮廓是通过h_next连接被遍历。对于其他一些拓扑结构(CV_RETR_TREE,CV_RETR_CCOMP等),你会发现有些轮廓被画过不止一次。

never give up的博客 4237

openCV中 cvSeq的用法说明

openCV中 cvSeq的用法说明函数原型说明CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage)功能:创建一序列 参数:seq_flags为序列的符号标志。如

wqvbjhc的专栏 4万+

从零到一:手把手教你用C#开发AGV调度系统(附避坑指南)

本文详细介绍了如何使用C#开发高效的AGV调度系统,涵盖从环境搭建到核心算法实现的完整流程。重点解析了动态路径规划、多机协同等关键技术,并提供了实用的避坑指南和性能优化建议,帮助开发者快速构建工业级车辆控制调度系统。

blockchain9miner的博客 741

从SD更新字库到FLASH,再用LCD显示

用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取 还挺顺利的,移植的原子的程序,自己稍加修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿 在text.c的showstr函数中char的字体颜色随意设置的,可以显...

weixin_30505751的博客 914

OpenCV的序列数据结构(CvSeq)

序列是内存存储器中可以存储的一种对象.序列是某种结构的链表.OpenCV中,序列可以存储多种不同的结构.你可以将序列想象为许多编程语言中都存在的容器类或容器类模版(如C++中的vector).学列在内存被实现为一个双端队列(deque).因此序列可以实现快速的随机访问,已经快速删除顶端的元素,但是从中间删除元素则稍慢些. 1.数据结构 seq数据结构如下 查看文本打印 #define CV...

hanxiaoyong_的博客 656

TBOX(Telematics Box)在智能网联汽车中的核心功能与应用场景解析

TBOX(Telematics Box)是智能网联汽车的“中枢神经”,基于Android或Linux操作系统,并通过CAN总线与车辆深度交互。它实现了远程控制、车辆状态监控、OTA升级及紧急呼叫(E-CALL)等核心功能,是提升用车安全、便利性与实现车辆持续进化的关键技术组件。

weixin_29158413的博客 803

IplImage是这两个库中基本的数据结构

IPL中的函数只处理一种格式的图像,该格式的头结构是IplImage。IplImage是这两个库中基本的数据结构,包含了图像的所有信息,还有指向图像数据的指针。它的具体定义如下: typedef struct_IplImage { int nSize;                                   /*IplImage结构的大小*/ int ID;

autumn20080101的专栏 1295

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 516

【Cmder】--- Windows11 配置CMD神器 (超详细 持续更新中)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1万+

严蔚敏数据结构——LQ、LT、EQ解释

严蔚敏数据结构——LQ、LT、EQ解释

weixin_62440328的博客 3090

机器人控制基础:伺服驱动器的泄放电阻

摘要:伺服驱动器泄放电阻用于消耗电机减速或制动时产生的再生电能,防止母线电压过高损坏元件。其核心作用是将多余电能转化为热能,规避硬件损坏和停机风险。选型需关注功率、阻值和封装三大参数,功率应匹配再生能量,阻值需符合驱动器要求,封装应满足散热需求。可通过动态监测母线电压或静态检测电阻阻值来判断其是否正常工作。

start_up_go的博客 381

CvSeq的理解(转载)

OpenCV中的数据结构CvSeq(序列) 动态结构序列CvSeq是所有OpenCv动态数据结构的基础。有两种类型的序列:稠密序列,稀疏序列: (1) 稠密序列都派生自CvSeq,他们用来代表可扩展的一维数组 — 向量、栈、队列和双端队列。数据间不存在空隙(连续存储)。如果元素元素从序列中间被删除或插入新的元素到序列,那么此元素后边的相关元素全部被移动。 (2)稀疏序列派生自CvSet,

优雅黑曼巴的专栏 9856

蓝牙学习笔记之HCI协议(一)

目录 协议浅述 HCI简介 HCI协议数据格式 HCI Command Packet HCI ACL Data Packet HCI Synchronous(SCO) Data Packet HCI Event Packet HCI命令和事件介绍 Inquiry command Write Local Name Command Read BD_ADDR Command H...

在云巅的博客 2万+

18、项目运行与调试全攻略

本文详细介绍了在IntelliJ IDEA中进行项目运行与调试的完整流程,涵盖运行配置的创建与管理、临时配置的使用与保存、运行窗口的控制台操作及多程序并行运行的处理。同时,讲解了如何通过调试器定位和修复语法错误、运行时错误及逻辑错误,并结合ACME项目演示了第三方库Log4J的集成方法和命令行客户端的功能改进。文章还提供了调试流程图,帮助开发者系统掌握IDEA的强大调试功能,提升开发效率与代码质量。

svm4gardener的博客 75

【Opencv】cvSeq

简介 轮廓是由一个一个像素组成的,如何在内存中存储一个轮廓,就需要用到序列(CvSeq)结构,另外,在处理任何有序关系的动态的对象时可以用到CvSeq。序列是某种结构的链表,可以将序列想象为许多编程语言中都存在的容器类或容器模板类(如C++中的vector),序列在内存被实现为一个双端队列,因此可以实现快速的随机访问,以及快速删除顶端的元素,但是从中间删除元素值则稍慢些。 opencv的实现原...

mjiansun的专栏 1705

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CvSeq

CvSeq 可动态增长元素序列 typedef struct CvSeq{CV_SEQUENCE_FIELDS()} CvSeq; 结构CvSeq是所有OpenCV动态数据结构的基础。在1.0版本中,将前六个成员剥离出来定义成一个宏. 通过不同寻常的宏定义简化了带有附加参数的结构 CvSeq 的扩展。为了扩展 CvSeq, 用户可以定义一新的数据结构或在通过宏CV_SEQUENCE...

a7028154的博客 196

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

cvSeq

CvSeq 可动态增长元素序列 typedef struct CvSeq { CV_SEQUENCE_FIELDS() } CvSeq; 结构CvSeq是所有OpenCV动态数据结构的基础。在1.0版本中,将前六个成员剥离出来定义成一个宏. 通过不同寻常的宏定义简化了带有附加参数的结构 CvSeq 的扩展。为了扩展 CvSeq, 用户可以定义一新的数据结构或在通过宏CV

816

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

cvSeq的学习

今天在研究《学习opencv》时发现

行者无疆的专栏 849

OpenCv数据结构之CvSeq

动态结构序列CvSeq是所有OpenCv动态数据结构的基础。有两种类型的序列:稠密序列,稀疏序列: (1) 稠密序列都派生自CvSeq,他们用来代表可扩展的一维数组 — 向量、栈、队列和双端队列。数据间不存在空隙(连续存储)。如果元素元素从序列中间被删除或插入新的元素到序列,那么此元素后边的相关元素全部被移动。 (2)稀疏序列派生自CvSet,CvSet也是基于CvSeq的,他们都是由节点所组...

nan1104的博客 391

OpenCV源码解析之动态内存管理CvMemStorage与CvSeq

1.    CvMemStorage 一个对象性不强的结构体,它的作用还是在和CvSeq、文件读取等配合中体现出的。 1.1     CvMemStorage结构图                               1.2CvMemStorage 定义于core模块下的types_c.h: typedef struct CvMemS

delltdk的专栏 4755

【opencv】CvSeq数据结构及函数

可动态增长元素序列(OpenCV_1.0已发生改变,详见cxtypes.h) Growable sequence of elements #define CV_SEQUENCE_FIELDS() \ int flags; /* micsellaneous flags */ \ int header_size; /* size of sequence header */ \

研究僧只干活不吃饭 2891

cvseq的用法

CvSeq 分类: 图像处理 2012-03-29 02:13 425人阅读 评论(0) 收藏 举报 CvSeq 可增长的元素序列 #define CVgSEQUENCE\_FIELDS() \     int flags; /* micsellaneous flags */ \     int header_size; /* 序列头的大小 */

yangqiuying的专栏 2088

关于cvseq

1.创建一个CvSeq对象 CvMemStorage *storage=cvCreateMemStorage(0); CvSeq *seq=cvCreateSeq(0,sizeof(CvSeq),sizeof(int),storage); 这样就创建了一个数据类型为int的seq。 CVAPI(CvMemStorage*) cvCreateMemStorage( int block_siz

逍遥.安——于安静和黑暗中寻找最亮丽的风景 2804
上一篇: (二)CvMemStorageAlloc实现过程
下一篇: jrtplib的简单封装类及使用(一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值