반응형
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 스테레오 카메라 StereoBM 예제는 아래 포스팅을 참고한다.
2022.06.12 - [프로그래밍/OpenCV] - [OPENCV] 스테레오 카메라 StereoBM 예제 첫번째
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
반응형
'프로그래밍 > OpenCV' 카테고리의 다른 글
OpenCV 카메라 FPS 구하는 예제 코드 (0) | 2022.11.04 |
---|---|
opencv4nodejs 을 이용한 개발환경 구축 (0) | 2022.11.03 |
[OPENCV] 카메라 이미지 왜곡보정 (0) | 2022.06.18 |
[OPENCV] 카메라 캘리브레이션 (0) | 2022.06.16 |
[OPENCV] 스테레오 깊이맵 성능 높이기 (0) | 2022.06.15 |
[OPENCV] GSTREAMER 를 이용한 이미지 캡처 (0) | 2022.06.13 |
[OPENCV] 스테레오 카메라 StereoBM 예제 첫번째 (0) | 2022.06.12 |
[OPENCV] Ubuntu 18.04 OpenCV 4.2.0 설치하기 (0) | 2022.06.10 |