在opencv的文件夹中写入图像序列

Posted

技术标签:

【中文标题】在opencv的文件夹中写入图像序列【英文标题】:imwrite sequence of images in a folder in opencv 【发布时间】:2013-01-31 03:47:28 【问题描述】:

在 C++ 中使用 VS 2010 并尝试将其放入 for 循环中

String filename = "cropped_" + (ct+1);
imwrite(filename + ".jpg", img_cropped);

这些是出来的文件名:

ropped_.jpg
opped_.jpg
pped_.jpg

我该怎么做?以及如何将它们放在与我的源代码相同目录的文件夹中?

【问题讨论】:

【参考方案1】:

您可以使用std::stringstream 来构建顺序文件名:

首先包含来自 C++ 标准库的 sstream 标头。

#include<sstream>

using namespace std;

然后在您的代码中,您可以执行以下操作:

stringstream ss;

string name = "cropped_";
string type = ".jpg";

ss<<name<<(ct + 1)<<type;

string filename = ss.str();
ss.str("");

imwrite(filename, img_cropped);

要创建新文件夹,您可以在stdlib.hsystem 函数中使用windows 的命令mkdir

 string folderName = "cropped";
 string folderCreateCommand = "mkdir " + folderName;

 system(folderCreateCommand.c_str());

 ss<<folderName<<"/"<<name<<(ct + 1)<<type;

 string fullPath = ss.str();
 ss.str("");

 imwrite(fullPath, img_cropped);

【讨论】:

成功了!谢谢!这个比我想出的短。是否可以自动将图像放入文件夹中? 嗯.. 要自动创建一个新文件夹,您必须添加一些额外的代码来使用来自windows.hCreateDirectory 函数创建一个目录 我有一个问题。我使用 mkdir("cropped") 制作了一个裁剪文件夹并做到了。但是,不知道如何将图像放入其中。你知道怎么做吗? 感激不尽!如果我能仔细检查你的答案就好了!【参考方案2】:
    for (int ct = 0; ct < img_SIZE ; ct++)
    char filename[100];
    char f_id[3];       //store int to char*
    strcpy(filename, "cropped_"); 
    itoa(ct, f_id, 10);
    strcat(filename, f_id);
    strcat(filename, ".jpg");

    imwrite(filename, img_cropped); 

顺便说一下,这是@sgar91 答案的更长版本

【讨论】:

【参考方案3】:

试试这个:

char file_name[100];
sprintf(file_name, "cropped%d.jpg", ct + 1);
imwrite(file_name, img_cropped);

它们应该只进入您运行代码的目录,否则,您必须像这样手动指定:

sprintf(file_name, "C:\path\to\source\code\cropped%d.jpg", ct + 1);

【讨论】:

您好,谢谢,但它说 cv::String 到 char* 的转换不存在。至于文件夹,你有什么想法吗?要自动创建一个文件夹并将图像放入其中? sprintf 采用 char* 类型的目标参数。它期望已经分配了足够大的char 数组,而不是std::string。要使用sprintffile_name 应该类似于char file_name[256]【参考方案4】:

由于这是 google 搜索的第一个结果,我将使用 std::filesystem (C++17) 添加我的答案

std::filesystem::path root = std::filesystem::current_path();
std::filesystem::create_directories(root / "my_images");

for (int num_image = 0; num_image < 10; num_image++)

    // Perform some operations....
    cv::Mat im_out;
    std::stringstream filename;
    filename << "my_images"<< "/" << "image" << num_image << ".bmp";
    cv::imwrite(filename.str(), im_out);

【讨论】:

以上是关于在opencv的文件夹中写入图像序列的主要内容,如果未能解决你的问题,请参考以下文章

opencv:图像的读取,显示,写入文件

使用 OpenCV 读取文件夹中的有序图像序列

OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频

写入文件时OpenCV未处理的异常

如何使用 imwrite OpenCV 3.1 将图像写入目录?

SLAM数据集序列图片如何批量处理