C++ 如何在阵列中读取和写入图像?
我遇到了一个问题:如何将数组中名为name[j]的随机图像读写到另一个文件夹中。目前,我只能将整个输入目录中的图像读写到另一个目录,而不是基于数组名[j]的随机图像。我不知道如何将数组中的值传递给imwrite()函数 这是我的完整代码:C++ 如何在阵列中读取和写入图像?,c++,arrays,opencv,C++,Arrays,Opencv,我遇到了一个问题:如何将数组中名为name[j]的随机图像读写到另一个文件夹中。目前,我只能将整个输入目录中的图像读写到另一个目录,而不是基于数组名[j]的随机图像。我不知道如何将数组中的值传递给imwrite()函数 这是我的完整代码: int main(int argc, char* argv[]) { string homedir = "C:\\Users\\x\\Documents\\Aggressive\\offline workspace\\abc";
int main(int argc, char* argv[])
{
string homedir = "C:\\Users\\x\\Documents\\Aggressive\\offline workspace\\abc";
cerr << endl << "path = " << homedir.c_str() << endl;
std::string inputDirectory = "C:\\Users\\x\\Documents\\Aggressive\\offline workspace\\abc";
std::string outputDirectory = "C:\\Users\\x\\Documents\\folder";
DIR* directory = opendir(inputDirectory.c_str());
struct dirent* _dirent = NULL;
int i = 0;
int total;
srand(time(0)); //seed random number
vector<string> name;
if (directory == NULL)
{
printf("Cannot open Input Folder\n");
return 1;
}
while ((_dirent = readdir(directory)) != NULL)
{
puts(_dirent->d_name);
name.push_back(_dirent->d_name);
printf("\n");
i++;
std::string fileName = inputDirectory + "\\" + std::string(_dirent->d_name);
cv::Mat rawImage = cv::imread(fileName.c_str());
if (rawImage.data == NULL)
{
printf("copied\n");
continue;
}
// Add your any image filter here
fileName = outputDirectory + "\\" + std::string(_dirent->d_name);
cv::imwrite(fileName.c_str(), rawImage);
}
//name.erase(name.begin(), name.begin() + 1);
name.erase(name.begin(), name.begin() + 2);
cout << "file name: " << name[16];
total = i - 2;
cout << "\n";
cout << "There's " << total << " files in the current directory.\n" << endl;
cout << "Enter array size: \n";
int a;
cin >> a;
for (int j = 0; j < a; j++) {
//generate random filename
int index = rand() % a;
//cout << filename[index] << endl;
//swap random[j] with random[index]
string temp = name[j];
name[j] = name[index];
name[index] = temp;
}
//loop through array and print value
for (int j = 0; j < a; j++) {
cout << "Random image selected:" << name[j] << endl;
}
closedir(directory);
}
intmain(intargc,char*argv[])
{
string homedir=“C:\\Users\\x\\Documents\\Aggressive\\offline workspace\\abc”;
cerr d_名称);
cv::imwrite(fileName.c_str(),rawImage);
}
//name.erase(name.begin(),name.begin()+1);
name.erase(name.begin(),name.begin()+2);
cout假设name[j]
是一个格式为C:\\…\\img.jpg
的字符串,您可以在每个循环周期中读取这些图像并将其写入所需目录
for (int j = 0; j < a; j++) {
cout << "Random image selected:" << name[j] << endl;
// name[j] should be in the directory format like "C:\\...\\img.jpg"
//Then read this image
Mat img = imread(name[j]);
//Then write to desired directory in every loop you need to change the name to avoid writing on the same name.
string written_directory = "C:\\Users\\x\\Documents\\folder\\img" + std::to_string(j) + ".jpg";
imwrite(written_directory,img);
}
for(int j=0;j你想把所选的随机图像写到某个地方吗?如果被解释为随机图像的name[j]
有格式字符串,比如C:\\…\image.jpg
你可以很容易地做到。你想把它写到另一个目录吗?是的。我想把随机图像写到name[j]到另一个目录C:\\Users\\x\\Documents\\folder。请帮助我。然后用imread读取name[j]并用imwrite写入?是的。因为随机图像存储在name[j]中,所以我想读取这些图像并将其写入C:\\Users\\x\\Documents\\folder。但我不知道如何操作您可以简单地执行:Mat img=imread(name[j])
然后写:imwrite(“C:\\Users\\x\\Documents\\folder\\img.jpg”,img)
如果我的图像另存为2.jpg,则意味着我只需要将字符串写入\u directory=“C:\\Users\\x\\Documents\\folder\\”+std::to_string(j)+“.jpg”?但现在我有一个错误OpenCV(3.4.10)错误:断言失败(!\u img.empty())在cv::imwrite文件C:\build\3\u 4\u winpack-build-win64-vc14\opencv\modules\imgcodecs\src\loadsave.cpp第759行中,可能有2个原因:1是写入目录不存在。2是您的映像(名称[j]不存在我试图在C:\\Users\\x\\Documents\\Aggressive\\offline workspace\\abc中读取整个文件,并将其写入C:\\Users\\x\\Documents\\folder中,但成功了。这意味着我的路径是正确的。当我读取随机文件名时,我已经检查了该文件是否存在于文件夹abc中。现在我不知道具体的路径是什么问题。顺便说一句,谢谢你的帮助。:)我想根据文件名的原始名称编写文件名,怎么样?例如,在名称[j]中有一个文件2.jpg,然后当我根据建议的代码编写时,它会将我的图像保存为img0。然后你需要在循环中使用namej字符串,并获取字符串的最后一部分,该部分包含原始名称,然后将其添加到编写的目录字符串中