1. 函数原型:
void copyMakeBorder( InputArray src, OutputArray dst,
int top, int bottom, int left, int right, int borderType,
const Scalar& value = Scalar())
src:输入的数组。
dst:输出的拓展边界后的数组。
top:在src上边界向上拓展的行数。
bottom:在src下边界向下拓展的行数。
left:在src的左边界向左拓展的列数。
right:在src的右边界向右拓展的列数。
borderType:上一节中的边界拓展策略中的一个。
value:当你的边界策略使用的是BORDER_CONSTANT的时候,此处是指边界处填写的常数值。(
*BORDER_REPLICATE: aaaaaa | abcdefgh | hhhhhhh
* BORDER_REFLECT : fedcba | abcdefgh | hgfedcb
* BORDER_REFLECT_101 : gfedcb | abcdefgh | gfedcba
* BORDER_WRAP : cdefgh | abcdefgh | abcdefg
* BORDER_CONSTANT : iiiiii | abcdefgh | iiiiiii with some specified ’i’
)
源码在utils.cpp中;
2. 功能
扩充src边缘,将图像变大,便于处理边界,该函数调用了cv::borderInterpolate,
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT_101:对称法,也就是以最边缘像素为轴,对称。
BORDER_CONSTANT:常量法。
常量法就是以一个常量像素值(由参数 value给定)填充扩充的边界值,这种方式在仿射变换,透视变换中非常常见
#include<opencv2/opencv.hpp>
using namespace cv;
int main(int arc, char** argv)
{
Mat src, dst;
src = imread("2.jpg");
namedWindow("input",CV_WINDOW_AUTOSIZE);
imshow("input", src);
RNG rng(1);
int top = (int)(0.05*src.rows);
int bottom = (int)(0.05*src.rows);
int left = (int)(0.05*src.cols);
int right = (int)(0.05*src.cols);
int borderType = BORDER_DEFAULT;
while (true) {
int c = waitKey(500);
if ((char)c == 27) {
break;
}else if ((char)c == 'c') {
borderType = BORDER_CONSTANT;
}else if ((char)c == 'r') {
borderType = BORDER_REPLICATE;
}else if ((char)c == 'w') {
borderType = BORDER_WRAP;
}
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
copyMakeBorder(src, dst, top, bottom, left, right, borderType, color);
imshow("output", dst);
}
waitKey(0);
return 0;
}
参考文章:
1. https://blog.youkuaiyun.com/qq_24946843/article/details/82429768
2. https://blog.youkuaiyun.com/zhangping1987/article/details/51141658