调试断言失败OpenCV

时间:2012-12-25 09:29:03

标签: 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: Invalid null pointer
     Abort    Retry    Ignore

这是我的代码new_demo.cpp



    #include "cv.h"
    #include "highgui.h"

    using namespace cv;

    int main( int argc, char** argv )
    {
     char* imageName = argv[1];

     Mat image;
     image = imread( imageName, 1 );

     if( argc != 2 || !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);

     return 0;
    }

帮助我解决方案?

1 个答案:

答案 0 :(得分:1)

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

请参阅:http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imread#Mat%20imread%28const%20string&%20filename,%20int%20flags%29

您使用char * imageName调用它,然后在检查argc>之前使用argv [1]对其进行初始化。 1.因此,如果在没有附加命令行参数的情况下运行程序,则尝试从nullpointer构造一个字符串。你很幸运,c ++标准(第3.6.1节)说argv [argc]应该是0,否则你在这一点上已经有了未定义的行为,通过访问它的边界以外的数组。但是现在你试图从nullpointer构造一个字符串,标准(第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);
}

btw:你可以在函数调用中省略默认参数。这就是为什么他们有默认值。 ;) 所以这些调用也可以完成这项任务:

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