opencv中使用copyMakeBorder为图片填充边框

说明

在使用深度学习模型推理的时候,通常输入图片都是一个正方形,而摄像头采集的图片通常是长方形的,这就要把图片的边上填充一些像素,从而变成所需的正方形。
在opencv中copyMakeBorder可做填充的工作,非常适合做深度学习图片的前处理。
FDDB数据集是用于人脸检测的,经过处理的图片如下所示:
在这里插入图片描述

函数原型

https://docs.opencv.org/3.4/d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36
在这里插入图片描述

python代码示例

这个例子把图片转换为320X320的正方形图片。

import cv2
import numpy as np
import os

#入参是:源图,目标宽度,目标长度
#长宽不等的图片,本函数resize后会在短的那个边上做填充,从而保证图片比例不变
def resize_image(srcimg, targetHeight, targetWidth):
    padh, padw, newh, neww = 0, 0, targetHeight, targetWidth
    if srcimg.shape[0] != srcimg.shape[1]:
        hw_scale = srcimg.shape[0] / srcimg.shape[1]  #shape[0]-h, shape[1]-w
        if hw_scale > 1:  #高度比较大
            newh, neww = targetHeight, int(targetWidth / hw_scale)
            img = cv2.resize(srcimg, (neww, newh), interpolation=cv2.INTER_AREA)
            padw = int((targetWidth - neww) * 0.5)
            img = cv2.copyMakeBorder(img, 0, 0, padw, targetWidth - neww - padw, cv2.BORDER_CONSTANT,
                                     value=0)  # add border
            return img
        else: 
            newh, neww = int(targetHeight * hw_scale) + 1, targetWidth
            img = cv2.resize(srcimg, (neww, newh), interpolation=cv2.INTER_AREA)
            padh = int((targetHeight - newh) * 0.5)
            img = cv2.copyMakeBorder(img, padh, targetHeight - newh - padh, 0, 0, cv2.BORDER_CONSTANT, value=0)
            return img
    else:
        img = cv2.resize(srcimg, (targetWidth, targetHeight), interpolation=cv2.INTER_AREA)
        return img #, newh, neww, padh, padw


f = open("facepictures.txt")
line = f.readline()
num = 0
while line:
    imgpath=line.strip()
    print (num, ":", imgpath)
    img = cv2.imread(imgpath)

    resize_img = resize_image(img, 320, 320)

    newpath = os.path.join("./FDDB/", str(num)+".jpg")
    print("newpath:", newpath)
    cv2.imwrite(newpath, resize_img)

    line = f.readline()
    num+=1
    # if num > 10 :
    #     break


f.close()
  • 0
    点赞
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值