我的opencv2的imread为什么不运作?

新手上路,请多包涵

为什么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),都是报错。恳请大佬帮助。

阅读 2.8k
avatarAI BotBETA

首先,您在代码中使用的 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),这可能不是你想要的结果。如果原始图像是彩色图,这段代码会丢失颜色信息。你需要根据你的需求来决定是否保留这行代码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题