在对图像进行处理的过程中,经常会遇到需要将分割好或者截取出的图片按顺序存入文件夹的操作,现在发现一种利用二重循环和sprintf_s语句实现的方法,实例如下:
待处理的图片:
实现代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
char ad[128] = { 0 };
int filename = 0, filenum = 0;
Mat img = imread("digits.png");//使用相对路径,图片要和dataprepare.cpp放到同一个文件夹下
Mat gray;
cvtColor(img, gray, CV_BGR2GRAY);
int b = 20;
int m = gray.rows / b; //原图为1000*2000
int n = gray.cols / b; //裁剪为5000个20*20的小图块
for (int i = 0; i < m; i++)
{
int offsetRow = i*b; //行上的偏移量
if (i % 5 == 0 && i != 0)//0-4行为数字0,5-9行为数字1
{
filename++;
filenum = 0;
}
for (int j = 0; j < n; j++)
{
int offsetCol = j*b; //列上的偏移量
//找到每张数字图片的存放路径,存到ad数组中
sprintf_s(ad, "D:\\Projects\\visual studio 2013\\SVMTest1\\data\\%d\\%d.jpg", filename, filenum++);
//截取20*20的小块
Mat tmp;
//截取出原图像中的指定区域复制到tmp中
gray(Range(offsetRow, offsetRow + b), Range(offsetCol, offsetCol + b)).copyTo(tmp);
imwrite(ad, tmp);
}
}
return 0;
}
我图片存放的路径是D:\\Projects\\visual studio 2013\\SVMTest1\\data,在编译之前,需要在data文件夹下提前建好存放每个数字的文件夹,如下图
至于保存图片时的图片名称,保存的时候会自动生成。
运行结果如下: