通过stringstream由int型变换为string型,
对图像进行读取;
// 批量处理图片.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
typedef unsigned int uint;
//将要读取的图片路径存储在fileList中
vector fileList;
void initFileList(string dir, int first, int last){
fileList.clear();
for(int cur = first; cur <= last; cur++){
//string str_file = dir + "/" + to_string(cur) + ".jpg";
string str_file = dir + "/" + to_string((long long)cur) + ".jpg";
fileList.push_back(str_file);
}
}
//将要读取的图片路径存储在fileList2中
vector fileList2;
void initFileList2(string dir, int first, int last){
fileList2.clear();
for(int cur = first; cur <= last; cur++){
//string str_file = dir + "/" + to_string(cur) + ".jpg";
string str_file = dir + "/" + to_string((long long)cur) + ".png";
fileList2.push_back(str_file);
}
}
int main()
{
initFileList("src_image", 1, 4);
//将要读取的图片路径存储在fileList中
initFileList2("dst_image", 1, 4);
//将要保存的图片路径存储在fileList2中
//vector fileList;
for(uint i = 0; i < fileList.size();++i)
{
Mat rawImg = imread(fileList[i]); //原始图像
if(rawImg.empty())
{
std::cout<<"the Image is empty..."<
如以.txt格式,则.txt的内容如下:
【注】:每行为一个图像名;
1.生成图片描述文件
对于有多幅图像的文件夹,首先生成txt文件,保存图片路径。
利用cmd进入dos
https://jingyan.baidu.com/article/6b182309a8e6bcba59e15943.html
Windows键+R打开运行 输入cmd敲回车,打开命令提示符程序
利用路径进入指定文件夹后生成txt文件
然后可以利用txt列表读入图像并做处理。
处理图像数据集时通常要读写整个文件夹里的图像,这时就会用的图像的批量读写。
比较常用的方法就是生成一个包含所有图像的txt列表
生成txt文件的方法如下:
2.通过TXT批量处理图片
然后可以利用txt列表读入图像并做处理。
参考https://www.cnblogs.com/klitech/p/5955500.html
// 批量处理图片2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "iostream"
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat image;
string ImgName;
string savefile;
int count = 1;
ifstream fin("E:/opencv/opencvlx/批量处理图片2/预处理图片/imagelist.txt");//打开原始样本图片文件列表
while (getline(fin, ImgName)) //逐行读取文件列表
{
cout << "processing:" << ImgName << endl;
ImgName = "E:/opencv/opencvlx/批量处理图片2/预处理图片/" + ImgName;
savefile = "E:/opencv/opencvlx/批量处理图片2/预处理图片/saved/" + to_string((long long)count) + ".jpg"; //指定存储路径
image = imread(ImgName);//读取图片
//imshow("1", image);
if (image.data == 0)
{
printf("[error] 没有图片\n");
return -1;
}
count++;
imwrite(savefile, image);
}
waitKey(600000); //存储图像
return 0;
}
#include
#include
#include
#include
using namespace std;
using namespace cv;
void main()
{
ifstream file("C:/Users/Administrator/Desktop/date/MIT/MIT人脸库/faces/face.txt");
int img_index = 0;
while (!file.eof())
{
char txt_cont[200];
file.getline(txt_cont,200);
char img_file[200],save_file[200];
sprintf(img_file, "C:/Users/Administrator/Desktop/date/MIT/MIT人脸库/faces/%s", txt_cont);
sprintf(save_file, "C:/Users/Administrator/Desktop/date/MIT/MIT人脸库/save/%d.jpg", img_index);
Mat src = imread(img_file);
img_index++;
imwrite(save_file,src);
}
}
方法三:
利用Directory类实现文件夹中特定格式图像的遍历,Directory的头文件是windows.h。
参考https://blog.csdn.net/hei_ya/article/details/51387624
// 批量图片处理3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
void main()
{
Directory dir;
//string path1 = "C:\\Users\\Administrator\\Desktop\\date\\MIT\\MIT人脸库\\faces";
string path1 = "E:\\opencv\\opencvlx\\批量图片处理3\\预处理图片";
string exten1 = "*.png";
vector filenames = dir.GetListFiles(path1, exten1, false);
int size = filenames.size();
for (int i = 0; i < size;i++)
{
cout << filenames[i] << endl;
}
}
参考https://www.cnblogs.com/zhuwei1988/p/5746637.html
利用sprintf将对应的图像文件路径转换为char*,在这种文件名连续的时候可以选中文件夹中的所有图像文件,然后用鼠标右键选定并重命名,键入1后,文件夹的所有文件自动命名为1 (k).jpg,其中k取值为1,2……然后就可以根据本方法进行批量读取了。
// 图片批量处理4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
// 定义相关参数
const int num = 4;
char fileName[50];
char windowName[50];
cv::Mat srcImage;
for (int i = 1; i <= num; i++)
{
// sprintf读入指定路径下图片序列
sprintf_s(fileName, "..\\images\\1 (%d).jpg", i);
sprintf_s(windowName, "NO%d", i);
// 按照图像文件名读取
srcImage = cv::imread(fileName);
if (!srcImage.data)
{
std::cout << "No data!" << std::endl;
return -1;
}
cv::namedWindow(windowName);
cv::imshow(windowName, srcImage);
std::cout << "NO: " << i << std::endl;
//cv::waitKey(0);
/* 该处可以添加处理步骤 */
}
cv::waitKey(0);
return 0;
}
图像批量读取——无规则
文件名无规则的情况读取
参考 -没有尝试-https://www.cnblogs.com/zhuwei1988/p/5746637.html
// 图片批量处理5.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
// 来源:《OpenCV图像处理编程实例》
// 博客:http://blog.csdn.net/zhuwei1988
// 更新:2016-8-1
// 说明:版权所有,引用或摘录请联系作者,并按照上面格式注明出处,谢谢。//
#include
#include
#include
#include
#include
#include
using namespace std;
// LPCWSTR转string
std::string WChar2Ansi(LPCWSTR pwszSrc)
{
int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
if (nLen <= 0) return std::string("");
char* pszDst = new char[nLen];
if (NULL == pszDst) return std::string("");
WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
pszDst[nLen - 1] = 0;
std::string strTemp(pszDst);
delete[] pszDst;
return strTemp;
}
// 利用winWIN32_FIND_DATA读取文件下的文件名
void readImgNamefromFile(char* fileName, vector &imgNames)
{
// vector清零 参数设置
imgNames.clear();
WIN32_FIND_DATA file;
int i = 0;
char tempFilePath[MAX_PATH + 1];
char tempFileName[50];
// 转换输入文件名
sprintf_s(tempFilePath, "%s/*", fileName);
// 多字节转换
WCHAR wstr[MAX_PATH] = { 0 };
MultiByteToWideChar(CP_ACP, 0, tempFilePath, -1, wstr, sizeof(wstr));
// 查找该文件待操作文件的相关属性读取到WIN32_FIND_DATA
HANDLE handle = FindFirstFile(wstr, &file);
if (handle != INVALID_HANDLE_VALUE)
{
FindNextFile(handle, &file);
FindNextFile(handle, &file);
// 循环遍历得到文件夹的所有文件名
利用winWIN32_FIND_DATA读取文件夹下文件的思路:首先转换文件夹名,利用FindFirstFile获取当前文件夹名的句柄;然后遍历当前文件夹名下的所有文件,将得到的所有文件名称转换后赋值于图像文件向量;最后遍历完当前文件下的所有文件,生成相应图像文件索引名称,用于文件夹中所有图像文件的读取,在读取单个图像文件后可进行相关的图像处理操作。