본문 바로가기

프로그래밍 강좌/C++ - OpenCV

[OpenCV][C++] 두 영상 이어 붙이기 총정리 - hconcat vconcat resize 바둑판 모양 image 원소 합치기

지난번에는 로고를 영상에 합성하는 방법에 대해 알아봤습니다.

https://blog.naver.com/dorergiverny/223051585864

 

[OpenCV][C++] 영상에 다른 영상 ( 로고 ) 삽입하기(2) - mask 생성, copyTo(), bitwise_and() 합성 합치기 두영

지난번엔 관심영역과 blending을 통한 영상 삽입에 대해 알아봤다면, https://m.blog.naver.com/dorergiver...

blog.naver.com

이번에는 영상을 이어 붙이는 방법에 대해 알아보겠습니다.

가로 이어 붙이기, 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;
}
 

두개의 순서를 바꾸시면 됩니다. 그럼 아래 그림 처럼 붙은 영상을 얻을 수 있습니다.