반응형
이번에 해보고자 하는 것은 두 개의 이미지를 가지고 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);
}
위 코드에 대한 결과 :
중간에 바뀌는 이미지를 보시면 두 이미지 사이를 오가면서 잘 구현된 것을 확인할 수 있습니다.
반응형
댓글