如何在 Visual c++ 中处理 SEHException?

Posted

技术标签:

【中文标题】如何在 Visual c++ 中处理 SEHException?【英文标题】:How to deal with SEHException in Visual c++? 【发布时间】:2014-08-05 07:49:19 【问题描述】:

我已经编写了有关 inpaint 的代码,部分代码如下所示。 软件为Visual C++ 2010,库为OpenCV2.4.7。

包含的库:

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <opencv/cvaux.h>
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc/imgproc.hpp"

关于修复的部分代码

        IplImage *modified = cvLoadImage("D:\\save\\shutter1.bmp",0);
        IplImage *original = cvLoadImage("D:\\save\\shutter0.bmp",0);
        IplImage *imageProcess = cvCreateImage(cvSize(this->width,this->height),IPL_DEPTH_8U,1);

        cv::Mat src1 = cv::imread("D:\\save\\shutter0.bmp");

        cvAbsDiff(original,modified,imageProcess);
        cvThreshold(imageProcess,imageProcess,1,255,CV_THRESH_BINARY);

        IplConvKernel *pKernel = NULL;
        pKernel = cvCreateStructuringElementEx(5, 5, 2, 2, CV_SHAPE_RECT, NULL);
        cvDilate(imageProcess, imageProcess, pKernel, 3);
        cvErode(imageProcess, imageProcess, pKernel, 3);

        cvSaveImage("D:\\save\\Result.bmp",imageProcess);
        cv::Mat mask = cv::imread("D:\\save\\Result.bmp");
        cv::Mat dst1;
        inpaint(src1, mask, dst1, 1,cv::INPAINT_TELEA);
        imshow("image", dst1);

        cvShowImage("modified", modified );
        cvShowImage("original", original );
        cvShowImage("imageProcess", imageProcess );
        cvWaitKey(1);
        cvReleaseImage(&original);
        cvReleaseImage(&modified);
        cvReleaseImage(&imageProcess);

这段代码可以通过编译器。但是,当我运行这段代码时,会生成一个窗口,上面写着“System.Runtime.InteropServices.SEHException”。这段代码停在imshow("image", dst1); 行。我认为问题可能是由inpaint() 的功能引起的。我已经阅读了很多关于 SEHException 的文章,但我仍然不知道如何处理这个问题。我也不知道为什么这段代码会产生这个问题?

【问题讨论】:

请停止使用已弃用的 c-api,他们已经在 2010 年转移到 c++ 一个。 (特别是,混合 c 和 c++ 调用是通往灾难的直接道路) 你能在调试器中运行这段代码并找出是哪一行出现了异常吗? 我无法完全实现“c-api”。什么是c-api? c-api中使用了这段代码的哪一部分?我选择的初始环境是 C++。 @Jaywalker 当我删除这三行 cv::Mat dst1;inpaint(src1, mask, dst1, 1,cv::INPAINT_TELEA);imshow("image", dst1); 时,代码就可以了。第一行cv::Mat dst1;和第三行imshow("image", dst1);可能没有问题。 我使用 try 和 catch 来确定 Exception 的类型。我得到了如下消息。 外部组件抛出异常 【参考方案1】:

在搜索更多网站并使用try和catch查找异常后,我知道这个SEHException的原因是函数inpaint()中的错误参数导致的。我修改了代码,它可以正常运行。修改后的代码如下。

    cvSaveImage("D:\\save\\Result.bmp",imageProcess);
    cv::Mat src1 = cv::imread("D:\\save\\shutter0.bmp");
    cv::Mat img,mask;
    img = cv::imread("D:\\save\\Result.bmp",CV_LOAD_IMAGE_GRAYSCALE);
    mask=cv::Mat::zeros(this->width, this->height, CV_8UC1);
    mask=img;
    cv::Mat dst1; 
    cv::imshow("mask",mask);
    inpaint(src1, mask, dst1, 1,cv::INPAINT_NS);
    cvWaitKey(1000);
    cv::imshow("inpainted", dst1);

【讨论】:

以上是关于如何在 Visual c++ 中处理 SEHException?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Visual C++ 2008 时如何解决未处理的异常错误?

如何使用循环处理 Visual C++ 中文件夹中存在的所有图像

C++如何限制visual studios多处理器编译

Visual C++编程技巧之四

如何在 Visual C++ 中正确调用 CopyFile 函数?

如何在 Windows 上使用 Visual C++ 强制加载链接库