1. 程式人生 > >OpenCV學習筆記-漫水填充演算法

OpenCV學習筆記-漫水填充演算法

滿水填充演算法需要使用的函式為:

void cvFloodFill(
IplImage* src,
CvPoint seedPoint,	//漫水法從點seedPoint開始實行演算法
CvScalar newVal,	//畫素點被染色的值
CvScalar loDiff = cvScalarAll(0),	//下標記--被染色的相鄰點減去loDiff
CvScalar upDiff = cvScalarAll(0),	//上標記--被染色的相鄰點加上upDiff
CvConnectedComp* comp = NULL,	//如果comp不是NULL,那麼該CvConnectedComp被設定為被填充區域的統計屬性
int flags = 4,	/*低八位可以被設定為4或者8,這個引數控制著填充演算法的連通性,4表示在4個方向考慮連通性(上下左右),
*8表示在8個方向考慮連通性(加上4個對角線方向),高八位可以設定CV_FLOODFILL_FIXED_RANGE,或者
*CV_FLOODFILL_MASK_ONLY(如果設定只考慮填充MASK),flags的中間位元(8-15位)的值可以設定填充掩碼的值
*flags = 8 | CV_FLOODFILL_MASK_ONLY | CV_FLOODFILL_FIXED_RANGE | (43<<8)
*/
CvArr* mask = NULL	/*mask引數與其他有mask引數的使用方法一致,不同的是可以是作為該函式的輸出值(指定應經被填充的區域)
*如果mask非空,那麼它必須是一個單通道,8位,畫素寬度和高度均比源影象大兩個畫素的影象
*(這是為使內部運算簡單快速),cvFloodFill()不會覆蓋mask中非0的區域
*/
);

例題程式碼為:
#include "StdAfx.h"
#include "cv.h"
#include "highgui.h"


int main(int argc, char ** argv)
{
	cvNamedWindow("source");
	cvNamedWindow("dest1");
	cvNamedWindow("dest2");
	IplImage * src = cvLoadImage("test2.bmp");
	IplImage * img=cvCreateImage(cvGetSize(src), 8, 3);
	IplImage *img2=cvCreateImage(cvGetSize(src),8,3);
	cvCopyImage(src, img);
	cvCopyImage(src,img2);

	cvFloodFill(
		img,
		cvPoint(54,82), 
		CV_RGB(255,0,0),
		cvScalar(20,30,40,0),
		cvScalar(20,30,40,0),
		NULL,
		4,
		NULL
		);
	cvFloodFill(
		img2,
		cvPoint(88,88), 
		CV_RGB(255,0,0),
		cvScalar(20,30,40,0),
		cvScalar(20,30,40,0),
		NULL,
		4,
		NULL
		);
	cvShowImage("source",src);
	cvShowImage("dest1", img);
	cvShowImage("dest2",img2);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvReleaseImage(&img);
	cvReleaseImage(&img2);
	cvDestroyAllWindows();
	return 0;
}

例題結果為:


參考文獻:

1.學習OpenCV,於仕祺,劉瑞禎,清華大學出版社,pp.146-149