2012-12-25 211 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 

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

帮我解决?

+0

哪行代码抛出例外? – Osiris

+0

没有在代码中没有错误,而建设时,我尝试调试弹出窗口出来! – Rahul

回答

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调用它,你的argv [1]初始化你检查之前,如果ARGC> 1,所以,如果你不需要额外的命令行参数运行您的程序,你尝试从空指针构造一个字符串。幸运的是,C++标准(第3.6.1节)指出argv [argc]应该为0,否则在此时通过访问和排列它的边界之外已经存在未定义的行为。但是现在你试图从一个空指针构造一个字符串,这是标准(§21.4.2)禁止的。 (“要求:■不得空指针”。)另请参见:“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); 
} 

顺便说一句:你可以在函数调用ommit默认参数这就是为什么他们有默认值) 因此,这些电话也将做的工作:。

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

非常感谢,只是将'char * imageName = argv [1];'替换为'std :: string imageName(argv [1]);',那就做到了! – Rahul

+0

如果这是你改变的唯一的东西,你仍然在做错事。我相应地编辑了我的答案。 –