0

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

这是错误的屏幕截图。

     调试断言失败!
     程序:..ments\Visual Studio 2008\Projects\new_demo\Debug\new_demo.exe
     文件:f:\dd\vctools\crt_bld\self_x86\crt\src\xstring
     线路:1094
     表达式:无效的空指针
     中止 重试 忽略

这是我的代码 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;
    }

帮我解决一下?

4

1 回答 1

1

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

见: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 > 1 之前使用 argv[1] 对其进行初始化。因此,如果您在没有附加命令行参数的情况下运行程序,则尝试从空指针构造字符串。您很幸运,c++ 标准(第 3.6.1 节)规定 argv[argc] 应为 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);
}

顺便说一句:您可以在函数调用中省略默认参数。这就是为什么它们有默认值。;) 所以这些电话也可以完成这项工作:

image = imread( imageName );
namedWindow( imageName );
namedWindow( "Gray image" );
waitKey();
于 2012-12-25T10:26:07.920 回答