cv::imread加载失败主因是路径或编码问题:Windows下中文路径、相对路径错误、扩展名大小写不符均致返回空Mat;需用img.empty()检查,优先用绝对路径;中文路径须改用cv::imdecode+std::ifstream二进制读取。

cv::imread 加载图像失败的常见原因
直接用 cv::imread 读不到图,八成不是代码写错,而是路径或编码问题。Windows 下中文路径、相对路径没对准当前工作目录、文件扩展名大小写不一致(比如 "IMG.JPG" 但代码里写 "img.jpg"),都会让返回值是空 cv::Mat。
- 用
if (img.empty())检查加载结果,别跳过这步 - 绝对路径更可靠,测试时可先写成
"C:/test/lena.png"(注意斜杠用正斜杠或双反斜杠) - OpenCV 默认不支持中文路径,若必须用,改用
cv::imdecode+std::ifstream二进制读取绕过
cv::imshow 窗口一闪而逝或报错 -215
cv::imshow 报错 "OpenCV(4.x): error: (-215) ... in function 'cv::imshow',基本等于传了空 cv::Mat;窗口闪退则是因为没调 cv::waitKey()。
- 确保
cv::imshow("window", img)前img已成功加载且非空 -
cv::waitKey(0)表示无限等待按键,cv::waitKey(1)常用于视频循环,别漏掉 - 多窗口时,每个
cv::imshow后不需立刻waitKey,但最后必须有,否则主窗口可能不显示
cv::cvtColor 转灰度图时 BGR 和 RGB 的陷阱
OpenCV 默认按 BGR 顺序读图,不是 RGB。用 cv::cvtColor(img, gray, cv::COLOR_RGB2GRAY) 会出错或结果发灰——因为输入其实是 BGR,却当成 RGB 转。
- 正确写法是
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY) - 如果图是从 Qt / Pillow 等其他库传入(它们用 RGB),才考虑
RGB2GRAY,否则一律 BGR 开头 - 灰度图是单通道
CV_8UC1,后续做阈值、边缘检测前务必确认gray.channels() == 1
int main() {
cv::Mat img = cv::imread("lena.jpg");
if (img.empty()) {
std::cerr << "Failed to load image\n";
return -1;
}
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); // 注意这里是 BGR2GRAY
cv::imshow("Original", img);
cv::imshow("Grayscale", gray);
cv::waitKey(0); // 必须有
return 0;
}
实际跑通的关键不在语法多漂亮,而在每一步都检查中间状态:加载是否为空、通道数是否符合预期、转灰度后数据类型是否仍是 CV_8U。这些点漏一个,后面所有操作都可能静默失败。











