本项目的主要技术要点有以下几步
- 如何读取文件夹下的所有文件
- 如何把一副大图片切割成大小相等的多个小图片
程序实现
#include <opencv2/opencv.hpp>
#include<iostream>
#include<vector>
#include <Windows.h>
#include <fstream>
#include <iterator>
#include <string>
using namespace std;
using namespace cv;
#define kImageBlockWidth 40
#define kImageBlockHeight 40
#define kLoopTimes 60
void find(char* lpPath,std::vector<const std::string> &fileList)
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"\\*.*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(true)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
char szFile[MAX_PATH];
strcpy(szFile,lpPath);
strcat(szFile,"\\");
strcat(szFile,(char* )(FindFileData.cFileName));
find(szFile,fileList);
}
}
else
{
fileList.push_back(FindFileData.cFileName);
}
if(!FindNextFile(hFind,&FindFileData)) break;
}
FindClose(hFind);
}
int main()
{
IplImage *bgImage = NULL;
IplImage *blockImage = NULL;
std::vector<const std::string> fileList;
find("C:\\Users\\Administrator\\Desktop\\桃树坪各个加油岛的负样本制作材料\\resize_裁剪之后",fileList);
vector<string> str_vec;
for(int i = 0; i < fileList.size(); i++)
{
string str_temp(fileList[i],0,fileList[i].size() - 4);
cout<<str_temp<<endl;
str_vec.push_back(str_temp);
}
for(int i = 0; i < fileList.size(); i++)
{
string str_pic_name = "C:\\Users\\Administrator\\Desktop\\桃树坪各个加油岛的负样本制作材料\\resize_裁剪之后\\" + fileList[i];
cout<<str_pic_name<<endl;
string str_save_name = "C:\\Users\\Administrator\\Desktop\\桃树坪各个加油岛的负样本制作材料\\resize_bmp_every\\";
int originX = 0, originY = 0;
int width_limited = 0, height_limited = 0;
int width = 0, height = 0;
bgImage = cvLoadImage(str_pic_name.c_str());
blockImage = cvCreateImage(cvSize(kImageBlockWidth, kImageBlockHeight), bgImage->depth, bgImage->nChannels);
width = bgImage->width;
height = bgImage->height;
width_limited = width - kImageBlockWidth;
height_limited = height - kImageBlockHeight;
cout << width_limited << " " << height_limited;
for (int k = 0; k < kLoopTimes; k++)
{
originX = rand() % width_limited;
originY = rand() % height_limited;
cvZero(blockImage);
CvPoint2D32f center_block = cvPoint2D32f(originX + kImageBlockWidth / 2, originY + kImageBlockHeight / 2);
cvGetRectSubPix(bgImage, blockImage, center_block);
char saveFileName[100] = { '\0' };
sprintf(saveFileName, "_%d.bmp", k + 1);
string final_save_name = str_save_name + str_vec[i] +saveFileName;
cvSaveImage(final_save_name.c_str(), blockImage);
}
}
cvReleaseImage(&bgImage);
cvReleaseImage(&blockImage);
system("pause");
return 0;
}