copyMakeBorder函数:
调用方式:
void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value=Scalar() )
参数的理解:
InputArray src:输入图像
OutputArray dst:输出的图像
int top, int bottom, int left, int right:表示对边界每个方向添加的像素个数,就是边框的粗细程度
int borderType:表示边界的类型
有下面几种类型:
borderType:扩充边缘的类型,就是外插的类型,OpenCV中给出以下几种方式
* BORDER_REPLICATE 重复: 就是对边界像素进行复制
* BORDER_REFLECT 反射:对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb 反射
* BORDER_REFLECT_101 反射101: 例子:gfedcb|abcdefgh|gfedcba
* BORDER_WRAP 外包装:cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT 常量复制:例子:iiiiii|abcdefgh|iiiiiii
const Scalar& value=Scalar():表示如果边界的类型是 BORDER_CONSTANT ,那么边界的颜色值;
opencv代码:
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat image, result;
//获得边界的类型
int borderType = BORDER_REPLICATE;
//输入字符
int c;
image = imread("D:6.jpg");
if (!image.data)
{
printf("fail to load image\n");
return -1;
}
//使用说明
cout << "使用说明:" << endl;
cout << "按键c设置边界为随机的颜色" << endl;
cout << "按键r设置边界为原图的颜色" << endl;
cout << "按键按键ESC退出程序" << endl;
//颜色随机值
Scalar value;
//随机数种子
RNG rng(12345);
//初始化参数:边框的粗细
int top = (int)(0.05*image.rows);
int bottom = (int)(0.05*image.rows);
int left = (int)(0.05*image.cols);
int right = (int)(0.05*image.cols);
result = image;
//imshow("显示结果",result);
while (true)
{
c = waitKey(500);
if ((char)c == 27)
{
break;
}
else if ((char)c == 'c')
{
//用常数添加边框(255:白色)
borderType = BORDER_CONSTANT;
}
else if ((char)c == 'r')
{
//复制原图像的边界像素
borderType = BORDER_REPLICATE;
}
//设置随机颜色
value = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
//在图像周围形成边界:输入图像、输出图像(大小为源图像+边界)、上、下、左、右、边界类型、颜色
copyMakeBorder(image, result, top, bottom, left, right, borderType, value);
imshow("显示结果", result);
}
}