Camera Calibration

จาก Morange Wiki

วัตถุประสงค์

  • เราจะได้เรียนรู้เกี่ยวกับการบิดเบือนในกล้องพารามิเตอร์ภายในและภายนอกของกล้อง ฯลฯ
  • เราจะได้เรียนรู้ที่จะหาพารามิเตอร์เหล่านี้ undistort ภาพ ฯลฯ


ข้อมูลพื้นฐาน
เนื่องจากการบิดเบือนรัศมีเส้นตรงจะปรากฏโค้ง ผลของมันมีมากขึ้นในขณะที่เราย้ายออกไปจากศูนย์กลางของภาพ ยกตัวอย่างเช่นภาพหนึ่งภาพที่แสดงด้านล่างซึ่งทั้งสองขอบของกระดานหมากรุกถูกทำเครื่องหมายด้วยเส้นสีแดง แต่คุณสามารถดูชายแดนที่ไม่ได้เป็นเส้นตรงและไม่ตรงกับสายสีแดง ทั้งหมดที่คาดว่าเส้นตรงจะโป่งออก เยี่ยมชมเพี้ยน (เลนส์) สำหรับรายละเอียดเพิ่มเติม

Calib radial.jpg

การผิดเพี้ยนนี้จะแสดงเป็นดังนี้

Selection 038.jpg


ในทำนองเดียวกันการบิดเบือนอีกอย่างก็คือบิดเบือนวงที่เกิดขึ้นเนื่องจากการภาพฝาไม่ได้สอดคล้องอย่างสมบูรณ์แบบคู่ขนานกับระนาบการถ่ายภาพ ดังนั้นบางพื้นที่ในภาพอาจจะดูใกล้กว่าที่คาดไว้ มันเป็นตัวแทนดังต่อไปนี้

Selection 039.jpg


ในระยะสั้นเราต้องไปหาห้าพารามิเตอร์หรือที่เรียกว่าค่าสัมประสิทธิ์การบิดเบือนที่กำหนดโดย

Selection 041.jpg


Distortioncoefficients = (k1k2p1p2k3)
นอกจากนี้เราต้องไปหาข้อมูลเพิ่มเติมไม่กี่เช่นพารามิเตอร์ภายในและภายนอกของกล้อง พารามิเตอร์ที่แท้จริงมีเฉพาะกล้อง ซึ่งจะรวมถึงข้อมูลเช่นความยาวโฟกัส (FX, FY) ศูนย์ออปติคอล (CX, CY) เป็นต้นนอกจากนี้ยังเรียกกล้องเมทริกซ์ มันขึ้นอยู่กับกล้องคำนวณเท่านั้นดังนั้นครั้งเดียวก็สามารถเก็บไว้เพื่อวัตถุประสงค์ในอนาคต โดยจะแสดงเป็นเมทริกซ์ 3x3

Selection 040.jpg


พารามิเตอร์ภายนอกสอดคล้องกับการหมุนและการแปลเวกเตอร์ซึ่งแปลพิกัดของจุด 3 มิติไปยังระบบพิกัด
สำหรับการใช้งานแบบสเตอริโอบิดเบือนเหล่านี้จะต้องมีการแก้ไขครั้งแรก เพื่อหาพารามิเตอร์ทั้งหมดเหล่านี้สิ่งที่เราต้องทำคือการให้ภาพตัวอย่างบางส่วนของรูปแบบที่กำหนดไว้อย่างดี (เช่นกระดานหมากรุก) เราจะพบจุดที่เฉพาะเจาะจงบางอย่างในนั้น (ตารางมุมในกระดานหมากรุก) เรารู้พิกัดในพื้นที่โลกแห่งความจริงและเรารู้พิกัดในภาพ กับข้อมูลเหล่านี้บางปัญหาทางคณิตศาสตร์ที่จะแก้ไขในพื้นหลังที่จะได้รับค่าสัมประสิทธิ์การบิดเบือน นั่นคือบทสรุปของเรื่องราวทั้งหมด เพื่อให้ได้ผลลัพธ์ที่ดีกว่าที่เราต้องการอย่างน้อย 10 รูปแบบการทดสอบ

