如何修复Visual Studio中OpenCV断言失败(size.width>0&&size.height>0)错误?
解决OpenCV imread加载失败导致的cv::Exception异常
你遇到的这个断言错误(size.width>0 && size.height>0)本质很明确:你的image对象是空的,也就是cv::imread根本没读到图片,后续调用imshow、创建greyScale这些依赖图片尺寸的操作自然会触发异常。
虽然你把图片放到了EXE旁边,但在Parallels的VS环境里,这里有个很容易踩的坑:VS默认的程序工作目录不是EXE所在的Debug/Release文件夹,而是你的项目根目录。也就是说,你把图片放在xxx\Debug里,但程序实际在xxx目录下运行,相对路径.\\csillam.jpg当然找不到文件。
给你几个一步步的解决办法:
第一步:先加错误检查(必做)
在imread之后立刻判断图片是否加载成功,这样能直接确认问题根源,避免瞎猜。修改main函数开头:
int main() { image = cv::imread(".\\csillam.jpg"); // 新增错误检查 if (image.empty()) { std::cerr << "图片加载失败!请检查路径是否正确" << std::endl; system("pause"); // 方便查看提示信息 return -1; } // 后续代码不变... }
运行后如果弹出加载失败的提示,就坐实了路径问题。
第二步:修正路径问题(二选一)
方法1:用绝对路径测试
直接把图片放到虚拟机里一个路径明确的文件夹(比如C:\Users\你的用户名\Desktop),然后把imread的路径改成绝对路径(注意Windows路径的反斜杠要转义成\\):
image = cv::imread("C:\\Users\\你的用户名\\Desktop\\csillam.jpg");
如果这样能成功加载,就说明之前的相对路径问题确实是工作目录不对。
方法2:修改VS的工作目录(更规范)
右键你的项目 -> 属性 -> 调试 -> 找到「工作目录」,把默认值改成$(OutDir)。这个宏代表EXE所在的输出目录(Debug或Release),之后你把图片放到这个文件夹里,用.\\csillam.jpg的相对路径就能正常读取了。
额外的小优化(可选)
你的代码里还有几个OpenCV的旧用法,可以改成更规范的新版本写法:
- 把
CV_RGB换成cv::Scalar(OpenCV默认是BGR通道顺序,CV_RGB会自动转换,但Scalar更直观) - 把
uint8_t换成OpenCV常用的uchar类型
修改后的鼠标回调函数示例:
void myMouseCallback(int event, int x, int y, int flags, void* userdata) { if (flags & cv::MouseEventFlags::EVENT_FLAG_LBUTTON) { if (flags & cv::MouseEventFlags::EVENT_FLAG_SHIFTKEY) { cv::rectangle(image, { x,y }, { y, x }, cv::Scalar(255, (x*y) % 255, (x + y) % 255)); } else if (flags & cv::MouseEventFlags::EVENT_FLAG_ALTKEY) { cv::line(image, { x, y }, { y, x }, cv::Scalar((y * x) % 255, (int)(sin((double)x / image.cols) * 255), (x * y * x - y) % 255)); } else { cv::circle(image, { x,y }, (x + y) % 10, cv::Scalar(0,0,0)); } } cv::imshow("Ablak", image); }
按上面的步骤来,应该就能解决你的问题了~
内容的提问来源于stack exchange,提问作者Hordon




