C++ 将图像转换为灰度时,OpenCV中存在异常

C++ 将图像转换为灰度时,OpenCV中存在异常,c++,opencv,C++,Opencv,出现奇怪的错误。我尝试将图像转换为灰度,然后将结果矩阵打印到文件,但出现异常: “ConsoleApplication1.exe中0x00007FF965E31F28处未处理的异常: 微软C++异常:CV::内存位置异常 0x00000041305AF2A0 下面是代码。当我出错时,有人能告诉我吗 int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); strin

出现奇怪的错误。
我尝试将图像转换为灰度,然后将结果矩阵打印到文件,但出现异常:

“ConsoleApplication1.exe中0x00007FF965E31F28处未处理的异常: 微软C++异常:CV::内存位置异常 0x00000041305AF2A0

下面是代码。
当我出错时,有人能告诉我吗

int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    string fname;
    cin >> fname;

    cv::Mat img = readImage(fname);

    cv::Mat grayImg(img.size(), CV_64FC1);
    if (img.channels() == 3)
    {
        cvtColor(img, grayImg, CV_BGR2GRAY);
    }
    else
    {
        img.copyTo(grayImg);
    }
    printImg(grayImg);

    cv::waitKey();
    return 0;
}
void printImg(cv::Mat &img)
{
    cout << "---------//------\n";
    if (img.empty())
    {
        cout << "Empty Image\n";
        return;
    }

    for (int i = 0; i < img.size().height; i++)
    {
        for (int j = 0; j < img.size().width; j++)
        {
            cout << img.at<double>(i, j) << " ";
        }
        cout << endl;
    }
    cout << "---------//------\n";
}
intmain()
{
freopen(“input.txt”,“r”,stdin);
freopen(“output.txt”,“w”,stdout);
字符串fname;
cin>>fname;
cv::Mat img=readImage(fname);
cv::Mat grayImg(img.size(),cv_64FC1);
如果(img.channels()==3)
{
CVT颜色(img、灰色img、CV_bgr2灰色);
}
其他的
{
img.copyTo(灰色img);
}
printImg(灰色IMG);
cv::waitKey();
返回0;
}
无效打印img(cv::Mat和img)
{

coutOpenCV函数在发生异常时抛出异常。如果将代码放入try-catch块中,则可以看到异常:

int main() try
{
    // your code here
}
catch(const std::exception& e)
{
    std::cout << e.what() << std::endl;
}

如果发生某些情况,OpenCV函数将抛出异常。如果将代码放入try-catch块中,则可以看到异常:

int main() try
{
    // your code here
}
catch(const std::exception& e)
{
    std::cout << e.what() << std::endl;
}

我不知道为什么您必须先读取图像,然后将其转换为灰度,而OpenCV支持在通过enum CV\u LOAD\u image\u grayscale读取图像时将图像转换为灰度

接下来,您使用的默认imread将图像作为BGR作为CV_8U通道读取。您不必分配灰度img,cvtColor将为您执行此操作

灰色图像的深度和大小将与原始图像相同

cout << img.at<double>(i, j) << " ";

cout我不知道为什么必须先读取图像,然后将其转换为灰度,而OpenCV支持在通过枚举CV\u LOAD\u image\u灰度读取图像时将图像转换为灰度

接下来,您使用的默认imread将图像作为BGR作为CV_8U通道读取。您不必分配灰度img,cvtColor将为您执行此操作

灰色图像的深度和大小将与原始图像相同

cout << img.at<double>(i, j) << " ";


cout调试器应该告诉您。学习使用调试器,因为这是检查和分析程序行为的正确工具。作为一名程序员,不知道调试器和其他分析工具是不可能的。调试器应该如何告诉我问题出在哪里?我可以说,字符串中的错误“很好,了解什么是调试器?该消息表示最有可能是由于访问冲突(即分段错误)导致的崩溃,在调试器中启动程序并查看崩溃的行,找到错误访问的来源,等等。堆栈跟踪告诉您大部分需要找出错误的内容。您无法转换为灰色在一个步骤中将和缩放到不同的数据类型。首先尝试.cvtColor,然后尝试.convertTo。调试器应该告诉您。学习使用调试器,因为这是检查和分析程序行为的正确工具。作为一名程序员,除了其他分析工具外,不了解调试器是不可能的。调试器应该如何告诉我这里有问题吗?我可以说,那个字符串中的错误"很好,了解什么是调试器?该消息表示最有可能是由于访问冲突(即分段错误)导致的崩溃,在调试器中启动程序并查看崩溃的行,找到错误访问的来源,等等。堆栈跟踪告诉您大部分需要找出错误的内容。您无法转换为灰色OpenCV错误:断言失败(((1)你知道这是什么意思吗?谢谢,它起作用了,但是如果我需要使用double in cout,我必须做什么?正如文档所说,你的灰度深度是基于img深度的。所以你只需要使用cv::Mat的成员函数convertTo来转换img。在你的例子中,img.convertTo(img,cv_64FC3);谢谢,它成功了,但是如果我需要使用double in cout,我必须做什么?正如文档所说,您的灰度img深度基于img深度。所以您只需要使用cv::Mat的成员函数convertTo来转换img。在您的例子中,img.convertTo(img,cv_64FC3);
cout << img.at<uchar>(i, j) << " ";