메뉴 닫기

OpenCV 예외(Exception) 처리

OpenCV는 자체적으로 정의된 cv::Exception을 사용하여 오류를 처리하고 있습니다.

cv::Exception은 오류 정보를 표현하기 위해 code, err, func, file 및 line이라는 멤버를 갖고 있습니다.

– code: 숫자 오류 코드 (int)

– err: 오류의 특성을 설명 (cv::String)

– func: 오류가 발생한 함수 (cv::String)

– file: 오류가 발생한 파일 (cv::String)

– line: 해당 파일에서 오류가 발생한 행의 위치 (int)

간단한 예제를 하나 만들어 보았습니다.

이전 포스팅에서 소개해 드린 OpenCV의 smart pointer를 선언만 하고, 사용하면 어떻게 될까요?

#include <iostream>
#include <opencv2/core/core.hpp>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	try
	{
		cv::Ptr<Matx33f> ptr;
		cout << *ptr << endl;
	}
	catch (cv::Exception & e)
	{
		cerr << "Exception: " << e.code << endl;
		cerr << e.file << " - " << e.line << endl;
		cerr << e.func << endl;
		cerr << e.err << endl;
	}
	return 0;
}


당연히 exception이 발생합니다 🙁


예외를 직접 생성하는 기본 매크로를 제공하기도 합니다.

CV_Error(errorcode, description)는 고정 텍스트 설명과 함께 예외를 생성하고 throw합니다.

참고로 CV_Error_(errorcode, printf_fmt_str, [printf-args])는 동작은 동일한데, description을 printf와 같은 형식 문자열 및 인수로 바꿀 수 있습니다. 아래 예제를 참고하시기 바랍니다.

#include <iostream>
#include <opencv2/core/core.hpp>

using namespace std;
using namespace cv;

cv::Rect2d makeRect(int x, int y, int width, int height)
{
	if (width < 0 || height < 0)
	{
    	// Case 1)
		//CV_Error(StsOutOfRange, "width/height must be positive number");
        
        // Case 2)
		CV_Error_(Error::StsOutOfRange,
			("Width(%d) or Height(%d) is out of range", width, height));
	}

	return cv::Rect2d(x, y, width, height);
}

int main(int argc, char* argv[])
{
	try
	{
		cv::Rect2d rect = makeRect(0, 0, -10000, 10000);
	}
	catch (cv::Exception & e)
	{
		cerr << "Exception: " << e.code << endl;
		cerr << e.file << " - " << e.line << endl;
		cerr << e.func << endl;
		cerr << e.err << endl;
	}
	return 0;
}


width가 음수값이라서 예외가 발생했습니다.


마지막으로 CV_Assert (조건) / CV_DbgAssert(조건)은 조건을 테스트하고 조건이 충족되지 않으면 예외를 throw합니다.

이 매크로는 func, file 및 line 필드를 자동으로 처리할 수 있습니다. 아래 예제를 참고하시기 바랍니다.

※ Dbg가 붙은 함수는 디버깅용 함수입니다.

#include <iostream>
#include <opencv2/core/core.hpp>

using namespace std;
using namespace cv;

cv::Rect2d makeRect(int x, int y, int width, int height)
{
	CV_Assert(width > 0 && height > 0);
	return cv::Rect2d(x, y, width, height);
}

int main(int argc, char* argv[])
{
	try
	{
		cv::Rect2d rect = makeRect(0, 0, -10000, 10000);
	}
	catch (cv::Exception & e)
	{
		cerr << "Exception: " << e.code << endl;
		cerr << e.file << " - " << e.line << endl;
		cerr << e.func << endl;
		cerr << e.err << endl;
	}
	return 0;
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다