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;
}
左一是輸入圖像,右一是畫輪廓後圖像
 

發佈了31 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章