使用OpenCV与C++实现文件夹图片复制程序无输出问题求助
问题分析
你代码的核心问题是错误用ifstream读取目录——ifstream只能读取单个普通文件的内容,完全没法枚举目录下的文件,所以files_list始终是空的,后续的for循环自然不会执行。
修正方案
利用你已经引入的std::filesystem来遍历目录,筛选出图片文件后再执行复制操作,同时补充必要的错误检查避免程序崩溃。
修正后的代码:
#include <filesystem> #include <vector> #include <string> #include <algorithm> #include <iostream> using namespace std; using namespace cv; namespace fs = std::filesystem; // 检查文件是否为图片(可根据需求扩展后缀) bool isImageFile(const fs::path& filePath) { string ext = filePath.extension().string(); // 转小写,兼容大小写后缀(比如.JPG、.Png) transform(ext.begin(), ext.end(), ext.begin(), ::tolower); return ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp" || ext == ".tif"; } Mat duplicateImage(const string& filename) { Mat image = imread(filename, IMREAD_UNCHANGED); // 检查图片是否读取成功 if (image.empty()) { cerr << "读取图片失败: " << filename << endl; return Mat(); } return image.clone(); } int main(int argc, char** argv) { string directory_name = "C:\\My\\File\\Path\\Name"; vector<string> files_list; // 遍历目录下的所有文件 try { for (const auto& entry : fs::directory_iterator(directory_name)) { // 只处理普通文件,且是图片格式 if (entry.is_regular_file() && isImageFile(entry.path())) { files_list.push_back(entry.path().string()); } } } catch (const fs::filesystem_error& e) { cerr << "目录访问出错: " << e.what() << endl; return 1; } // 复制每个图片 for (const string& filename : files_list) { Mat duplicate = duplicateImage(filename); if (duplicate.empty()) { continue; } // 优化输出文件名:原文件名+_copy+后缀(比如image.jpg → image_copy.jpg) fs::path filePath(filename); string output_filename = filePath.stem().string() + "_copy" + filePath.extension().string(); if (!imwrite(output_filename, duplicate)) { cerr << "写入图片失败: " << output_filename << endl; } } return 0; }
关键改进点
- 用
fs::directory_iterator正确遍历目录,获取所有符合条件的图片文件 - 添加图片后缀检查,避免处理非图片文件
- 补充错误检查:目录访问失败、图片读取/写入失败的提示,方便排查问题
- 优化输出文件名逻辑,避免生成
image.jpg_copy这类不规范的文件名
内容的提问来源于stack exchange,提问作者cvstudent
相关产品推荐
相关产品推荐

