You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复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所在的输出目录(DebugRelease),之后你把图片放到这个文件夹里,用.\\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

火山引擎 最新活动