Visual studio 2008 调试断言失败

Visual studio 2008 调试断言失败,visual-studio-2008,visual-c++,opencv,Visual Studio 2008,Visual C++,Opencv,我正在运行一个OpenCV教程,其中我在显示消息时遇到了一个问题! 该程序的目的是将图像修改为灰度图像 这是错误的屏幕截图 Debug assertion Failed! Program:..ments\Visual Studio 2008\Projects\new_demo\Debug\new_demo.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\xstring Line:1094 Expression

我正在运行一个OpenCV教程,其中我在显示消息时遇到了一个问题! 该程序的目的是将图像修改为灰度图像

这是错误的屏幕截图

Debug assertion Failed! Program:..ments\Visual Studio 2008\Projects\new_demo\Debug\new_demo.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\xstring Line:1094 Expression: Invalid null pointer Abort Retry Ignore
帮助我找到解决方案?

cv::imread将对常量std::string的引用作为其第一个参数(文件名)

见:

您可以使用char*imageName调用它,并在检查argc>1之前使用argv[1]初始化它。因此,如果在没有附加命令行参数的情况下运行程序,则尝试从空指针构造字符串。幸运的是,C++标准(3.3.1)指出,ARGV[ARC]应该是0,否则,通过在其边界之外访问和排列,此时已经有了未定义的行为。但是现在您正试图从空指针构造字符串,这是标准(§21.4.2)所禁止的。(“要求:s不应为空指针。”)另请参见:http://en.cppreference.com/w/cpp/string/basic_string/basic_string

我建议您将代码更改为以下内容:

#include "opencv2/opencv.hpp"
#include <iostream>

int main( int argc, char** argv )
{
    using namespace cv;

    if( argc < 2 )
    {
        std::cout << "Please pass image file name as cmd param.\n"
        return -1;
    }

    Mat image;
    std::string imageName( argv[1] );
    image = imread( imageName , 1 );

    if( !image.data )
    {
        printf( " No image data \n " );
        return -1;
    }

    Mat gray_image;
    cvtColor( image, gray_image, CV_RGB2GRAY );

    imwrite( "new.jpg", gray_image );

    namedWindow( imageName, CV_WINDOW_AUTOSIZE );
    namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );

    imshow( imageName, image );
    imshow( "Gray image", gray_image );

    waitKey(0);
}

代码中的哪一行引发异常?当我尝试调试弹出窗口时,代码中没有错误!非常感谢刚刚将
char*imageName=argv[1];
替换为
std::string imageName(argv[1])
,成功了!如果这是你唯一改变的东西,你仍然在做错事。我相应地编辑了我的答案。
#include "opencv2/opencv.hpp"
#include <iostream>

int main( int argc, char** argv )
{
    using namespace cv;

    if( argc < 2 )
    {
        std::cout << "Please pass image file name as cmd param.\n"
        return -1;
    }

    Mat image;
    std::string imageName( argv[1] );
    image = imread( imageName , 1 );

    if( !image.data )
    {
        printf( " No image data \n " );
        return -1;
    }

    Mat gray_image;
    cvtColor( image, gray_image, CV_RGB2GRAY );

    imwrite( "new.jpg", gray_image );

    namedWindow( imageName, CV_WINDOW_AUTOSIZE );
    namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );

    imshow( imageName, image );
    imshow( "Gray image", gray_image );

    waitKey(0);
}
image = imread( imageName );
namedWindow( imageName );
namedWindow( "Gray image" );
waitKey();