CopyMakeBorder
复制图像并且制作边界。(处理边界卷积)
函数定义如下:
void cvCopyMakeBorder( const CvArr* src, CvArr*dst, CvPoint offset, int bordertype, CvScalar value=cvScalarAll(0) );
src:输入图像。
dst:输出图像。
offset: 输入图像(或者其 ROI)欲拷贝到的输出图像长方形的左上角坐标(或者左下角坐标,如果以左下角为原点)。长方形的尺寸要和原图像的尺寸的 ROI 分之一匹配。
bordertype: 已拷贝的原图像长方形的边界的类型: IPL_BORDER_CONSTANT - 填充边界为固定值,值由函数最后一个参数指定。 IPL_BORDER_REPLICATE - 边界用上下行或者左右列来复制填充。(其他两种IPL 边界类型, IPL_BORDER_REFLECT 和 IPL_BORDER_WRAP 现已不支持)。
value: 如果边界类型为IPL_BORDER_CONSTANT 的话,那么此为边界像素的值。 函数 cvCopyMakeBorder 拷贝输入二维阵列到输出阵列的内部并且在拷贝区域的周围制作一个指定类型的边界。函数可以用来模拟和嵌入在指定算法实现中的边界不同的类型。例如:和opencv 中大多数其他滤波函数一样,一些形态学函数内部使用复制边界类型,但是用户可能需要零边界或者填充为 1 或 255 的边界。
program cv_CopyMakeBorder;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
ocv.highgui_c,
ocv.core_c,
ocv.core.types_c,
ocv.imgproc_c,
uResourcePaths;
const
filename = cResourceMedia + 'opencv_logo_with_text.png';
var
image: pIplImage = nil;
dst: pIplImage = nil;
dst2: pIplImage = nil;
begin
try
image := cvLoadImage(filename, 1);
WriteLn(Format('[i] image: %s', [filename]));
dst := cvCreateImage(cvSize(image^.width + 20, image^.height + 20), image^.depth, image^.nChannels);
dst2 := cvCreateImage(cvSize(image^.width + 20, image^.height + 20), image^.depth, image^.nChannels);
cvNamedWindow('original', CV_WINDOW_AUTOSIZE);
cvNamedWindow('IPL_BORDER_CONSTANT', CV_WINDOW_AUTOSIZE);
cvNamedWindow('IPL_BORDER_REPLICATE', CV_WINDOW_AUTOSIZE);
cvCopyMakeBorder(image, dst, cvPoint(10, 10), IPL_BORDER_CONSTANT, cvScalar(250));
cvCopyMakeBorder(image, dst2, cvPoint(10, 10), IPL_BORDER_REPLICATE, cvScalar(250));
cvShowImage('original', image);
cvShowImage('IPL_BORDER_CONSTANT', dst);
cvShowImage('IPL_BORDER_REPLICATE', dst2);
cvWaitKey(0);
cvReleaseImage(&image);
cvReleaseImage(&dst);
cvReleaseImage(&dst2);
cvDestroyAllWindows();
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.