2012-12-25 10 views
0

메시지를 표시하는 데 문제가있는 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 

이것은



    #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; 
    } 

이 솔루션을 도와 내 코드 new_demo.cpp입니까?

+0

코드에서 줄을 던졌습니다을 예외? – Osiris

+0

내가 시도 할 때 건물에 코드에 오류가 없습니다. 그 팝업을 디버깅하는 것은 나온다! – Rahul

답변

1

cv :: imread는 첫 번째 매개 변수 (filename)로 상수 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로 전화하고 확인 전에 ARGV [1]로 초기화하는 경우는 argc> 1. 그래서 당신은 추가 명령 줄 매개 변수없이 프로그램을 실행할 경우 nullpointer로부터 캐릭터 라인을 구축하려고합니다. 당신은 C++ 표준 (3.6.1 절)이 argv [argc]가 0이라고 말하기 때문에 운이 좋았습니다. 그렇지 않으면이 경계에서 해당 경계 외부를 액세스하고 배열함으로써 이미 정의되지 않은 동작을 이미 갖게됩니다. 그러나 이제 표준 (§21.4.2)이 금지하는 nullpointer에서 문자열을 생성하려고합니다. ("필요 : 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); 
} 

BTW : 당신은 함수 호출에 기본 매개 변수를 ommit 수가 기본값이 이유입니다) 그래서 이러한 호출도 작업 할 것 :..

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

트릭을 한'std :: string imageName (argv [1]);'과'char * imageName = argv [1]; ' – Rahul

+0

이것이 유일한 변경 사항이라면 여전히 잘못된 것을 수행하고있는 것입니다. 그에 따라 내 대답을 편집했습니다. –

관련 문제