当前位置: 首页 > 知识库问答 >
问题:

c++ - 我的opencv2的imread为什么不运作?

班宏毅
2024-01-22

为什么imread总是报错[ WARN:0@0.165] global loadsave.cpp:248 cv::findDecoder imread_(''): can't open/read file: check file path/integrity

#include <iostream>#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>int Otsu(cv::Mat& src, cv::Mat& dst, int thresh) {    const int Grayscale = 256;    int graynum[Grayscale] = { 0 };    int r = src.rows;    int c = src.cols;    for (int i = 0; i < r; ++i) {        const uchar* ptr = src.ptr<uchar>(i);        for (int j = 0; j < c; ++j) {        //直方图统计            graynum[ptr[j]]++;        }    }    double P[Grayscale] = { 0 };    double PK[Grayscale] = { 0 };    double MK[Grayscale] = { 0 };    double srcpixnum = r * c, sumtmpPK = 0, sumtmpMK = 0;    for (int i = 0; i < Grayscale; ++i) {        P[i] = graynum[i] / srcpixnum;   //每个灰度级出现的概率        PK[i] = sumtmpPK + P[i];         //概率累计和         sumtmpPK = PK[i];        MK[i] = sumtmpMK + i * P[i];       //灰度级的累加均值                                                                                                                                                                                                                                                                                                                                                                                                                sumtmpMK = MK[i];    }    //计算类间方差    double Var = 0;    for (int k = 0; k < Grayscale; ++k) {        if ((MK[Grayscale - 1] * PK[k] - MK[k]) * (MK[Grayscale - 1] * PK[k] - MK[k]) / (PK[k] * (1 - PK[k])) > Var) {            Var = (MK[Grayscale - 1] * PK[k] - MK[k]) * (MK[Grayscale - 1] * PK[k] - MK[k]) / (PK[k] * (1 - PK[k]));            thresh = k;        }    }    //阈值处理    src.copyTo(dst);    for (int i = 0; i < r; ++i) {        uchar* ptr = dst.ptr<uchar>(i);        for (int j = 0; j < c; ++j) {            if (ptr[j] > thresh)                ptr[j] = 255;            else                ptr[j] = 0;        }    }    return thresh;}int main() {    cv::Mat src = cv::imread("F:\\Pan\\Pictures\\Screenshots\\rhino2.tif");    if (src.empty()) {        return -1;    }    if (src.channels() > 1)        cv::cvtColor(src, src, CV_8U);    cv::Mat dst, dst2;    int thresh = 0;    double t2 = (double)cv::getTickCount();    thresh = Otsu(src, dst, thresh); //Otsu    std::cout << "Mythresh=" << thresh << std::endl;    t2 = (double)cv::getTickCount() - t2;    double time2 = (t2 * 1000.) / ((double)cv::getTickFrequency());    std::cout << "my_process=" << time2 << " ms. " << std::endl << std::endl;    double  Otsu = 0;    Otsu = cv::threshold(src, dst2, Otsu, 255, cv::THRESH_OTSU + cv::THRESH_BINARY);    std::cout << "OpenCVthresh=" << Otsu << std::endl;    cv::namedWindow("src", cv::WINDOW_NORMAL);    cv::imshow("src", src);    cv::namedWindow("dst", cv::WINDOW_NORMAL);    cv::imshow("dst", dst);    cv::namedWindow("dst2", cv::WINDOW_NORMAL);    cv::imshow("dst2", dst2);    cv::waitKey(0);}

尝试了各种:放在同一目录调用,单引号调用,更改图片类型(png),都是报错。恳请大佬帮助。

共有1个答案

惠泳
2024-01-22

