首页 > 解决方案 > OpenCV imread(std::string filename, int flags) 在 c++ 中使用字符串文件名的变量时出现问题

问题描述

我有一个类似这样的功能:

void OpenPattern(std::string filename, bool type){
    Mat img = cv::imread(filename, cv::IMREAD_COLOR);
    if(img.empty()){
        printf("CANNOT OPEN IMAGE");
    }else{
        doSomethingElse();
    }
}

代码编译正常,但是当我运行它时,img 总是空的。我已经测试了存储图像的相对路径和完整路径的文件名。都没有在这里工作。我每次都打印文件名内容,它与图像地址完美匹配。它仅在我这样测试时才有效:

void OpenPattern(std::string filename, bool type){
    filename="path to image" //worked with relative and full path
    Mat img = cv::imread(filename, cv::IMREAD_COLOR);
    //or
   //Mat img = cv::imread("path to image", cv::IMREAD_COLOR);
    if(img.empty()){
        printf("CANNOT OPEN IMAGE");
    }else{
        doSomethingElse();
    }
}

我想很多人都问过类似的问题(比如这里的 imread() won't read string variable in c++),但我还没有找到答案。

有谁知道为什么当文件名是函数参数时 imread() 根本无法打开?或者有谁知道是否有办法调查 imread 决定返回 NULL Mat 的位置,以便我可以更好地调查正在发生的事情?

编辑:

  1. “图像路径”和文件名 100% 相等。事实上,在我的一项测试中,我使用 imwrite(filename, a) 保存了一张与我想要打开的图像同名的图像,并且它有效。
  2. 我尝试了文件名的所有变体:使用 /、\、相对路径、绝对路径。3.这个代码应该是另一个代码的重构版本。旧版本确实可以正确打开图像,但我不知道为什么这个不能。

非常感谢!

标签: c++opencvargumentsimread

解决方案


我不知道 OpenCV,但也许这会有所帮助。这些是我在使用其他库和语言时遇到的问题。

确保路径格式正确。你有没有逃脱斜线和其他特殊字符?您是否尝试过正斜杠和反斜杠?您是否有空格,但不受支持?您是否尝试过以斜线开头和不以斜线开头的路径?


推荐阅读