โค๊ด
แปลภาษา ปิดการแปลแบบทันที ดังกล่าวข้างต้นที่เราต้องการอย่างน้อย 10 รูปแบบการทดสอบสำหรับการสอบเทียบกล้อง OpenCV มาพร้อมกับภาพบางส่วนของกระดานหมากรุก (ดูตัวอย่าง / CPP / left01.jpg - left14.jpg) ดังนั้นเราจะใช้มัน เพื่อประโยชน์ในการทำความเข้าใจการพิจารณาเพียงหนึ่งภาพของกระดานหมากรุก ข้อมูลการป้อนข้อมูลที่สำคัญที่จำเป็นสำหรับการสอบเทียบกล้องเป็นชุดของจุด 3D โลกแห่งความจริงและจุดภาพที่สอดคล้องกัน 2D ของมัน จุดภาพ 2D ตกลงที่เราสามารถหาได้ง่ายจากภาพ (จุดเหล่านี้เป็นภาพสถานที่ที่สองสี่เหลี่ยมสีดำสัมผัสกันในกระดานหมากรุก)

สิ่งที่เกี่ยวกับจุด 3 มิติจากพื้นที่โลกแห่งความจริง? ภาพเหล่านั้นจะถูกนำมาจากกล้องแบบคงที่และหมากรุกกระดานจะถูกวางไว้ในสถานที่ที่แตกต่างกันและการหมุน ดังนั้นเราจึงจำเป็นต้องรู้ (X, Y, Z) ค่า แต่สำหรับความเรียบง่ายที่เราสามารถพูดกระดานหมากรุกถูกเก็บไว้นิ่งในระนาบ xy (ดังนั้น Z = 0 เ​​สมอ) และกล้องถูกย้ายตาม พิจารณานี้ช่วยให้เราพบเพียง X, Y ค่า ตอนนี้สำหรับ X, Y ค่าเราก็สามารถผ่านจุดเป็น (0,0), (1,0), (2,0) ... ซึ่งหมายถึงสถานที่ตั้งของจุด ในกรณีนี้ผลที่เราได้รับจะอยู่ในระดับของขนาดของตารางกระดานหมากรุก แต่ถ้าเราทราบขนาดตาราง (พูด 30 มิลลิเมตร) และเราสามารถส่งผ่านค่าเป็น (0,0), (30,0), (60,0), ... , เราได้รับผลในมม (ในกรณีนี้เราไม่ทราบขนาดตารางเนื่องจากเราไม่ได้เอาภาพเหล่านั้นเพื่อให้เราผ่านในแง่ของขนาดตารา

Setup
เพื่อที่จะหารูปแบบในกระดานหมากรุกเราจะใช้ฟังก์ชั่น cv2.findChessboardCorners () นอกจากนี้เรายังจะต้องผ่านสิ่งที่ชนิดของรูปแบบที่เรากำลังมองหาเช่นตาราง 8x8, 5x5 ตาราง ฯลฯ ในตัวอย่างนี้เราจะใช้ตาราง 7x6 (โดยปกติกระดานหมากรุกมีสี่เหลี่ยม 8x8 และมุมภายใน 7x7) ก็จะส่งกลับจุดมุมและ retval ซึ่งจะเป็นจริงถ้ารูปแบบจะได้รับ มุมเหล่านี้จะถูกวางไว้ในลำดับ (จากซ้ายไปขวาบนลงล่าง)

 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*7,3), np.float32)
 objp[:,:2] = np.mgrid[0:7,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.
 
 images = glob.glob('*.jpg')
 
 for fname in images:
     img = cv2.imread(fname)
     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
     # Find the chess board corners
     ret, corners = cv2.findChessboardCorners(gray, (7,6), None)
 
     # If found, add object points, image points (after refining them)
     if ret == True:
         objpoints.append(objp)
 
         corners2=cv2.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria)
         imgpoints.append(corners)
 
         # Draw and display the corners
         cv2.drawChessboardCorners(img, (7,6), corners2, ret)
         cv2.imshow('img', img)
         cv2.waitKey(500)
 
 cv2.destroyAllWindows()
Selection 042.jpg