cvStartReadSeq使用

void cvStartReadSeq( const CvSeq* seq, CvSeqReader* reader, int reverse=0 )

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;
}
左一是输入图像,右一是画轮廓后图像
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值