1 cv2的安裝
??python下的opencv叫cv2,但是安裝cv2并不是直接pip install cv2,而是:
pip install opencv-python
??安裝完成后,就可以使用啦,
??
2 像素坐標去畸變
??對像素坐標去畸變要使用到cv2的undistortPoints()函式,其官方檔案點擊這里查看,如下圖所示:

??其中涉及的引數包括:
src:影像的像素坐標點集合,型別是np.ndarray,維度可以是N×1×2或者1×N×2
dst:輸出的去畸變結果,型別是np.ndarray,維度是N×1×2
cameraMatrix:如官方檔案所示,就是一個3×3的相機內參矩陣K,型別為np.ndarray
distCoeffs:畸變引數,排列順序為:k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]],其長度可以是4、5、8、12或14,型別為np.float32或者np.float64(注意,這里不能是np.ndarray,否則報錯)
R:雙目相機的校準才要用到,單目直接默認為單位陣即可
P:默認是單位陣,這樣輸出的結果為歸一化坐標點,數值很小(0.幾的級別),如果要獲得去畸變后的影像平面坐標,需要設定為相機的內參K
??雖然上述官方檔案里undistortPoints()函式的引數排列順序是:src, dst, cameraMatrix, distCoeffs, R, P,但是實際上,其引數排列順序是:src, cameraMatrix, distCoeffs[, dst[, R[, P]]],其中[ ]內的引數為可選引數,接收輸出的陣列dst可以直接通過等號進行賦值,而不一定需要提前建好然后丟進函式中,這些資訊在上圖的函式描述之后有個python行里有介紹,或者可以通過在python命令列下,輸入help(cv2.undistortPoints)查看,如下圖所示:

??好了,函式使用方法已經介紹差不多了,下面給一個完整的使用示例:
import numpy as np
import cv2 as cv
undistort_pts = cv.undistortPoints(pts, K, distCoeffs, P=K)
??其中,pts是輸入src,K是內參cameraMatrix,distCoeffs是畸變引數,最后的P=K是指定的相機矩陣,這樣將會獲得去畸變后的像素坐標點,需要特別指定是引數P,是因為該引數在函式介面中是排在最后一位的可選引數,而在它之前還有dst和R兩個引數,我們都沒有設定,所以我們需要指定引數名來進行賦值,如果沒有指定P,那么將輸出歸一化坐標點(數值很小,為0.幾的級別),undistort_pts是獲取到的輸出結果,
??
3 對影像去畸變
??影像去畸變和像素坐標去畸變大同小異,僅有輸入輸出的差別,對影像去畸變需要使用到undistort()函式,官方檔案的描述如下:

??引數的具體型別含義就不多介紹了,和上面是一樣的,只是其輸入輸出變成了影像矩陣,其中這個新的newCameraMatrix引數,其默認是和cameraMatrix一樣的,如果有平移縮放需要的話,則可以自己定義輸入,與像素坐標去畸變的引數P一樣,下面是一個示例:
import numpy as np
import cv2 as cv
K = np.zeros((3, 3))
K[0, 0] = 1201.58
K[1, 1] = 1201.72
K[0, 2] = 1019.59
K[1, 2] = 807.568
K[2, 2] = 1
distCoeffs = np.float32([-0.0911113, 0.0852054, 1.79509e-06, 0.000242446])
img = cv.imread('1.png')
img_undistored = cv.undistort(img, K, distCoeffs)
cv.imwrite('11.png', img_undistored)
??去畸變前后的影像如下圖所示:


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/392286.html
標籤:其他
