C++ cv::copyMakeBorder()函数的用法(附带实例)
在 OpenCV 中,可以使用函数 copyMakeBorder() 为图像设置边界。该函数可以为图像定义额外的填充(边框),原始边缘的行或列被复制成额外的边框。
copyMakeBorder() 函数声明如下:
【实例】为图像加上边框。
1) 新建一个控制台工程,工程名是 test。
2) 打开 main.cpp,输入如下代码:
3) 保存工程并运行,结果如下图所示:
copyMakeBorder() 函数声明如下:
void cv::copyMakeBorder ( InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar & value = Scalar() );参数说明如下:
- src:表示输入图像,即原图像,填Mat类的对象即可。
- Dst:表示输出图像,和原图像有一样的深度,size = Size(src.cols + left +right, src.rows + top+ bottom),其中 top、bottom、left、right 分别表示在原图像的 4 个方向上扩充多少像素。
- value:默认值为 0,当 borderType 取值为 BORDER_CONSTANT时,这个参数表示边界值。
-
borderType:表示边界类型,取值如下:
-
BORDER_REPLICATE:复制法,复制最边缘像素,填充扩充的边界,如下图所示。中值滤波就采用这种方法。
-
BORDER_REFLECT_101:对称法,以最边缘像素为轴,对称填充,如下图所示。这是高斯滤波边界处理的默认方法。
-
BORDER_CONSTANT:常量法,以一个常量像素值(参数value)填充扩充的边界,如下图所示。这种方式在仿射变换、透视变换中非常常见。
- BORDER_REFLECT:和对称法原理一致,不过最边缘像素也要对称过去。
- BORDER_WRAP:用另一侧元素来填充这一侧的扩充边界。
-
BORDER_REPLICATE:复制法,复制最边缘像素,填充扩充的边界,如下图所示。中值滤波就采用这种方法。
【实例】为图像加上边框。
1) 新建一个控制台工程,工程名是 test。
2) 打开 main.cpp,输入如下代码:
#include <opencv2/opencv.hpp> using namespace cv; #include<iostream> using namespace std; #include <opencv2/highgui/highgui_c.h> #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <iostream> #include <stdio.h> int main(int argc, char** argv) { Mat src, dst; int borderType = BORDER_CONSTANT; const char* window_name = "copyMakeBorder Demo"; RNG rng(12345); int top, bottom, left, right; const char* imageName = argc >= 2 ? argv[1] : "sky.jpg"; // 加载图片 src = imread(samples::findFile(imageName), IMREAD_COLOR); // 检查图像是否加载完成 if (src.empty()) { printf(" Error opening image\n"); printf(" Program Arguments: [image_name -- default lena.jpg] \n"); return -1; } // 此程序的简要操作方法 printf("\n \t copyMakeBorder Demo: \n"); printf("\t ----------- \n"); printf(" ** Press 'c' to set the border to a random constant value \n"); printf(" ** Press 'r' to set the border to be replicated \n"); printf(" ** Press 'ESC' to exit the program \n"); namedWindow(window_name, WINDOW_AUTOSIZE); // 初始化筛选器的参数 top = (int)(0.05*src.rows); bottom = top; left = (int)(0.05*src.cols); right = left; for (;;) { Scalar value(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); copyMakeBorder(src, dst, top, bottom, left, right, borderType, value); imshow(window_name, dst); char c = (char)waitKey(500); if (c == 27) break; // 按 Esc 键退出 else if (c == 'c') borderType = BORDER_CONSTANT; else if (c == 'r') borderType = BORDER_REPLICATE; } return 0; }在上述代码中,按 C 键将边界设置为随机常量值,按R键设置要复制的边框,按 Esc 键退出程序。注意,这些按键需要对着图像窗口来按才会起作用。在设置好 top、bottom、left 和 right 后,在循环中调用 copyMakeBorder() 函数为图像增加边框。
3) 保存工程并运行,结果如下图所示:
