유용한 OpenCV 기능

전종원·2022년 10월 17일
0

1. 연산시간 측정 방법

영상처리 시스템에서는 각 단계에서 소요되는 연산 시간을 측정하고 오래걸리는 부분을 찾아 개선하는 최적화 작업이 필수적이다.

기본적인 연산시간 측정방법

int64 t1 = getTickCount()
my_func();

int64 t2 = getTickCount();

double ms = (t2 - t1) * 1000 / getTickFrequency();

연산시간 측정은 Release 모드에서 수행해야함!(g++ 의 경우 -O2 옵션 사용)

TickMeter 클래스

class TickMeter {

public:
	TickMeter(); //생성자
    
    void start(); // 시간측정을 시작할때 사용
    void stop(); //시간측정을 멈출 때 사용
    void reset(); //시간 측정을 초기화 할 때 사용
    
    double getTimeMicro() // 연산시간을 마이크로초 단위로 반환
    double getTimeMilli() // 연산시간을 밀리초 단위로 반환
    double getTimeSec() // 연산시간을 초 단위로 반환
}

TickMeter 클래스를 이용한 예제코드

TickMeter tm;
tm.start();

func1();

tm.stop();
cout << "func1():" << tm.getTimeMilli() << "ms." << endl;

tm.reset();

tm.start();

func2();

tm.stop();
cout << "func2():" << tm.getTimeMilli() << "ms." << endl;

2. 관심영역과 마스크 연산

관심영역(ROI)

  • Region Of Interest
  • 영상에서 연산을 수행하고자 하는 영역

마스크 연산

  • OpenCV는 일부 함수들에서 ROI 연산을 지원하며, 이때 마스크 영상을 인자로 함께 전달해야 함.
  • 마스크 영상은 CV_8UC1(그레이스케일) 타입
  • 마스크 영상의 픽셀값이 0이 아닌 위치에서만 연산이 수행됨
  • 보통 마스크영상으로는 0 혹은 255로 구성된 이진영상을 사용

마스크 연산을 지원하는 픽셀값 복사함수

void Mat::copyTo(InputArray m, InputArray mask) const;

//전역함수
void Mat::copyTo(InputArray src, OutputArray dst, InputArray mask);

실습코드


void MaskOp1();
void MaskOp2();

int main()
{
//	MaskOp1();
	MaskOp2();
}

void MaskOp1()
{
	Mat src = imread("airplane.bmp", IMREAD_COLOR);
	Mat mask = imread("mask_plane.bmp", IMREAD_GRAYSCALE);
	Mat dst = imread("field.bmp", IMREAD_COLOR);

	if (src.empty() || mask.empty() || dst.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	//copyTo(src, dst, mask);
	src.copyTo(dst, mask);

	imshow("src", src);
	imshow("dst", dst);
	imshow("mask", mask);
	waitKey();
	destroyAllWindows();
}

void MaskOp2()
{
	Mat src = imread("cat.bmp", IMREAD_COLOR);
	Mat logo = imread("opencv-logo-white.png", IMREAD_UNCHANGED);

	if (src.empty() || logo.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	vector<Mat> planes;
	split(logo, planes);

	Mat mask = planes[3];
	merge(vector<Mat>(planes.begin(), planes.begin() + 3), logo);
	Mat crop = src(Rect(10, 10, logo.cols, logo.rows));

	logo.copyTo(crop, mask);

	imshow("src", src);
	waitKey();
	destroyAllWindows();
}

3. 투명한 PNG 파일 합성하기

알파채널이 있는 PNG파일을 영상에 합성하기

위 코드 참고

0개의 댓글