void cvFloodFill (
IplImage * img,
CvPoint seedPoint,
CvScalar newVal,
CvScalar loDiff = cvScalarAll(0),
CvScalar upDiff = cvScalarAll(0),
CvConnectedComp * comp = NULL,
int flags = 4,
CvArr * mask = NULL
);
- image 【输入/输出】 1或者3通道、 8bit或者浮点图像。仅当参数flags的FLOODFILL_MASK_ONLY标志位被设置时image不会被修改,否则会被修改。
- mask 【输入/输出】 操作掩码,必须为单通道、8bit,且比image宽2个像素、高2个像素。使用前必须先初始化。Flood-filling无法跨越mask中的非0像素。例如,一个边缘检测的结果可以作为mask来阻止边缘填充。在输出中,mask中与image中填充像素对应的像素点被设置为1,或者flags标志位中设置的值(详见flags标志位的解释)。此外,该函数还用1填充了mask的边缘来简化内部处理。因此,可以在多个调用中使用同一mask,以确保填充区域不会重叠。
- seedPoint 起始像素点
- newVal 重绘像素区域的新的填充值(颜色)
- rect 可选输出参数,返回重绘区域的最小绑定矩形。
- loDiff 当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大下行差异值。
- upDiff 当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大上行差异值。
- flags flags标志位是一个32bit的int类型数据,其由3部分组成: 0-7bit表示邻接性(4邻接、8邻接);8-15bit表示mask的填充颜色;16-31bit表示填充模式(详见填充模式解释)
program cv_FloodFill;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
ocv.highgui_c,
ocv.core_c,
ocv.core.types_c,
ocv.imgproc_c,
ocv.imgproc.types_c,
uResourcePaths;
procedure fill(src: pIplImage; seed: TCvPoint; color: TCvScalar);
var
comp: TCvConnectedComp;
begin
cvFloodFill(src, seed, color, cvScalarAll(10),
cvScalarAll(10),
@comp, CV_FLOODFILL_FIXED_RANGE + 8, 0);
WriteLn(Format('[filled area] %.2f', [comp.area]));
end;
procedure myMouseCallback(event: Integer; x: Integer; y: Integer; flags: Integer; param: Pointer); cdecl;
Var
img: pIplImage;
begin
img := pIplImage(param);
case event of
CV_EVENT_MOUSEMOVE:
;
CV_EVENT_LBUTTONDOWN:
begin
WriteLn(Format('%dx%d', [x, y]));
fill(img, CvPoint(x, y), CV_RGB(255, 0, 0));
end;
CV_EVENT_LBUTTONUP:
;
end;
end;
Const
filename = cResourceMedia + 'cat2.jpg';
Var
src: pIplImage = nil;
dst: pIplImage = nil;
c: Integer;
begin
try
src := cvLoadImage(filename);
WriteLn(Format('[i] image: %s', [filename]));
cvNamedWindow('original', 1);
cvSetMouseCallback('original', myMouseCallback, src);
while true do
begin
cvShowImage('original', src);
c := cvWaitKey(33);
if (c = 27) then
break;
end;
cvReleaseImage(src);
cvReleaseImage(dst);
cvDestroyAllWindows;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.