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