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
'프로그래밍 > 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 |