当前位置: 首页 > news >正文

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

http://www.xdnf.cn/news/900127.html

相关文章:

  • MVC与MVP设计模式对比详解
  • PCB特种工艺应用扩展:厚铜、高频与软硬结合板
  • 加法c++
  • 【驱动】Orin NX恢复备份失败:does not match the current board you‘re flashing onto
  • 【网络安全】Qt免杀样本分析
  • 令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
  • ReadWriteLock(读写锁)和 StampedLock
  • tpc udp http
  • 自动化提示生成框架(AutoPrompt)
  • 零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
  • AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
  • 【AUTOSAR COM CAN】CanSM模块的实现与应用解析
  • 对象存储Ozone EC应用和优化
  • 大语言模型提示词(LLM Prompt)工程系统性学习指南:从理论基础到实战应用的完整体系
  • 装饰模式(Decorator Pattern)重构java邮件发奖系统实战
  • leetcode_206 反转链表
  • PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载
  • 元图CAD:一键解锁PDF转CAD,OCR技术赋能高效转换
  • 网络安全逆向分析之rust逆向技巧
  • 不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!
  • 三十四、面向对象底层逻辑-SpringMVC九大组件之FlashMapManager接口设计哲学
  • C#学习第28天:内存缓存和对象池化
  • vscode使用系列之快速生成html模板
  • CANFD 数据记录仪在汽车售后解决偶发问题故障的应用
  • 浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
  • Python使用clickhouse-local和MySQL表函数实现从MySQL到ClickHouse数据同步
  • 全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
  • Spring Cloud 2025.0.0 Gateway迁移全过程详解
  • Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战
  • 开源 vGPU 方案:HAMi,实现细粒度 GPU 切分