使用opencv和c++我试图写一个程序,给定一个文件路径,程序将复制该文件中的每一个图像。
#include <filesystem>
#include <fstream>
using namespace std;
using namespace cv;
namespace fs = std::filesystem;
Mat duplicateImage(string filename) {
// Load the input image
Mat image = imread(filename, IMREAD_UNCHANGED);
// Create a duplicate image
Mat duplicate = image.clone();
return duplicate;
}
int main(int argc, char** argv)
{
string directory_name = "C:\\My\\File\\Path\\Name";
vector<string> files_list;
ifstream file_stream(directory_name);
string line;
while (getline(file_stream, line)) {
files_list.push_back(line);
}
// Duplicate each image in the directory
for (string filename : files_list) {
Mat duplicate = duplicateImage(filename);
string output_filename = filename + "_copy"; // new filename for the duplicate;
cv::imwrite(output_filename, duplicate);
}
}
当我打开文件路径时,没有对文件进行任何更改。
我最初试图用fstream来做这个,结果导致了同样的问题,文件根本没有被修改。任何建议都将得到极大的赞赏!
编辑:我发现了一个错误-我甚至没有进入for循环,我知道这是因为我做了一个print语句,在concile中没有看到它。我不确定为什么我不会进入for循环
1条答案
按热度按时间aydmsdu91#
您的代码中有两个问题:
1.获取文件列表:
不能将
ifstream
与getline
一起使用来获取目录中的文件列表(这就是files_list
为空的原因)。你可以使用
std::filesystem::directory_iterator
来实现。在你的情况下,它应该是这样的:
2.使用
cv::imwrite
保存图片:在
cv::imwrite
文档中可以看到:根据文件扩展名选择图像格式(扩展名列表请参见cv::imread)。
扩展列表详细如下:
cv::imread
,其中:.jpg
(用于JPEG文件)、.png
(用于便携式网络图形)等由于您在文件名中添加了**"_copy”**后缀,因此不再使用支持的扩展名之一,并且不会保存图像。
您可以使用“_copy.jpg”或“_copy.png”作为后缀。
您还可以动态地确定当前文件名的扩展名(请参见此处:How to get file extension from string in C++)并将其添加到生成的文件名中。
然而:
如果您只需要复制图像文件(不修改图像内容),您可以简单地使用
std::filesystem::copy
,而无需阅读图像内容等。