opencv将图片变成固定比例,多余部分黑色填充

opencv将图片变成固定比例,多余部分黑色填充

背景:在深度学习的训练中,cafffe版本的yolo需要尝试一下将训练样本变为固定的3:5比例,但是不能将原图变形,其对应的xml文件也要能保持对应。

上代码

using namespace std;
using namespace cv;

Mat getROIimage(Mat srcimg,string file);
string Dir_path = "C:\\Users\\lcg\\Desktop\\cut\\JPEGImages\\";

int main(int argc, char *argv[])
{
    Directory dir;
    string newfilename;
    vector<string> fileNames = dir.GetListFiles(Dir_path, "*.jpg", false);
    for (int i = 0; i < fileNames.size(); i++)
    {
        string fileName = fileNames[i];
        string filefullname;
        string xmlname;
        newfilename = Dir_path + "size\\"+"5-3-" + fileName;
        filefullname = Dir_path + fileName;
        Mat srcImg = imread(filefullname);      
        Mat desimg = getROIimage(srcImg,filefullname);
        imwrite(newfilename, desimg);
        //waitKey(0);
    }

}

Mat getROIimage(Mat srcimg,string file)
{
    int width=0;
    int height=0;
    if (3 * srcimg.rows <= 5 * srcimg.cols)
    {
        width = srcimg.cols;
        height = 5 * srcimg.cols / 3;
    }
    else
    {
        height = srcimg.rows;
        width = 3 * srcimg.rows / 5;
    }
    Mat desImg(height, width, CV_8UC3, Scalar(0,0,0));//创建一个全黑的图片
    Mat imageROI;
    imageROI = desImg(Rect(0, 0, srcimg.cols, srcimg.rows));
    Mat mask = imread(file, 0);
    srcimg.copyTo(imageROI, mask);
    return desImg;
}

总体思路:将文件夹下所有的图片全部都变成3:5的比例,不能变形,所以必须得用黑色填充其余的地方。

①用opencv中自带的Directory来遍历文件夹下所有的图片文件。

②对每一站图片都进行处理成3:5,个人认为先判断3倍的高和5倍的宽,谁的值比较大就以谁为基准来创建一张纯黑的图片。然后再根据原图的尺寸在黑色的图片上建立一个roi区域,将原图叠加在黑色的图上,这样就能生成一张固定比例的图片了。

a、建立一张纯黑的图

Mat desImg(height, width, CV_8UC3, Scalar(0,0,0));//创建一个全黑的图片

height和width是要创建的图片的尺寸。CV_8UC3是指建立一个3通道的图片(也就是彩色图),如果是创建单通道的那就是CV__8U,后面的Scalar(0,0,0)是分别指三个通道中各个分量的值,如果都是255 那么就是创建一个白色图片。

b、建立roi区域

imageROI = desImg(Rect(0, 0, srcimg.cols, srcimg.rows));

c、将原图叠加到roi区域中,要利用mask掩模,mask一定是灰度图

Mat mask = imread(file, 0);//重新加载原图的灰度图
srcimg.copyTo(imageROI, mask);//将原图叠加到roi区域

总结

图片文件和xml文件要一一对应的,两者的文件名是一样的。xml文件中记录着图片的尺寸和图片中标注的信息。现在将图片的大小改变了,所以要将xml文件中对应的标签更改。

这里写图片描述

原想着可以直接利用opencv中FileStorage来处理xml文件的,但是在尝试了很长时间之后放弃了,因为在opencv中只有三种操作

FileStorage fs(filename, FileStorage::WRITE);//写xml
FileStorage fs(filename, FileStorage::READ);//读xml
FileStorage fs(filename, FileStorage::APPEND);//追加写

一直不知道该怎么去修改xml中节点的值。

以下代码是将获取图片的文件名,不带后缀名。

String getXmlName(String picName)
{
    int pos = picName.find(".jpg");
    if (pos > -1)
    {
        picName.erase(pos, 4);//删除pos位置之后4个字符
    }
    string xmlpath = "C:\\Users\\lcg\\Desktop\\cut\\Annotations_size\\5-3-" + picName + ".xml";
    return xmlpath;
}

始终还是没能搞定在opencv中更改xml的节点,最后转移到python中实现了。 几行代码搞定!

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值