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

[OPENCV] 카메라 이미지 왜곡보정

by makepluscode 2022. 6. 18.
반응형

OPENCV 를 이용한 카메라 왜곡보정

카메라에서 촬영된 이미지의 왜곡 보정

왜곡 보정의 준비작업

카메라 캘리브레이션 결과물을 사용해서 핀홀 카메라 렌즈, 촬영 시점 등에 의해서 발생한 왜곡(distortion)을 보정해본다.

2022.06.16 - [프로그래밍/OpenCV] - [OPENCV] 카메라 캘리브레이션

 

[OPENCV] 카메라 캘리브레이션

OPENCV 를 이용한 카메라 캘리브레이션 이 글의 대부분의 내용과 코드는 OpenCV 의 Satya Mallick CEO 포스팅을 참고 하였다. (아래링크) https://learnopencv.com/camera-calibration-using-opencv/ Camera Cali..

makepluscode.tistory.com

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 설치하기

 

[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

C++ 로 작성된 OpenCV 코드는 makepluscode github 를 참고한다.

https://github.com/makepluscode/opencv-examples/tree/master/008-camera-rectify

 

GitHub - makepluscode/opencv-examples

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

github.com

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;
}

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

  1. 이전 글에서 캘리브레이션을 통해 구한 결과값으로 cameraMatrix 와 distCoeffs 매트릭스를 생성한다.
  2. imread 함수를 사용하여 img.jpg 파일을 읽어온다.
  3. initUndistortRectifyMap 함수를 사용하여, cameraMatrix, distCoeffs 을 입력으로 주고, 왜곡에 대한 매트릭스를 구한다.
  4. 왜곡에 대한 매트릭스를 참고하여 remap 함수를 사용하여 원본 이미지를 보정한다.

실행결과

cmake 명령어를 통해 예제를 컴파일하고 실행한다. 다음 실행 결과를 보면, 원본(좌측)이 remap 을 통해서 보정(우측) 되었다. 세로선을 그어보면 CheckerBoard 가 정렬되어 있음을 볼 수 있다.

참고자료

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

https://github.com/makepluscode/opencv-examples

 

GitHub - makepluscode/opencv-examples

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

github.com

반응형