cvStartReadSeq函数说明

对于cvStartReadSeq函数官方文档说明如下:

Initializes the process of sequential reading from a sequence.

C: void cvStartReadSeq(const
CvSeq* seq, CvSeqReader* reader, int reverse=0 )
Parameters:
  • seq – Sequence
  • reader – Reader state; initialized by the function
  • reverse – Determines the direction of the sequence traversal. If reverse is
    0, the reader is positioned at the first sequence element; otherwise it is positioned at the last element.

The function initializes the reader state. After that, all the sequence elements from the first one down to the last one can be read by subsequent calls of the macro CV_READ_SEQ_ELEM( read_elem, reader ) in
the case of forward reading and by using CV_REV_READ_SEQ_ELEM(read_elem, reader ) in
the case of reverse reading. Both macros put the sequence element to read_elem and move the reading pointer toward the next element. A circular structure
of sequence blocks is used for the reading process, that is, after the last element has been read by the macro CV_READ_SEQ_ELEM , the first element is read
when the macro is called again. The same applies to CV_REV_READ_SEQ_ELEM . There is no function to finish the reading process, since it neither changes the
sequence nor creates any temporary buffers. The reader field ptrpoints to the current element of the sequence that is to be read next. The code below demonstrates
how to use the sequence writer and reader.

相关说明:


seq

序列
reader 
读取部分的状态; 由该函数初始化
reverse 
决定遍历序列的方向。如果 reverse 为0,则读取顺序被定位从序列头部元素开始,否则从尾部开始读取

函数 cvStartReadSeq 初始化读取部分的状态。毕竟,顺序读取可通过调用宏 CV_READ_SEQ_ELEM( read_elem, reader ),逆序读取可通过调用宏CV_REV_READ_SEQ_ELEM( read_elem, reader )。这两个宏都将序列元素读进read_elem中, 并将指针移到下一个元素。下面代码显示了如何去使用reader 和 writer.

// 轮廓描绘.cpp : 定义控制台应用程序的入口点。
//
/*==================================================================
名称:轮廓
时间:2013.07.27
说明:把加载图像进行二值化,寻找轮廓,再描绘轮廓
===================================================================*/

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 0;
	int mode = CV_RETR_EXTERNAL;			//获取轮廓的模式
	int contours_num = 0;					//图像中获取轮廓的数目

	CvMemStorage *storage = cvCreateMemStorage(0);
											//创建并声明一个内存,提取轮廓时用的
	//-------------------------图像二值化-----------------------------//
	IplImage *src;							//声明一个图像指针
	src = cvLoadImage("37.png", 0);		//用来加载图像

	cvThreshold(src, src, 128, 255, CV_THRESH_BINARY);
											//把加载图像二值化
	cvNamedWindow("二值化图像");			//创建显示图像窗口
	cvMoveWindow("二值化图像", 60, 60);		//设置显示窗口的位置
	cvShowImage("二值化图像", src);			//图像显示
	cvWaitKey(1000);

	//-------------------------寻找轮廓-------------------------------//
	CvSeq *contour = 0;					//声明一个序列指针,用来存储第一个外接轮廓
	contours_num = cvFindContours(src, storage, &contour, sizeof(CvContour),
		CV_RETR_TREE, CV_CHAIN_APPROX_NONE);						//寻找轮廓函数

	printf("输出轮廓数目:%d\n", contours_num);//输出轮廓数目

	//-------------------------绘制轮廓------------------------------//
	CvSeqReader reader;					//读序列
	int count = 0;
	if(contour!=0)
	{
		count = contour->total;			//获取轮廓点数
		cout<<"count="<<count<<endl;	//输出点数
	}

	cvStartReadSeq(contour, &reader, 0);//初始化序列中的读取过程
	CvPoint pt1;						//声明一个二维坐标点
	IplImage* img = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
										//声明一个大小与输入图像一样,无符号3信道图像指针

	cvNamedWindow("绘制图像", 1);
	cvShowImage("绘制图像", img);

	for(i = 0; i< count; i++)
	{
		CV_READ_SEQ_ELEM(pt1, reader);				//顺序把点读入pt1中
		cvCircle(img, pt1, 4, CV_RGB(255, 0, 0));	//绘制圆点来构成轮廓
		cvShowImage("绘制图像", img);
		cvWaitKey(5);
	}

	cvWaitKey(0);

	//销毁窗口与释放所有内存
	cvDestroyAllWindows();
	cvReleaseImage(&src);
	cvReleaseImage(&img);

	return 0;
}

英文参考website:英文参考网址 

时间: 2024-10-11 00:26:00

cvStartReadSeq函数说明的相关文章

js高阶函数

map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow(x) { return x * x; } var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81] reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个

Django url 标签和reverse()函数的使用(转)

原文:http://www.yihaomen.com/article/python/355.htm 使用url标签和reverse()函数,可以避免在模板和view中对url进行硬编码,这样即使url改变了,对模板和view也没有影响 起初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了,这样带来一个问题,如果在urls.py 中修改了某个页面的地址,

Python2.7-内置函数

具体参见:https://docs.python.org/2/library/functions.html#file 1.进制转换:bin(x), oct(x), hex(x) 把一个十进制数分别转换为2.8.16进制 2.字符转换:chr(x)将数字(255以内不报错,128以后无字符)转换为对应ASCII字符, unichr(x)将数字转换为unicode, ord(x) 将字符转数字与前两个相反, unicode(obj, [encoding, [error]]) 用encoding解码o

linux Shell函数

Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 1 2 3 4 function 函数名() {     语句     [return] } 关键字function表示定义一个函数,可以省略,其后是函数名,有时函数名后可以跟一个括号,符号"{"表示函数执行命令的入口,该符号也可以在函数名那一行,"}"表示函数体的结

pythonの函数学习笔记(一)

函数是可以实现一些特定功能的小方法或小程序定义函数function的方法:def function_name(arg1,arg2[,...]): statement [return value]注意事项:1.def开头,代表定义函数,def和函数名中间要敲一个空格:2.返回值不是必须的,如果没有renturn语句,则默认返回值None:3.函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合,区分大小写且不能是保留字: py使用名称空间的概念存储对象,这个名称空间就是对象作用的区域

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-

Delphi常用系统函数总结

字符串处理函数 Unit System 函数原型 function Concat(s1 [, s2,..., sn]: string): string; 说明 与 S := S1 + S2 + S3 ...; 相同. 将字符串相加. 函数原型 function Copy(S: string; Index, Count: Integer): string;说明 S : 字符串. Indexd : 从第几位开始拷贝. Count : 总共要拷贝几位. 从母字符串拷贝至另一个字符串. 函数原型 pro

python练习之map()和reduce()函数

利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']: 1 def normalize(name): 2 name=name.lower() 3 name=name[0].upper()+name[1:] 4 return name 5 6 7 8 9 10 # 测试: 11 L1 = ['adam', 'LISA', 'barT'] 12 L2 = l