zoukankan      html  css  js  c++  java
  • 【OpenCV学习】错误处理机制

    OpenCV1.0中错误处理与C语言标准函数库里的错误处理相似,设置全局错误标识,通过检查全局错误标识,来判断程序是否出现错误,并进行错误报告.

    在OpenCV1.0中,如果调用函数出现错误并不直接返回错误代码,而是用CV_ERROR宏调用cvError函数报错,并设置错误状态,然后调用标准的或者用户自定义的错误处理器.

    每个程序的线程都有一个全局变量,它包含了错误状(一个整数值).这个状态可以被cvGetErrStatus函数查询到.

    //保存错误所在的文件和行
    typedef struct
    {
        const char* file;
        int         line;
    }CvStackRecord;
    //保存当前线程的上下文信息
    typedef struct CvContext
    {
        int  err_code;                    //错误码
        int  err_mode;                    //错误处理模式
        CvErrorCallback error_callback;    //错误处理函数指针入口
        void*  userdata;
        char  err_msg[4096];
        CvStackRecord  err_ctx;            
    } CvContext;
    CV_IMPL void cvError( int code, const char* func_name, const char* err_msg, const char* file_name, int line )
    {
        if( code == CV_StsOk )
            cvSetErrStatus( code );                
        else
        {
            CvContext* context = icvGetContext();                //获取当前上下文信息
            if( code != CV_StsBackTrace && code != CV_StsAutoTrace )
            {
                //将错误信息保存到当前上下文信息
                char* message = context->err_msg;            
                context->err_code = code;
    
                strcpy( message, err_msg );
                context->err_ctx.file = file_name;
                context->err_ctx.line = line;
            }
            if( context->err_mode != CV_ErrModeSilent )        
            {
                //调用错误处理器进行错误处理
                int terminate = context->error_callback( code, func_name, err_msg, file_name, line, context->userdata );    
                if( terminate )
                {
                    CV_DBG_BREAK();
                    //exit(-abs(terminate));
                }
            }
        }
    }

    OpenCV2.4.1中错误处理机制与上述有所不同,虽然对外接口没有发生变化,但其内部处理方式发生了变化,主要参用C++的异常处理机制.

    如果调用函数出现错误并不直接返回错误代码,用CV_ERROR宏调用cvError函数,然后在cvError中调用error函数来报告错误信息.

    在进入error函数之前,新建一个错误异常类,来保存当前的错误信息,然后利用这个异常类作为error函数的接口.

    在error函数内,首先检测是否存在自定义的错误处理器,若存在则进入自定义的错误处器处理错误,否则,报告错误信息,并抛出错误异常.

    若在错误处理处,有异常的捕获,则可以捕获该异常,用户进行相应的处理.相应的代码如下:

     1 #define CV_ERROR( Code, Msg )                                       \
     2 {                                                                   \
     3     cvError( (Code), cvFuncName, Msg, __FILE__, __LINE__ );        \
     4     __CV_EXIT__;                                                   \
     5 }
     6 CV_IMPL void cvError( int code, const char* func_name, const char* err_msg, const char* file_name, int line )
     7 {
     8     cv::error(cv::Exception(code, err_msg, func_name, file_name, line));
     9 }
    10 void error( const Exception& exc )
    11 {
    12     if (customErrorCallback != 0)        //检测是否存在自定义的错误处理器
    13         customErrorCallback(exc.code, exc.func.c_str(), exc.err.c_str(),
    14                             exc.file.c_str(), exc.line, customErrorCallbackData);
    15     else
    16     {
    17         //报告错误信息
    18         const char* errorStr = cvErrorStr(exc.code);
    19         char buf[1 << 16];
    20         sprintf( buf, "OpenCV Error: %s (%s) in %s, file %s, line %d",
    21             errorStr, exc.err.c_str(), exc.func.size() > 0 ?
    22             exc.func.c_str() : "unknown function", exc.file.c_str(), exc.line );
    23         fprintf( stderr, "%s\n", buf );
    24         fflush( stderr );
    25     }
    26 
    27     if(breakOnError)
    28     {
    29         static volatile int* p = 0;
    30         *p = 0;
    31     }
    32     throw exc;        //抛出异常
    33 }

    总体而言,OpenCV中的错误处理机制,从C语言的处理方式转变为C++中的处理方式.

    具体的实现,请参考相应的源代码.

    参考资料:

    http://www.opencv.org.cn/index.php/Cxcore%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E5%92%8C%E7%B3%BB%E7%BB%9F%E5%87%BD%E6%95%B0

  • 相关阅读:
    C# 关于调用微信接口的代码
    Winform实现微信功能
    Delphi 7 在IDE菜单中增加UPX工具
    Delphi7中Unicode,ANSI,UTF编码问题
    本机时间不正确带来的问题
    Delphi最简化异步选择TCP服务器
    C# Winform小程序:局域网设置NTP服务器、实现时间同步
    开源Inno Setup官网下载、安装、打包教程(官网安装向导中文语言包)
    css 雪碧图的制作
    原生js 实现的瀑布流
  • 原文地址:https://www.cnblogs.com/dwdxdy/p/2599108.html
Copyright © 2011-2022 走看看