본문 바로가기
IT

[openCV / C++] 사진 교차해서 영상 만들기

by 배애앰이 좋아 2021. 1. 5.
반응형

 

이번에 해보고자 하는 것은 두 개의 이미지를 가지고 A이미지 -> B이미지 / B이미지 -> A이미지 로 서서히 변하면서 마치 영상을 만드는 듯한 기능을 구현해보겠습니다.

 

먼저, 두 개의 그림을 준비합니다.

 

 

만약 위 두개의 그림을 반반씩 합치면 아래와 같은 결과가 나옵니다.

 

 

이렇게 되면 수치상 A 그림 0.5 B 그림 0.5 해준 것인데 이것을 부드럽게 조정해주면 됩니다. 

A 1 B 0 -> A 0.9 B 0.1 -> A 0.8 B 0.2 이런식으로 가중치를 따르게 하여 합쳐주는 것입니다.

 

아래는 openCV 를 활용해서 C++로 구현한 코드

 

#include <stdio.h>
#include "opencv2/opencv.hpp"

int main(void)
{
	auto img = cvLoadImage("img\\cross1.jpg");
	auto img2 = cvLoadImage("img\\cross2.jpg");

	cvShowImage("img", img);
	cvShowImage("img2", img2);

	cvWaitKey();
	auto result = cvCreateImage(cvGetSize(img), 8, 3);

	int key = -1;
	double alpha = 0.0;
	double delta = 0.02;

	while (key < 0) {
		for (int i = 0; i < img->width; i++) {
			for (int j = 0; j < img->height; j++) {
				auto c1 = cvGet2D(img, j, i);
				auto c2 = cvGet2D(img2, j, i);
				CvScalar final_c;
				for (int k = 0; k < 3; k++) {
					final_c.val[k] = (1.0 - alpha) * c1.val[k] + alpha * c2.val[k];
				}
				cvSet2D(result, j, i, final_c);
			}
		}
		key = cvWaitKey(10);
		cvShowImage("result", result);
		if (alpha > 1) delta = -0.02;
		if (alpha < 0) delta = 0.02;
		alpha += delta;
	}

	cvDestroyAllWindows();
	cvReleaseImage(&img);
	cvReleaseImage(&img2);
}

 

위 코드에 대한 결과 : 

 

 

중간에 바뀌는 이미지를 보시면 두 이미지 사이를 오가면서 잘 구현된 것을 확인할 수 있습니다.

 

반응형

댓글