C++中cv::copyMakeBorder()函数的理解和示例

函数的原型如下:

cv::copyMakeBorder(src, dst, top, bottom, left, right, borderType, value);

参数解释:

src:输入图像。
dst:输出图像,它应该具有与源图像相同的尺寸和类型。
top, bottom, left, right:表示在各个边界添加的像素数目。
borderType:定义了边界的类型。它可以是以下值之一:
cv::BORDER_CONSTANT:如果边界类型是常量,那么所有的像素都将被设置为常量值。这是通过 value 参数定义的。
cv::BORDER_REFLECT:对于这个类型,像素是通过对角线镜像复制的。例如,如果我们在顶部添加了2个像素,那么第一个和最后一个像素会镜像复制到新的边界中。
cv::BORDER_WRAP:在这种情况下,如果像素在源图像中越界,那么它们会被复制到另一侧。例如,如果我们在顶部添加了2个像素,那么第一个和最后一个像素会复制到下面。
cv::BORDER_REFLECT_101:这与 cv::BORDER_REFLECT 类似,但是强度较低(即像素强度只被复制到新边界的一个方向)。
cv::BORDER_DEFAULT:这是 cv::BORDER_REFLECT_101 的别名。
cv::BORDER_ISOLATED:这个选项要求源和目标图像是不同的,这样就避免了在目标图像中修改源图像的问题。
value:当 borderType 为 cv::BORDER_CONSTANT 时,这个值定义了边界的常数值。它是一个包含B、G、R、A四个通道的向量(对于彩色图像)。对于灰度图像,它只有一个通道。

下面以cv::BORDER_CONSTANT为例进行运行展示。

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <opencv2/opencv.hpp>
#include "opencv2/core.hpp"
#include <opencv2/highgui/highgui.hpp>


void Ceshi_Fun()
{

    cv::Mat src = cv::imread("./10001_1.jpg");   // Load an image
    cv::imshow("1", src);
    cv::waitKey(0);
    cv::Mat dst;
    //上边界扩充40行,下边界扩充20行,左边扩充30列,右边扩充10列
    int top = 40, bottom = 20, left = 30, right = 10;
    //扩充部分用像素值(111,114,114)填充
    cv::copyMakeBorder(src, dst, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar(114, 114, 114));
    cv::imshow("2", dst);
    cv::waitKey(0);
    std::cout<<"  " << std::endl;

}

int()
{
	Ceshi_Fun();
	return 0;
}

图像处理前:
尺寸大小为1920*1080

图像处理后:
尺寸大小为1960*1140
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
cv::copyMakeBorder函数OpenCV的一个函数,用于在图像的边缘添加边框。纯C++实现该函数需要以下步骤: 1. 定义一个新的图像,大小为原图像加上上、下、左、右四个方向的边框大小。 2. 将原图像复制到新图像间的部分。 3. 对于上、下、左、右四个边框,分别使用cv::copyTo函数将原图像的一部分复制到新图像的对应位置。 以下是一个简单的实现示例: ```cpp void copyMakeBorder(const cv::Mat& src, cv::Mat& dst, int top, int bottom, int left, int right, int borderType, const cv::Scalar& value) { int srcRows = src.rows; int srcCols = src.cols; int dstRows = srcRows + top + bottom; int dstCols = srcCols + left + right; dst.create(dstRows, dstCols, src.type()); // 复制原图像到新图像间 src.copyTo(dst(cv::Rect(left, top, srcCols, srcRows))); // 添加上下左右四个边框 if (top > 0) { cv::Mat roi = dst(cv::Rect(0, 0, dstCols, top)); cv::Mat srcRoi = src(cv::Rect(0, 0, srcCols, top)); cv::copyTo(srcRoi, roi); } if (bottom > 0) { cv::Mat roi = dst(cv::Rect(0, dstRows - bottom, dstCols, bottom)); cv::Mat srcRoi = src(cv::Rect(0, srcRows - bottom, srcCols, bottom)); cv::copyTo(srcRoi, roi); } if (left > 0) { cv::Mat roi = dst(cv::Rect(0, 0, left, dstRows)); cv::Mat srcRoi = src(cv::Rect(0, 0, left, srcRows)); cv::copyTo(srcRoi, roi); } if (right > 0) { cv::Mat roi = dst(cv::Rect(dstCols - right, 0, right, dstRows)); cv::Mat srcRoi = src(cv::Rect(srcCols - right, 0, right, srcRows)); cv::copyTo(srcRoi, roi); } } ``` 其,参数说明如下: - src:原图像 - dst:目标图像,将原图像加上边框后的结果 - top、bottom、left、right:上、下、左、右四个方向的边框大小 - borderType:边框类型,可以选择BORDER_CONSTANT、BORDER_REPLICATE等 - value:当使用BORDER_CONSTANT边框类型时,填充的颜色值

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木彳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值