카테고리 없음

Tello Camera Calibration

Wood Pecker 2021. 9. 1. 20:12

1. 개요

Tello를 이용하여 영상처리를 하는 경우 카메라의 파라미터를 알아야 하는 경우가 생긴다. 이때 체스보드 이미지를 이용하여 카메라의 파라미터를 계산하여 본다. OpenCV에서 제공하는 함수를 이용하자.

 

  1. 필요한 카메라 파라미터는 다음과 같다.

3. 체스보드 이미지를 출력하고 단단한 표면위에 붙여준다.

4. 컴에서 Tello 와이파이에 연결하고 텔로에서 보내오는 체스보드 영상 이미지를 처리하여 파라미터를 알아낸다.

## Tello Camera Calibration
import socket
import cv2
import numpy as np
import matplotlib.pyplot as plt

if __name__ == "__main__":
    tello_ip = '192.168.10.1'
    tello_port = 8889
    tello_address = (tello_ip, tello_port)
    mypc_address = ("0.0.0.0", tello_port)
    socket = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
    socket.bind (mypc_address)

    socket.sendto ('command'.encode (' utf-8 '), tello_address)
    socket.sendto ('streamon'.encode (' utf-8 '), tello_address)
    print ("Start streaming")

    capture = cv2.VideoCapture ('udp://0.0.0.0:11111',cv2.CAP_FFMPEG)
    if not capture.isOpened():
        capture.open('udp://0.0.0.0:11111')

    count =0
    delay=0
    objpoints = [] #  3d point in real world space
    imgpoints = [] #  2d points in image plane.
    objp = np.zeros((7*4,3),np.float32)
    objp[:,:2] = np.mgrid[0:7,0:4].T.reshape(-1,2)
    criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30 ,0.001)

    while True:
        if count<=10:
            print("count=",count, "  delay=",delay)
        ret, frame =capture.read()

        if not ret:
            cv2.waitKey(10)
            continue
        #### frame = cv2.resize(frame, dsize=(640, 480), interpolation=cv2.INTER_LINEAR)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        ret, corners = cv2.findChessboardCorners(gray, (7,4),None)
        if ret == True and count<10 and delay==0:
            objpoints.append(objp)
            corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
            imgpoints.append(corners2)
            cv2.imwrite("tello_capture" + str(count) + ".jpg", frame)
            cv2.drawChessboardCorners(gray,(7,4),corners2,ret)
            cv2.imshow('corners',gray)
            count= count+1
            delay = 100  # skip 100 frames for check board moving

        if(count==10):
            count=count+1
            rms, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
            newcameraMtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (7, 4), 1, (7, 4))
            h, w = frame.shape[:2]
            print("\n0. rms=", rms)
            print("\n1. mtx=", mtx)
            print("\n2. dist=", dist)
            print("\n3. newcameraMtx=", newcameraMtx)

        # show normal action (calibration is over)
        if count>10:
            cv2.imshow('normal action',frame)
        if cv2.waitKey (1)&0xFF == ord ('q'):
            break
        delay = delay -1
        if delay<0:
            delay =0

    capture.release ()
    cv2.destroyAllWindows ()
    socket.sendto ('streamoff'.encode (' utf-8 '), tello_address)
    pass

5. 다음은 Tello 카메라의 파라미터 이다.

rms = 0.597177  
fx = 922.837110  
fy = 922.837110  
cx = 480.000000  
cy = 360.000000  
k1 = -0.137695  
k2 = 0.330662  
p1 = -0.010519  
p2 = 0.005196
반응형