OpenCV为图像添加边框

OpenCV计算机视觉开发实践:基于Qt C++ - 商品搜索 - 京东

在OpenCV中,可以使用函数copyMakeBorder为图像设置边界。该函数可以为图像定义额外的填充(边框),原始边缘的行或列被复制成额外的边框。该函数声明如下:

复制代码
void cv::copyMakeBorder ( InputArray  src, OutputArray  dst, int  top, int  bottom, int left, int      right, int  borderType, const Scalar & value = Scalar() );

参数说明如下:

(1)src:表示输入图像,即原图像,填Mat类的对象即可。

(2)Dst:表示输出图像,和原图像有一样的深度,size = Size(src.cols + left +right, src.rows + top + bottom),其中top、bottom、left、right分别表示在原图像的4个方向上扩充多少像素。

(3)borderType:表示边界类型,取值如下:

  • BORDER_REPLICATE:复制法,复制最边缘的像素,填充扩充的边界,如图4-10所示。中值滤波就采用这种方法。
  • BORDER_REFLECT_101:对称法,以最边缘的像素为轴,对称填充,如图4-11所示。这是高斯滤波边界处理的默认方法。
  • BORDER_CONSTANT:常量法,以一个常量像素值(参数为value)填充扩充的边界,如图4-12所示。这种方式在仿射变换、透视变换中很常见。
  • BORDER_REFLECT:和对称法原理一致,不过连最边缘的像素也要对称过去。
  • BORDER_WRAP:用另一侧的元素来填充这一侧的扩充边界。

(4)value:默认值为0,当borderType取值为BORDER_CONSTANT时,这个参数表示边界值。

【例4.14】为图像加上边框

新建一个控制台工程,工程名是test。

打开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函数为图像增加边框。

保存工程并运行,结果如图4-13所示。

图4-13

相关推荐
强盛小灵通专卖员4 分钟前
DL00291-联邦学习以去中心化锂离子电池健康预测模型完整实现
人工智能·机器学习·深度强化学习·核心期刊·导师·小论文·大论文
Hello123网站12 分钟前
多墨智能-AI一键生成工作文档/流程图/思维导图
人工智能·流程图·ai工具
才思喷涌的小书虫15 分钟前
小白玩转 DINO-X MCP(2):基于 DINO-X MCP 搭建饮食规划工作流
计算机视觉·mcp
有Li44 分钟前
CLIK-Diffusion:用于牙齿矫正的临床知识感知扩散模型|文献速递-深度学习人工智能医疗图像
人工智能·深度学习·文献·医学生
大唐荣华1 小时前
视觉语言模型(VLA)分类方法体系
人工智能·分类·机器人·具身智能
即兴小索奇1 小时前
AI应用商业化加速落地 2025智能体爆发与端侧创新成增长引擎
人工智能·搜索引擎·ai·商业·ai商业洞察·即兴小索奇
NeilNiu1 小时前
开源AI工具Midscene.js
javascript·人工智能·开源
nju_spy2 小时前
机器学习 - Kaggle项目实践(4)Toxic Comment Classification Challenge 垃圾评论分类问题
人工智能·深度学习·自然语言处理·tf-idf·南京大学·glove词嵌入·双头gru
计算机sci论文精选2 小时前
CVPR 2025 | 具身智能 | HOLODECK:一句话召唤3D世界,智能体的“元宇宙练功房”来了
人工智能·深度学习·机器学习·计算机视觉·机器人·cvpr·具身智能
ezl1fe2 小时前
RAG 每日一技(十八):手写SQL-RAG太累?LangChain的SQL智能体(Agent)前来救驾!
数据库·人工智能·后端