c++ 同时读写文件
c++ read and write files simultaneously
我正在尝试读取一个文件夹中的所有 .png 文件,然后获取它们的灰度并将它们重写到一个新文件夹(具有相同的名称)中。
我的 path_in 个文件:1.png、2.png、...(每次文件总数不同)
所以到最后,path_out 应该包含相同数量的 png 文件,所有文件的名称都与 path_in 中的相同。
但我现在卡住了。由于我是 c++ 的新手,我无法让自己做对。
错误出在重载“+”运算符上。
int main()
{
Mat pic,gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
vector<Mat> images;
size_t count = fn.size();
for (size_t i = 1; i < count + 1; i++)
{
pic = imread(path_in + i, CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY);
imwrite(path_out + i + ".png", gray);
}
}
编辑代码:
#include "stdafx.h"
#include "iostream"
#include <direct.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
std::string path_in("C:/Users/t/");
std::string path_out("C:/Users/New folder/");
int main()
{
_mkdir(path_out.c_str()); //create folder if does not exist
Mat pic, gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
//vector<Mat> images;
size_t count = fn.size();
for (size_t i = 1; i < count; ++i)
{
pic = imread(path_in + fn[i], CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY); //error : Unhandled exception
imwrite(path_out + fn[i] + ".png", gray);
}
waitKey(0);
return 0;
}
**一开始没有展示完整的代码,这里是我的组合代码和建议的答案。
任何人都可以照亮一些吗?
假设 path_in
和 path_out
是 std::string
或 cv::String
变量,您不能使用 +
运算符附加 size_t
值 as-is 给他们,你必须先将整数值转换为 std::string
/cv::String
值,例如:
int main()
{
Mat pic, gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
size_t count = fn.size();
for (size_t i = 1; i <= count; ++i)
{
pic = imread(path_in + std::to_string(i) + ".png", CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY);
imwrite(path_out + std::to_string(i) + ".png", gray);
}
return 0;
}
但是,您不应该假定文件名是按顺序编号的。 glob()
returns 一个 vector
的字符串,所以大概 returns 实际的文件名,所以使用它们 as-is 代替,例如:
int main()
{
Mat pic, gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
size_t count = fn.size();
for (size_t i = 0; i < count; ++i)
{
pic = imread(path_in + fn[i], CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY);
imwrite(path_out + fn[i], gray);
}
return 0;
}
我正在尝试读取一个文件夹中的所有 .png 文件,然后获取它们的灰度并将它们重写到一个新文件夹(具有相同的名称)中。
我的 path_in 个文件:1.png、2.png、...(每次文件总数不同)
所以到最后,path_out 应该包含相同数量的 png 文件,所有文件的名称都与 path_in 中的相同。
但我现在卡住了。由于我是 c++ 的新手,我无法让自己做对。
错误出在重载“+”运算符上。
int main()
{
Mat pic,gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
vector<Mat> images;
size_t count = fn.size();
for (size_t i = 1; i < count + 1; i++)
{
pic = imread(path_in + i, CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY);
imwrite(path_out + i + ".png", gray);
}
}
编辑代码:
#include "stdafx.h"
#include "iostream"
#include <direct.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
std::string path_in("C:/Users/t/");
std::string path_out("C:/Users/New folder/");
int main()
{
_mkdir(path_out.c_str()); //create folder if does not exist
Mat pic, gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
//vector<Mat> images;
size_t count = fn.size();
for (size_t i = 1; i < count; ++i)
{
pic = imread(path_in + fn[i], CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY); //error : Unhandled exception
imwrite(path_out + fn[i] + ".png", gray);
}
waitKey(0);
return 0;
}
**一开始没有展示完整的代码,这里是我的组合代码和建议的答案。
任何人都可以照亮一些吗?
假设 path_in
和 path_out
是 std::string
或 cv::String
变量,您不能使用 +
运算符附加 size_t
值 as-is 给他们,你必须先将整数值转换为 std::string
/cv::String
值,例如:
int main()
{
Mat pic, gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
size_t count = fn.size();
for (size_t i = 1; i <= count; ++i)
{
pic = imread(path_in + std::to_string(i) + ".png", CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY);
imwrite(path_out + std::to_string(i) + ".png", gray);
}
return 0;
}
但是,您不应该假定文件名是按顺序编号的。 glob()
returns 一个 vector
的字符串,所以大概 returns 实际的文件名,所以使用它们 as-is 代替,例如:
int main()
{
Mat pic, gray;
vector<cv::String> fn;
glob(path_in + "*.png", fn, false);
size_t count = fn.size();
for (size_t i = 0; i < count; ++i)
{
pic = imread(path_in + fn[i], CV_LOAD_IMAGE_COLOR);
cvtColor(pic, gray, CV_BGR2GRAY);
imwrite(path_out + fn[i], gray);
}
return 0;
}