Camera Calibration
วัตถุประสงค์
- เราจะได้เรียนรู้เกี่ยวกับการบิดเบือนในกล้องพารามิเตอร์ภายในและภายนอกของกล้อง ฯลฯ
- เราจะได้เรียนรู้ที่จะหาพารามิเตอร์เหล่านี้ undistort ภาพ ฯลฯ
ข้อมูลพื้นฐาน
เนื่องจากการบิดเบือนรัศมีเส้นตรงจะปรากฏโค้ง ผลของมันมีมากขึ้นในขณะที่เราย้ายออกไปจากศูนย์กลางของภาพ ยกตัวอย่างเช่นภาพหนึ่งภาพที่แสดงด้านล่างซึ่งทั้งสองขอบของกระดานหมากรุกถูกทำเครื่องหมายด้วยเส้นสีแดง แต่คุณสามารถดูชายแดนที่ไม่ได้เป็นเส้นตรงและไม่ตรงกับสายสีแดง ทั้งหมดที่คาดว่าเส้นตรงจะโป่งออก เยี่ยมชมเพี้ยน (เลนส์) สำหรับรายละเอียดเพิ่มเติม
การผิดเพี้ยนนี้จะแสดงเป็นดังนี้
ในทำนองเดียวกันการบิดเบือนอีกอย่างก็คือบิดเบือนวงที่เกิดขึ้นเนื่องจากการภาพฝาไม่ได้สอดคล้องอย่างสมบูรณ์แบบคู่ขนานกับระนาบการถ่ายภาพ ดังนั้นบางพื้นที่ในภาพอาจจะดูใกล้กว่าที่คาดไว้ มันเป็นตัวแทนดังต่อไปนี้
ในระยะสั้นเราต้องไปหาห้าพารามิเตอร์หรือที่เรียกว่าค่าสัมประสิทธิ์การบิดเบือนที่กำหนดโดย
Distortioncoefficients = (k1k2p1p2k3)
นอกจากนี้เราต้องไปหาข้อมูลเพิ่มเติมไม่กี่เช่นพารามิเตอร์ภายในและภายนอกของกล้อง พารามิเตอร์ที่แท้จริงมีเฉพาะกล้อง ซึ่งจะรวมถึงข้อมูลเช่นความยาวโฟกัส (FX, FY) ศูนย์ออปติคอล (CX, CY) เป็นต้นนอกจากนี้ยังเรียกกล้องเมทริกซ์ มันขึ้นอยู่กับกล้องคำนวณเท่านั้นดังนั้นครั้งเดียวก็สามารถเก็บไว้เพื่อวัตถุประสงค์ในอนาคต โดยจะแสดงเป็นเมทริกซ์ 3x3
พารามิเตอร์ภายนอกสอดคล้องกับการหมุนและการแปลเวกเตอร์ซึ่งแปลพิกัดของจุด 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()