OpenCvSharp函数:CopyMakeBorder边框外推

CopyMakeBorder边框外推

函数说明:根据指定边框外推方式,填充边框。

void CopyMakeBorder(InputArray src,
    OutputArray dst,
    int top,
    int bottom,
    int left,
    int right,
    BorderTypes borderType,
    Scalar? value = null)
参数说明
InputArray src源图像
OutputArray dst 输出图像
int top上边界外推像素
int bottom下边界外推像素
int left左边界外推像素
int right右边界外推像素
BorderTypes borderType边界外推类型
Scalar? value当外推类型为Constant时的,填充值

BorderTypes各值

值 说明
Constant

按固定值填充

`iiiiii|abcdefgh|iiiiiii` with some specified `i`

Replicate

按边界值重复填充

`aaaaaa|abcdefgh|hhhhhhh`

Reflect

反射/镜像填充(从边界像素开始)

`fedcba|abcdefgh|hgfedcb`

Wrap

按对边图像像素填充

`cdefgh|abcdefgh|abcdefg`

Reflect101

镜像填充(从边界往里一像素开始)

`gfedcb|abcdefgh|gfedcba`

Transparent

CopyMakeBorder函数不支持

`uvwxyz|absdefgh|ijklmno`

Default与Reflect101相同
Isolated

不以原图为基础填充

与Constant相同?

填充示例

Constant按固定值填充

 Replicate按边界像素重复填充

 Reflect    反射/镜像填充

Wrap    按对边图像像素填充

 Reflect101 镜像填充(从边界往里1像素开始)

Isolated    不以原图为基础填充

 源码示例

private void TestBorderTypes(Mat src) {
    var bBorderTypes = Enum.GetValues(typeof(BorderTypes));
    foreach(BorderTypes b in bBorderTypes) {
        try {
            //外推宽度
            var extend = 100;
            using var dst = new Mat();
            Cv2.CopyMakeBorder(src, dst, extend, extend, extend, extend, b, Scalar.All(127));
            Cv2.Rectangle(dst, new Rect(extend, extend, src.Width, src.Height), Scalar.Red);
            Cv2.ImShow($"{b.ToString()}", dst);                    
        }
        catch (Exception ex) {
            //不支持 Transparent
        }
    }
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

OpenCvSharp函数示例(目录)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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、付费专栏及课程。

余额充值