카테고리 없음
Tello Camera Calibration
Wood Pecker
2021. 9. 1. 20:12
1. 개요
Tello를 이용하여 영상처리를 하는 경우 카메라의 파라미터를 알아야 하는 경우가 생긴다. 이때 체스보드 이미지를 이용하여 카메라의 파라미터를 계산하여 본다. OpenCV에서 제공하는 함수를 이용하자.
- 필요한 카메라 파라미터는 다음과 같다.
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
반응형