一、概述
cv2.findChessboardCorners()函數是OpenCV中的一個函數,用於找到棋盤格的所有內角點,返回所有檢測到的內角點的2D坐標。通常用於攝像機校準和3D重建。
二、使用方法
1.函數定義
cv2.findChessboardCorners(image, patternSize[, corners[, flags]])
- image:輸入的單通道8位或32位浮點數圖像。
- patternSize:內角點的規模(x方向內角點數,y方向內角點數)。
- corners:如果opencv能夠找到內角點,則返回內角點坐標數組。
- flags:用於指示應用哪些變換。通常使用DEFAULTS,這意味着使用適當的變換來提高查找結果的抗噪性。
2.示例代碼
import cv2 import numpy as np img = cv2.imread('chessboard.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 確定棋盤格內部角點的數量 patternSize = (9,6) # 在圖像中尋找棋盤格角點 ret, corners = cv2.findChessboardCorners(gray, patternSize) # 如果找到了角點則繪製它們 if ret == True: corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001)) img = cv2.drawChessboardCorners(img, patternSize, corners2,ret) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()
三、函數詳解
1.獲取棋盤格
在使用cv2.findChessboardCorners()函數之前,需要先獲取輸入圖像中的棋盤格標準圖像。具體步驟如下:
import cv2 import numpy as np img = cv2.imread('chessboard.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) patternSize=(9,6) # 使用findChessboardCorners()函數來找到內部角落 ret, corners = cv2.findChessboardCorners(gray, patternSize) if ret == True: corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001)) img = cv2.drawChessboardCorners(img, patternSize, corners2,ret) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()
上述代碼使用cv2.findChessboardCorners()函數查找棋盤格的內角點,並將其繪製在輸入圖像上。注意:在繪製之前,使用cv2.cornerSubPix()函數對內角點進行了修正,以提高精度。
2.尋找內角點
cv2.findChessboardCorners()函數的第一個參數是輸入圖像,第二個參數是棋盤格內部角點的數量。返回值是一個布爾值和一個坐標數組。
如果cv2.findChessboardCorners()能夠找到所有的內部角點,則返回的布爾值為True,角點坐標存儲在corners數組中。否則返回False。
例如,在我們的示例中,棋盤格有9個內角點是橫向的,6個內角點是縱向的。
# 確定棋盤格內部角點的數量 patternSize = (9,6) # 在圖像中尋找棋盤格角點 ret, corners = cv2.findChessboardCorners(gray, patternSize)
3.細化檢測結果
為了提高檢測結果的精度,通常需要對cv2.findChessboardCorners()返回的角點坐標進行細化。可以使用cv2.cornerSubPix()函數進行修正,修正後的坐標存儲在corners2數組中。以下是代碼示例:
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,30,0.001))
其中,cv2.cornerSubPix()函數包含以下參數:
- image:輸入圖像
- corners:輸入的角點
- windownSize:搜索窗口大小
- zeroZone:死區;在窗口中心和窗口邊緣之間,要排除的區域。
- criteria:找到每個角點的最大迭代次數和迭代停止條件的精度。這是一個元組,具有以下格式:(type, max_iter, epsilon),其中type是終止的類型(cv2.TERM_CRITERIA_EPS或cv2.TERM_CRITERIA_MAX_ITER)。
4.繪製棋盤格內角點
一旦所有內角點被找到並細化了,便可以使用cv2.drawChessboardCorners()函數將它們繪製在輸入圖像上。
img = cv2.drawChessboardCorners(img, patternSize, corners2,ret) cv2.imshow('img',img) cv2.waitKey(0)
四、注意事項
使用cv2.findChessboardCorners()函數時,請注意以下幾點:
- 人工製作的棋盤格必須保持完美的水平/垂直狀態。
- 找到的角點必須按照預期的方式排序
- 如果內部角點不能被精確地識別,那麼結果將不準確
五、總結
本文對OpenCV中的cv2.findChessboardCorners()函數進行了詳細解釋。這是一個有效的函數,可用於校準相機、在線重建等應用。只要按照正確的步驟進行操作,你就可以輕鬆地找到棋盤格中的內角點。
原創文章,作者:IGVW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/145153.html