首先,您在代码中使用的 cv::imread 函数报错,提示无法打开或读取文件,这通常是因为以下几个原因:

  1. 文件路径错误:确保文件路径正确,且文件确实存在于指定的位置。在你的代码中,你试图读取的文件路径是 "F:\Pan\Pictures\Screenshots\rhino2.tif"。请检查该路径下是否存在该文件。
  2. 文件损坏或格式不支持:有时候,图像文件可能损坏,或者不是OpenCV支持的格式。尝试用其他图像查看器软件打开这个文件,看是否可以正常显示。
  3. OpenCV库问题:确保OpenCV库已经正确安装,并且版本与你的代码兼容。

针对以上问题,您可以尝试以下解决方案:

  • 检查文件路径:确认 "F:\Pan\Pictures\Screenshots\rhino2.tif" 这个路径下确实存在你要读取的文件。注意,Windows系统对路径中的斜杠方向是敏感的,因此应使用正斜杠 "" 而不是反斜杠 ""。
  • 尝试使用绝对路径:有时候,相对路径可能会引发问题。你可以尝试使用文件的绝对路径来读取图像。
  • 检查文件格式和完整性:确保文件格式是OpenCV支持的,并且文件没有损坏。
  • 更新或重新安装OpenCV库:如果OpenCV库有问题,尝试更新到最新版本或者重新安装。

如果以上方法都不能解决问题,你可以尝试使用其他图像读取函数,如 cv::VideoCapture 来读取视频文件中的帧作为图像。

另外,你的代码中有一段 cv::cvtColor(src, src, CV_8U);,这段代码将图像转换为灰度图。如果你的原始图像就是灰度图,这行代码可能会改变图像的像素值范围(从0-255变为0-255),这可能不是你想要的结果。如果原始图像是彩色图,这段代码会丢失颜色信息。你需要根据你的需求来决定是否保留这行代码。

 类似资料:
  • 为什么imread总是报错[ WARN:0@0.165] global loadsave.cpp:248 cv::findDecoder imread_(''): can't open/read file: check file path/integrity 尝试了各种:放在同一目录调用,单引号调用,更改图片类型(png),都是报错。恳请大佬帮助。

  • 有人能找出为什么我的不能工作。也许我错过了什么。我意识到这可能是愚蠢的没有任何更多的上下文比我所展示的,但请您询问,我将很乐意提供更多。 这是一段很大的代码,所以我不知道如何用它生成SSCE。您正在查看的是子类的构造函数,它包含3个面板。此时,只是一个。方法打开一个filechooser,然后加载选定的图像,该图像被绘制到上。图像显示良好,一切正常,除了我调整窗口大小时,没有滚动条。

  • 我刚开始学C++,我试着做一个骰子游戏,用户输入一个1到6之间的数字,然后代码打印一个在这个范围内的随机数,如果y和z相同,你就赢了。 这是我的代码,但当我输入一个数组中没有的数字时,它的工作方式就好像它在数组中一样。 (输入是y)(数组是x)(你需要赢的数字是z) 此外,我可能会更改它,使它只读取数组,这样用户甚至可以放入骰子的边数,如果这样做顺利的话。

  • 按下开始按钮后,它运行程序,但它不允许我使用右下角的退出按钮,我不知道为什么它会这样做。有人能帮忙吗。我希望它继续运行该程序,但仍然允许我使用该按钮,因此,如果我想中途退出,它将允许我。项目描述:“对于我的项目,我将使用python创建一个随机迷宫生成软件。我将创建一个网格呈现给用户。该软件将从左上角开始,然后创建迷宫,沿随机方向运行,最后在右下角结束。”

  • 问题内容: 发生了最奇怪的事情,我的测试运行正常,但现在不再,我完全没有更改代码,这里是一个例外: 问题答案: 我看到您正在使用Eclipse,但您是否还在使用其他外部构建/测试工具,例如Ant或Maven?有时,在同时使用其他外部工具时,Eclipse可能会不同步。 如果使用外部工具,请执行清理生成的工件所需的所有操作(例如mvn clean)。然后刷新Eclipse项目并按照前面的建议进行干净