

新闻资讯
技术学院cv::imread加载失败主因是路径或编码问题:Windows下中文路径、相对路径错误、扩展名大小写不符均致返回空Mat;需用img.empty()检查,优先用绝对路径;中文路径须改用cv::imdecode+std::ifstream二进制读取。
直接用 cv::imread 读不到图,八成不是代码写错,而是路径或编码问题。Windows 下中文路径、相对路径没对准当前工作目录、文件扩展名大小写不一致(比如 "IMG.JPG" 但代码里写 "img.jpg"),都会让返回值是空 cv::Mat。
if (img.empty()) 检查加载结果,别跳过这步"C:/test/lena.png"(注意斜杠用正斜杠或双反斜杠)cv::imdecode + std::ifstream 二进制读取绕过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,但最后必须有,否则主窗口可能不显示OpenCV 默认按 BGR 顺序读图,不是 RGB。用 cv::cvtColor(img, gray, cv::COLOR_RGB2GRAY) 会出错或结果发灰——因为输入其实是 BGR,却当成 RGB 转。
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY)
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。这些点漏一个,后面所有操作都可能静默失败。