반응형
OPENCV 를 이용한 카메라 왜곡보정
카메라에서 촬영된 이미지의 왜곡 보정
왜곡 보정의 준비작업
카메라 캘리브레이션 결과물을 사용해서 핀홀 카메라 렌즈, 촬영 시점 등에 의해서 발생한 왜곡(distortion)을 보정해본다.
2022.06.16 - [프로그래밍/OpenCV] - [OPENCV] 카메라 캘리브레이션
OPENCV API 를 사용한 캘리브레이션을 통해 4가지 상수값을 구할 수 있었다.
- Camera matrix : intrinsic matrix, 3 by 3
- DistCoeffs : 렌즈 왜곡 계수(Lens distortion coefficients)
- Rotation vecter : vecter 의 방향은 회전 축을 나타내고, vecter 의 크기는 회전 각을 의미함
- Traslation vecter : 3×1 이동 벡터
cameraMatrix : [1419.673553625388, 0, 666.5701993152168;
0, 1415.434417595669, 284.9011670630352;
0, 0, 1]
distCoeffs : [-0.3779621578852622, -0.2007498881012056, 0.004339110290547984, 0.008265047579380602, 0.3210188752313808]
Rotation vector : [-0.04921945832888441, 0.09042061735983889, -0.01361057335763333;
0.1094626022511151, -0.2364625870132943, 0.01511276184908101;
-0.7561441242383266, -0.0191527714636694, -0.01635873679689486;
-0.1974511394522911, 0.317556005715105, 0.00806347329801513;
-0.01648285582559398, -0.4071043497289479, -0.0004094631477898205]
Translation vector : [-9.288717016952614, -2.924750005078209, 30.77031491782794;
-7.520929633143403, -2.737341461240362, 22.08581450740244;
-9.32667316529024, -1.038393033132518, 35.11557599377031;
-6.781851248836779, -2.790762349622213, 32.77846233201987;
-10.19296762260887, -2.866343503694881, 32.372707988489]
테스트환경
테스트를 위한 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 설치하기
C++ 로 작성된 OpenCV 코드는 makepluscode github 를 참고한다.
https://github.com/makepluscode/opencv-examples/tree/master/008-camera-rectify
OpenCV CMake 작성
다음과 같이 CMakeLists.txt 를 작성한다.
cmake_minimum_required(VERSION 3.0)
project(camera_rectification)
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}
)
OpenCV 예제 코드 작성
다음과 같이 코드를 작성한다.
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
double cameraMatrixValue[] = {
1419.673553625388, 0., 666.5701993152168,
0., 1415.434417595669, 284.9011670630352,
0., 0., 1.
};
double distCoeffsValue[] = {-0.3779621578852622, -0.2007498881012056, 0.004339110290547984, 0.008265047579380602, 0.3210188752313808};
Mat cameraMatrix(3, 3, CV_64FC1, cameraMatrixValue);
Mat distCoeffs(1, 5, CV_64FC1, distCoeffsValue);
int main()
{
Mat frame1 = imread("./images/img.jpg");
Mat frame2;
Mat map1, map2;
Size imageSize=Size(800,600);
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(), cameraMatrix, imageSize, CV_32FC1, map1, map2);
remap(frame1, frame2, map1, map2, INTER_LINEAR);
imshow("Original Image", frame1);
imshow("Rectified Image", frame2);
waitKey(0);
return 0;
}
위 예제 코드의 간단한 설명은 다음과 같다.
- 이전 글에서 캘리브레이션을 통해 구한 결과값으로 cameraMatrix 와 distCoeffs 매트릭스를 생성한다.
- imread 함수를 사용하여 img.jpg 파일을 읽어온다.
- initUndistortRectifyMap 함수를 사용하여, cameraMatrix, distCoeffs 을 입력으로 주고, 왜곡에 대한 매트릭스를 구한다.
- 왜곡에 대한 매트릭스를 참고하여 remap 함수를 사용하여 원본 이미지를 보정한다.
실행결과
cmake 명령어를 통해 예제를 컴파일하고 실행한다. 다음 실행 결과를 보면, 원본(좌측)이 remap 을 통해서 보정(우측) 되었다. 세로선을 그어보면 CheckerBoard 가 정렬되어 있음을 볼 수 있다.
참고자료
전체 코드는 makepluscode github 를 참고한다.
반응형
'프로그래밍 > OpenCV' 카테고리의 다른 글
OpenCV 카메라 FPS 구하는 예제 코드 (0) | 2022.11.04 |
---|---|
opencv4nodejs 을 이용한 개발환경 구축 (0) | 2022.11.03 |
[OPENCV] 카메라 캘리브레이션 (0) | 2022.06.16 |
[OPENCV] SGBM vs StereoBM 깊이맵 결과 비교 (1) | 2022.06.15 |
[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 |