程序复制图像在一个文件夹中使用opencv和c++不返回任何东西

1bqhqjot  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(131)

使用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循环

aydmsdu9

aydmsdu91#

您的代码中有两个问题:
1.获取文件列表:

不能将ifstreamgetline一起使用来获取目录中的文件列表(这就是files_list为空的原因)。
你可以使用std::filesystem::directory_iterator来实现。
在你的情况下,它应该是这样的:

for (const auto& entry : std::filesystem::directory_iterator(directory_name))
{
    files_list.push_back(entry.path().string());
}

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,而无需阅读图像内容等。

相关问题