지난번에는 로고를 영상에 합성하는 방법에 대해 알아봤습니다.
https://blog.naver.com/dorergiverny/223051585864
이번에는 영상을 이어 붙이는 방법에 대해 알아보겠습니다.
가로 이어 붙이기, hconcat()
두 영상을 가로로 이어 붙이려면 두 영상의 높이가 같아야 합니다.
저는 이번에 사이즈가 다른 두 영상을 준비했습니다.
lena 영상은 512x512 이고, JK농원 영상은 295x230 사이즈 입니다.
이 두 영상을 가로로 붙여 보겠습니다.
일단 높이가 같아야 겠죠? cv::resize()를 사용하여 높이만 맞추고 가로로 붙여 볼께요.
1. 두 영상 읽기
일단 두 영상을 읽어 옵니다.
cv::Mat lena_gray = cv::imread("./lena_gray.bmp", cv::IMREAD_UNCHANGED);
cv::Mat JK_org = cv::imread("./JKGarden_1.bmp", cv::IMREAD_GRAYSCALE);
2. 영상 높이 맞추기
JK_org 영상의 높이를 cv::resize()를 이용하여 lena_gray와 동일하게 맞춥니다.
JK_resized 영상의 높이를 lena_gray의 높이(lena_gray.rows)로 세팅하면 됩니다.
cv::Mat JK_resized;
cv::resize(JK_org, JK_resized, cv::Size(JK_org.cols, lena_gray.rows));
3. 두 영상 이어 붙이기
cv::hconcat()으로 두 영상을 이어 붙입니다.
cv::Mat hor_resized;
cv::hconcat(lena_gray, JK_resized, hor_resized);
전체 소스는 아래와 같습니다.
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat lena_gray = cv::imread("./lena_gray.bmp", cv::IMREAD_UNCHANGED);
cv::Mat JK_org = cv::imread("./JKGarden_1.bmp", cv::IMREAD_GRAYSCALE);
cv::Mat JK_resized;
cv::Mat hor_resized;
cv::resize(JK_org, JK_resized, cv::Size(JK_org.cols, lena_gray.rows));
cv::hconcat(lena_gray, JK_resized, hor_resized);
return 0;
}
결과 영상입니다.
세로로 이어 붙이기, vconcat()
이번엔 두 영상을 세로로 이어 붙여 보겠습니다.
위와 같은 방식으로 하면, 전체 소스는 아래와 같습니다.
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat lena_gray = cv::imread("./lena_gray.bmp", cv::IMREAD_UNCHANGED);
cv::Mat JK_org = cv::imread("./JKGarden_1.bmp", cv::IMREAD_GRAYSCALE);
cv::Mat JK_resized;
cv::Mat ver_resized;
cv::resize(JK_org, JK_resized, cv::Size(lena_gray.cols, JK_org.rows));
cv::vconcat(lena_gray, JK_resized, ver_resized);
return 0;
}
바둑판 모양으로 이어 붙이기, hconcat() + vconcat()
hconcat()과 vconcat()을 혼합하여 사용하면 바둑판 모양으로 영상을 붙일 수 있습니다.
아래 소스처럼 JK_resized 영상을 lena_gray 영상과 width, height를 똑같게 cv::resize() 한 이후 vconcat()과 hconcat()을 사용하면 됩니다.
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat lena_gray = cv::imread("./lena_gray.bmp", cv::IMREAD_UNCHANGED);
cv::Mat JK_org = cv::imread("./JKGarden_1.bmp", cv::IMREAD_GRAYSCALE);
cv::Mat JK_resized;
cv::Mat hor, ver;
cv::resize(JK_org, JK_resized, cv::Size(lena_gray.cols, lena_gray.rows));
cv::vconcat(lena_gray, JK_resized, ver);
cv::hconcat(ver, ver, hor);
return 0;
}
만약에 lena 영상이 왼쪽에 위치하고 JK농원 로고 영상이 오른쪽에 위치하게 하고 싶으면,
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat lena_gray = cv::imread("./lena_gray.bmp", cv::IMREAD_UNCHANGED);
cv::Mat JK_org = cv::imread("./JKGarden_1.bmp", cv::IMREAD_GRAYSCALE);
cv::Mat JK_resized;
cv::Mat hor, ver;
cv::resize(JK_org, JK_resized, cv::Size(lena_gray.cols, lena_gray.rows));
cv::hconcat(lena_gray, JK_resized, hor);
cv::vconcat(hor, hor, ver);
return 0;
}
두개의 순서를 바꾸시면 됩니다. 그럼 아래 그림 처럼 붙은 영상을 얻을 수 있습니다.
제가 cv::Mat 원소 접근 방법에 대한 속도 측정을 하면서 lena 영상을 여러개 붙여가며 사이즈 큰 영상을 만들었는데 그 때에도 vconcat()과 hconcat()을 사용하였습니다.