前言
这是我《OpenCV:从零到一》专栏的第十三篇博客,想看跟多请戳这。
本文概要
copyMakeBorder为图片添加边框
复习RNG
案例代码
大概内容:循环体实现切换边界类型(也可以用createTrackbar)。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D://86186//Documents//opencv//lena.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "Border Demo";
namedWindow(INPUT_WIN, WINDOW_AUTOSIZE);
namedWindow(OUTPUT_WIN, WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
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);
RNG rng(12345);
int borderType = BORDER_DEFAULT;//默认
int c = 0;
while (true) {
c = waitKey(500);
if ((char)c == 27) {// ESC的ASCII码是27
break;
}
if ((char)c == 'r') {
borderType = BORDER_REPLICATE;//replicate复制;(精确地)仿制;再造;再生
}
else if ((char)c == 'w') {//wrap v.包;用…包裹(或包扎、覆盖等);
borderType = BORDER_WRAP;
}
else if ((char)c == 'c') {
borderType = BORDER_CONSTANT;//常量
}//else 和 else if 还是有区别的
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
copyMakeBorder(src, dst, top, bottom, left, right, borderType, color);//Forms a border around an image.
/*
建立一个边框包围一个图像
copyMakeBorder(src, dst,int top,int bottom,int left,int right,int borderType,Scalar color);
上下左右指的是边框的宽度,color是指颜色
*/
imshow(OUTPUT_WIN, dst);
}
GaussianBlur(src, dst, Size(5, 5), 0, 0);
imshow(OUTPUT_WIN, dst);
waitKey(0);
return 0;
}
运行效果:
解析及注意事项
我们已经认识了borderType好久了,他就像一个最熟悉的陌生人,我们一直都没有了解过他,其实他不过就是一些边框的样式,平时处理图像的时候基本不会用,所以我们之前都没有理睬他,但是涉及掩膜操作有不得不提到这个参数,所以每个掩膜操作的函数都有一个这样的参数,然而我绝大多数都不用填,他有默认值。
全注释代码
程序比较简单,代码同上。
翻译笔记
replicate v复制;(精确地)仿制;再造;再生
Form v.建立
extrapolate v.推断;判定;推测;推知
wrap v.包;用…包裹(或包扎、覆盖等);