下面是OPENCV B4.0 附带的 FLOOD
FILL算法的源代码样例,可以实现简单的彩色图像分割。
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#endif
IplImage* color_img0;
IplImage* mask;
IplImage* color_img;
IplImage* gray_img0 = NULL;
IplImage* gray_img = NULL;
int ffill_case = 1;
int lo_diff = 20, up_diff = 20;
int connectivity = 4;
int is_color = 1;
int is_mask = 0;
int new_mask_val = 255;
void on_mouse( int event, int x, int y, int flags )
{
if(!color_img )
return;
switch(event )
{
caseCV_EVENT_LBUTTONDOWN:
{
CvPoint
seed = cvPoint(x,y);
int
lo = ffill_case == 0 ? 0 : lo_diff;
int
up = ffill_case == 0 ? 0 : up_diff;
int
flags = connectivity + (new_mask_val
<< 8) +
(ffill_case
== 1 ? CV_FLOODFILL_FIXED_RANGE : 0);
int
b = rand() & 255, g = rand() & 255, r = rand()
&255;
CvConnectedComp
comp;
if(
is_mask )
cvThreshold(
mask, mask, 1, 128, CV_THRESH_BINARY );
if(
is_color )
{
CvScalar
color = CV_RGB( r, g, b );
cvFloodFill(
color_img, seed, color, CV_RGB( lo, lo, lo ),
CV_RGB(
up, up, up ), &comp, flags, is_mask ? mask : NULL);
cvShowImage(
"image", color_img );
}
else
{
CvScalar
brightness = cvRealScalar((r*2 + g*7 + b + 5)/10);
cvFloodFill(
gray_img, seed, brightness, cvRealScalar(lo),
cvRealScalar(up),
&comp, flags, is_mask ? mask : NULL );
cvShowImage(
"image", gray_img );