Visual studio 2008 调试断言失败
我正在运行一个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 IgnoreVisual studio 2008 调试断言失败,visual-studio-2008,visual-c++,opencv,Visual Studio 2008,Visual C++,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
帮助我找到解决方案?cv::imread将对常量std::string的引用作为其第一个参数(文件名) 见: 您可以使用char*imageName调用它,并在检查argc>1之前使用argv[1]初始化它。因此,如果在没有附加命令行参数的情况下运行程序,则尝试从空指针构造字符串。幸运的是,C++标准(3.3.1)指出,ARGV[ARC]应该是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);
}
代码中的哪一行引发异常?当我尝试调试弹出窗口时,代码中没有错误!非常感谢刚刚将
char*imageName=argv[1];
替换为std::string imageName(argv[1])
,成功了!如果这是你唯一改变的东西,你仍然在做错事。我相应地编辑了我的答案。
#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();