OpenCV學習筆記-漫水填充演算法
阿新 • • 發佈:2019-02-19
滿水填充演算法需要使用的函式為:
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