我正在运行一个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 :(得分:1)
cv :: imread将对常量std :: string的引用作为其第一个参数(filename)。
您使用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();