为何程序会查找不存在的desktop.bmp?C++ OpenCV遍历异常排查
问题分析与解决办法
一、desktop.bmp读取异常与重复记录问题
原因
- 文件夹遍历逻辑可能误将系统隐藏文件、桌面快捷方式识别为目标BMP文件,或是代码中存在硬编码的
desktop.bmp读取语句,导致程序反复尝试读取该文件。 - 手动添加
desktop.bmp后,遍历逻辑可能两次捕获到该文件(比如一次正常遍历、一次硬编码读取),进而生成重复记录。
解决办法
- 修正文件夹遍历逻辑:仅遍历后缀为
.bmp的常规文件,排除隐藏文件、快捷方式。示例代码片段:#include <filesystem> namespace fs = std::filesystem; for (const auto& entry : fs::directory_iterator(folder_path)) { if (entry.is_regular_file() && entry.path().extension() == ".bmp") { // 处理图片文件 } } - 全局搜索代码,删除或注释掉所有硬编码的
desktop.bmp读取语句(比如imread("desktop.bmp")这类代码)。
二、img_crop = drawing(boundRect[1])触发的异常
原因
boundRect是存储轮廓外接矩形的vector,直接访问索引1的元素时,若当前图片检测到的有效轮廓数量小于2(比如只有1个或0个),会触发vector越界访问,导致程序崩溃。- 轮廓检测参数设置不合理,可能导致部分图片检测到的轮廓数量不足,或是混入了面积过小的噪声轮廓。
解决办法
- 访问
boundRect元素前先判断其大小:if (boundRect.size() >= 2) { img_crop = drawing(boundRect[1]); } else { // 处理轮廓数量不足的情况,比如跳过该图片、记录日志 continue; } - 优化轮廓检测流程:调整开闭运算、膨胀腐蚀的核大小,或增加轮廓过滤条件(只保留面积大于阈值的轮廓),减少无效轮廓干扰。示例代码:
std::vector<std::vector<cv::Point>> contours; cv::findContours(binary_img, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 过滤小轮廓 std::vector<std::vector<cv::Point>> valid_contours; for (const auto& cnt : contours) { if (cv::contourArea(cnt) > 100) { // 阈值根据实际场景调整 valid_contours.push_back(cnt); } } // 生成有效外接矩形 std::vector<cv::Rect> boundRect; for (const auto& cnt : valid_contours) { boundRect.push_back(cv::boundingRect(cnt)); }
内容的提问来源于stack exchange,提问作者TheHiredGoon
相关产品推荐
相关产品推荐

