본문 바로가기
프로그래밍/OpenCV

[OPENCV] SGBM vs StereoBM 깊이맵 결과 비교

by makepluscode 2022. 6. 15.
반응형

OPENCV StereoBM & SGBM 깊이맵 결과 비교

스테레오 이미지의 StereoBM & SGBM 예제

테스트환경

테스트를 위한 Host PC 에는 우분투 Ubuntu 18.04  와 OpenCV 4.2.0 가 설치되어 있다. OpenCV 4.2.0 설치는 아래 포스팅을 참고한다.

2022.06.10 - [프로그래밍/OpenCV] - [OPENCV] Ubuntu 18.04 OpenCV 4.2.0 설치하기

 

[OPENCV] Ubuntu 18.04 OpenCV 4.2.0 설치하기

Ubuntu 18.04 OpenCV 4.2.0 설치하기 OpenCV (Open Source Computer Vision)은 컴퓨터비전 개발을 위한 오픈소스 라이브러리이다. 초기에는 인텔이 개발하였기 때문에, CPU에서 가속되는 IPP(Intel Performa..

makepluscode.tistory.com

OPENCV 스테레오 카메라 StereoBM 예제는 아래 포스팅을 참고한다.

2022.06.12 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 카메라 StereoBM 예제 첫번째

 

[OPENCV] 스테레오 카메라 StereoBM 예제 첫번째

OPENCV 스테레오 카메라 StereoBM 예제 OpenCV 를 이용한 스테레오 이미지의 StereoBM 예제 테스트환경 테스트를 위한 Host PC 에는 우분투 Ubuntu 18.04  와 OpenCV 4.2.0 가 설치되어 있다. OpenCV 4.2.0 설..

makepluscode.tistory.com

OpenCV CMake 작성

다음과 같이 CMakeLists.txt 를 작성한다.

cmake_minimum_required(VERSION 3.0)

project(streobm)

find_package(OpenCV REQUIRED)

set(
    CMAKE_RUNTIME_OUTPUT_DIRECTORY
    ${CMAKE_HOME_DIRECTORY}
)

add_executable(
    ${PROJECT_NAME}
    src/main.cpp
)

target_include_directories(
    ${PROJECT_NAME}
 PRIVATE 
    ${OpenCV_INCLUDE_DIRS}
)

target_link_libraries(
    ${PROJECT_NAME}
    ${OpenCV_LIBRARIES}
)

message ("OpenCV_LIBRARIES = " ${OpenCV_LIBRARIES})
message ("OpenCV_INCLUDE_DIRS = " ${OpenCV_INCLUDE_DIRS})

OpenCV 예제 코드 작성

다음과 같이 코드를 작성한다.

#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>

using namespace cv;
using namespace std;

//#define CUSTOM_IMAGE
//#define SGBM

int main()
{
    cout << "opencv version : " << CV_VERSION << endl;

    // read 2 images (as 8UC1)
    Mat imgl, imgr;
    Mat img1, img2;

#ifdef CUSTOM_IMAGE
    imgl = imread("./img/left14_cal.jpg", IMREAD_GRAYSCALE );
    imgr = imread("./img/right14_cal.jpg", IMREAD_GRAYSCALE );

    resize(imgl, img1, Size(960,540));
    resize(imgr, img2, Size(960,540));
#else
    img1 = imread("./img/tsukuba_l.png", IMREAD_GRAYSCALE );
    img2 = imread("./img/tsukuba_r.png", IMREAD_GRAYSCALE );
#endif

    // stereo image
    Mat img_disparity_16s, img_disparity_8u;

#ifdef SGBM
    int min_disparities = 0;
    int num_disparities = 16;
    int blocksize = 15;

    cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create(min_disparities, num_disparities, blocksize);
    sgbm->setMode(cv::StereoSGBM::MODE_SGBM_3WAY);
    sgbm->compute(img1, img2, img_disparity_16s);
#else
    int num_disparities = 16;
    int blocksize = 15;

    cv::Ptr<cv::StereoBM> stereo = cv::StereoBM::create(num_disparities, blocksize);
    stereo->compute(img1, img2, img_disparity_16s);
#endif


#ifndef NORMALIZE_MANUAL
    // normalize img_disparity_16s manually
    double minVal; double maxVal;
    minMaxLoc( img_disparity_16s, &minVal, &maxVal );
    cout << "min : " << minVal << ", max : " << maxVal << endl;
    img_disparity_16s.convertTo(img_disparity_8u, CV_8UC1, 255/(maxVal - minVal));
#else
    normalize(img_disparity_16s, img_disparity_8u, 0, 255, CV_MINMAX, CV_8U);
#endif
    // normalize img_disparity_16s with opencv api
    imshow("left", img1);
    imshow("right", img2);    
    imshow("disparity", img_disparity_8u);

    waitKey(0);

    return 0;
}

위 예제 코드의 간단한 설명은 다음과 같다.

 

실행결과

StereoBM 의 결과 (num_disparities 16, blocksize 11)

SGBM 의 결과 (min_disparities 0, num_disparities 16, blocksize 15)

실행결과 분석

  • SGBM 의 성능이 StereoBM 보다 좋은 것으로 나타난다.
  • SGBM 의 처리 시간이 StereoBM 보다 오래 걸린다. (추후, 자세한 비교 분석 필요)
  • Custom 이미지로 할 경우 결과가 좋지 못하다. (촬영 이미지의 Calibration or Retification 문제로 예상)

참고자료

전체 코드는 makepluscode github 를 참고한다.

https://github.com/makepluscode/opencv-examples/tree/master/005-stereobm-ex2

 

GitHub - makepluscode/opencv-examples

Contribute to makepluscode/opencv-examples development by creating an account on GitHub.

github.com

반응형