0

メッセージの表示で問題が発生するOpenCVチュートリアルを実行しています。プログラムの目的は、画像をグレー画像に変更することです。

これがエラーのスクリーンショットです。

     デバッグアサーションに失敗しました!
     プログラム:.. ments \ VisualStudio 2008 \ Projects \ new_demo \ Debug \ new_demo.exe
     ファイル:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ xstring
     行:1094
     式:無効なnullポインタ
     再試行を中止無視する

これは私のコードです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]で初期化します。したがって、追加のコマンドラインパラメーターなしでプログラムを実行する場合は、nullpointerから文字列を作成しようとします。c ++標準(§3.6.1)でargv [argc]は0になると規定されているのは幸運です。そうでない場合は、境界外にアクセスして配列することにより、この時点で未定義の動作が発生します。しかし今、あなたはnullpointerから文字列を構築しようとしていますが、これは標準(§21.4.2)では禁止されています。(「必要条件:sはnullポインターであってはなりません。」)参照:「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 に答える