Camera Calibration (with Python OpenCV)



카메라 보정에 대한 자세한 이론적 내용과 원본 소스코드는

https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html#calibration

를 참조하기 바랍니다.


간단하게만 설명하자면 카메라에 발생하는 공간적 광학적 왜곡에 대해

보정을 수행하는 과정입니다.


1. 체스보드 찾기


위 사이트에서 제공한 소스코드를 실행하면 에러를 발생하며 정상실행이 되지 않는다.

cv와 cv2 문법이 혼재되어 있어서 그런데

아마도 원 저자가 초기 내용을 cv2에 맞게 약간만 수정한 상태로 실제 코드 테스트를 못해본 것이 아닌가 생각된다.


원본 코드를 아래와 같이 수정하면 정상적으로 체스보드 찾기 동작이 수행된다.



import numpy as np

import cv2

import glob


# termination criteria

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)


# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)

objp = np.zeros((6*9,3), np.float32)

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)


# Arrays to store object points and image points from all the images.

objpoints = [] # 3d point in real world space

imgpoints = [] # 2d points in image plane.


#cv2.namedWindow('KnV')

images = glob.glob('*.jpg')


for fname in images:

    print fname

    img = cv2.imread(fname)

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)


    # Find the chess board corners

    ret, corners = cv2.findChessboardCorners(gray, (9,6),None)


    # If found, add object points, image points (after refining them)

    if ret == True:

        cv2.imshow('KnV',img)

        print corners

        cv2.waitKey(1000)

        

        objpoints.append(objp)


        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)

        imgpoints.append(corners)

        print corners


        # Draw and display the corners

        cv2.drawChessboardCorners(gray, (9,6), corners,ret)

        cv2.imshow('KnV',gray)

        cv2.waitKey()


cv2.destroyAllWindows()


부분적으로 몇가지만 다시 설명하면


images = glob.glob('*.jpg')


현재 디렉토리의 모든 jpg 확장자이미지를 읽어온다.




난 이런 이미지를 저장했다.


gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)


읽어들인 이미지 img 를 gray 라는 흑백영상으로 변환한다.


ret, corners = cv2.findChessboardCorners(gray, (9,6),None)


체스보드 판을 찾는 함수다.

그레이(흑백)영상에서 10x7 (9=10-1, 6=7-1) 체스보드를 찾는다.

메트릭스 크기가 다르면 체스보드를 못찾으니 정확하게 일치 시켜줘야 한다.

9번 10번 라인에 있는 objp 초기화도 마찬가지로 메트릭스 크기를 일치시켜준다.


    if ret == True:

        cv2.imshow('KnV',img)


체스보드를 찾으면 원본영상을 보여주도록 수정

16번 라인에 namedWindow를 생성하는 코드를 막아놨는데 있으나 없으나 무방하다.

없으면 자동으로 생성한다.


cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)


찾아진 코너에 대한 값을 보정해주는 함수이다.

cv.FindCornerSubPix

와 동일한 기능을 하며

corners는 input/output 기능을 하는 파라메터이다.

이 함수 전후로 corners 값을 찍어보면 값이 달라져 있음을 확인할 수 있다.


자세한 사항은 아래 링크 참조

http://docs.opencv.org/modules/imgproc/doc/feature_detection.html?highlight=cornersubpix#cv2.cornerSubPix


cv2.drawChessboardCorners(gray, (9,6), corners,ret)


체스보드에 찾은 코너를 표시하는(그리는) 함수

gray는 input/output 기능을 하는 파라메터이다.


자세한 사항은 아래 링크 참조

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#drawchessboardcorners




내가 얻은 최종 결과물은 위의 사진과 같다.

원본 글에는 라인이나 찾은 표시가 칼라풀하길래 좀더 테스트해보니

아래와 같이


cv2.drawChessboardCorners(img, (9,6), corners,ret)


드로잉 입력 이미지를 칼라로 교체하니 칼라로 드로잉이 된다. ㅎ~




최종 결과물은 칼라로 표시~ ^^


'ComputerVision' 카테고리의 다른 글

PyQt4 + OpenCV  (0) 2016.06.15
Find Chessboard in Live (with Python OpenCV)  (0) 2015.08.21
Python에서 OpenCV 사용하기  (0) 2015.08.01
C# 에서 OpenCV 사용하기  (0) 2015.07.24
EmguCV, OpenCVSharp 카메라 캡쳐 코드 비교  (0) 2015.07.24
Posted by 휘프노스
,