使用OpenCV校準魚眼鏡頭

2022-02-07 小白學視覺

收錄於話題 #OpenCV視覺實戰項目 61個

點擊上方「小白學視覺」,選擇加"星標"或「置頂

重磅乾貨,第一時間送達

當我們使用的魚眼鏡頭視角大於160°時,OpenCV中用於校準鏡頭「經典」方法的效果可能就不是和理想了。即使我們仔細遵循OpenCV文檔中的步驟,也可能會得到下面這個奇奇怪怪的照片:

如果小夥伴也遇到了類似情況,那麼這篇文章可能會對大家有一定的幫助。

從3.0版開始,OpenCV包含了cv2.fisheye可以很好地處理魚眼鏡頭校準的軟體包。但是,該模塊沒有針對讀者的相關的教程。

校準鏡頭其實只需要下面2個步驟。

計算K和D

import cv2assert cv2.__version__[0] == '3', 'The fisheye module requires opencv version >= 3.0.0'import numpy as npimport osimport globCHECKERBOARD = (6,9)subpix_criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)calibration_flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC+cv2.fisheye.CALIB_CHECK_COND+cv2.fisheye.CALIB_FIX_SKEWobjp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)_img_shape = Noneobjpoints = [] imgpoints = [] images = glob.glob('*.jpg')for fname in images:    img = cv2.imread(fname)    if _img_shape == None:        _img_shape = img.shape[:2]    else:        assert _img_shape == img.shape[:2], "All images must share the same size."    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)        ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)        if ret == True:        objpoints.append(objp)        cv2.cornerSubPix(gray,corners,(3,3),(-1,-1),subpix_criteria)        imgpoints.append(corners)N_OK = len(objpoints)K = np.zeros((3, 3))D = np.zeros((4, 1))rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]rms, _, _, _, _ = \    cv2.fisheye.calibrate(        objpoints,        imgpoints,        gray.shape[::-1],        K,        D,        rvecs,        tvecs,        calibration_flags,        (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)    )print("Found " + str(N_OK) + " valid images for calibration")print("DIM=" + str(_img_shape[::-1]))print("K=np.array(" + str(K.tolist()) + ")")print("D=np.array(" + str(D.tolist()) + ")")

運行python calibrate.py。如果一切順利,腳本將輸出如下內容:

Found 36 images for calibrationDIM=(1600, 1200)K=np.array([[781.3524863867165, 0.0, 794.7118000552183], [0.0, 779.5071163774452, 561.3314451453386], [0.0, 0.0, 1.0]])D=np.array([[-0.042595202508066574], [0.031307765215775184], [-0.04104704724832258], [0.015343014605793324]])

獲得K和D後,我們可以對以下情況獲得的圖像進行失真矯正:我們需要取消失真的圖像與校準期間捕獲的圖像具有相同的尺寸。也可以將邊緣周圍的某些區域裁剪掉,來保證使未失真圖像的整潔。通過undistort.py使用以下python代碼創建文件:

DIM=XXXK=np.array(YYY)D=np.array(ZZZ)def undistort(img_path):    img = cv2.imread(img_path)    h,w = img.shape[:2]    map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, DIM, cv2.CV_16SC2)    undistorted_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)    cv2.imshow("undistorted", undistorted_img)    cv2.waitKey(0)    cv2.destroyAllWindows()if __name__ == '__main__':    for p in sys.argv[1:]:        undistort(p)

現在運行python undistort.py file_to_undistort.jpg。

矯正前

矯正後

如果大家仔細觀察,可能會注意到一個問題:原始圖像中的大部分會在此過程中被裁剪掉。例如,圖像左側的橙色RC汽車只有一半的車輪保持在未變形的圖像中。實際上,原始圖像中約有30%的像素丟失了。小夥伴們可以思考思考如果我們想找回丟失的像素該這麼辦呢?

交流群

歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫學影像、GAN、算法競賽等微信群(以後會逐漸細分),請掃描下面微信號加群,備註:」暱稱+學校/公司+研究方向「,例如:」張三 + 上海交大 + 視覺SLAM「。請按照格式備註,否則不予通過。添加成功後會根據研究方向邀請進入相關微信群。請勿在群內發送廣告,否則會請出群,謝謝理解~


相關焦點

  • 魚眼鏡頭使用入門指南:魚眼鏡頭應該怎麼用(附後期魚眼效果)!
    使用魚眼鏡頭拍攝的照片可以獲得非常極寬的拍攝角度,通常是在180度。它們在風景,極限運動和藝術攝影中非常受歡迎。魚眼鏡頭提供了任何其他類型鏡頭無法提供的獨特創意視角。什麼是魚眼鏡頭魚眼鏡頭是廣角鏡頭中的一種,它的透視效果非常強,可以將直線扭曲成曲線。
  • 魚眼鏡頭有什麼使用技巧
    上圖是用魚眼鏡頭拍攝一次婚禮聚會,效果非常顯著。一般這種場景都是弱光環境,很難拍出精彩的照片。  使用魚眼鏡頭時要注意這一點:越接近畫面邊緣的線條,其變形就越大。  有時只是想拍攝較寬廣的場景。這時需要魚眼鏡頭,但是又不希望出現變形的線條。
  • 魚眼鏡頭特輯丨全景攝影中魚眼鏡頭的相關問題
    魚眼鏡頭在全景攝影中非常受歡迎,因為用魚眼鏡頭拍攝,你可以僅用幾張圖片(2到3張,通常是4-7張)就可以拼接合成為完整的全景圖,非常高效方便了。魚眼圖片的類型參考以下五個圖像:第一張圖片來自常規的直線廣角鏡頭;第二張圖片來自全畫幅魚眼鏡頭;第三張圖片來自全周魚眼鏡頭;第四張圖片來自縱向裁剪圓形魚眼鏡頭;第五張圖片來自對角裁剪圓形魚眼鏡頭;實際上,這些圖像都是使用全景工具和PS從球形全景圖中提取的。
  • 魚眼鏡頭設計的原理
    而魚眼鏡頭的思路就是來自於這種特點,當然其實同魚眼觀察水面以外物體的關係真的不大,只是體現的效果比較類似,畢竟這裡不存在水的折射率,只是鏡頭設計者研究了魚眼的結構,才搞出了有意思的魚眼鏡頭。魚眼鏡頭視角可以接近或者超過180度,對於135畫幅的相機來說,魚眼鏡頭的焦段多在6-16mm之間,視角一般都在170度左右,由於視角超大,因此其桶形彎曲畸變非常大,因此畫面周邊的直線都會被彎曲,只有鏡頭中心部分的直線可以保持原來的狀態。
  • 拍全景照片選魚眼鏡頭還是廣角鏡頭
    準確的說是全景是拍出來的,拍全景照片選魚眼鏡頭還是廣角鏡頭或是拍全景照片魚眼鏡頭好還是廣角鏡頭好呢?我們接下來就看看。那麼對於全景的拍攝來說眼鏡頭和廣角鏡頭都是可以的,這兩款鏡頭的視角都是很廣的,可以拍攝到一個很廣的場景。下面我們就來看看魚眼鏡頭和廣角鏡頭拍攝全景各有什麼好處。
  • 魚眼鏡頭拍攝全景圖的教程方法
    在360度全景圖拍攝的全過程中,魚眼鏡頭具有了尤為重要的功效,可以說魚眼鏡頭決策了大家拍攝360度全景的品質,今日小九就帶大家了解一下360度全景拍攝的實例教程:魚眼鏡頭拍攝全景圖片的教程方法。魚眼鏡頭問世於1924年,最開始稱之為「天空鏡頭」,由於那個時候這類鏡頭被專業用於紀錄天空中的氣候轉變,之後這種鏡頭的極近距離調焦工作能力和斜面眼鏡片的結構特點,給眾多的攝影愛好者產生了無窮無盡拍攝快樂,大伙兒親近的稱作為「魚眼」。假如你都還沒試過,確實應當搞一隻來感受一下。事實上,有兩大類不一樣的魚眼鏡頭。
  • 超廣角和魚眼鏡頭,該選擇哪一個?
    這兩天收到有會員提問,在糾結超廣角鏡頭和魚眼鏡頭的選擇,今天我們就這兩個鏡頭的特點給大家作一次簡單的拆課.首先,當你在糾結到底買超廣角和魚眼鏡頭哪個好的時候,實際上你已經走入了一個誤區。那就在於你的主要重心都放在了這兩個鏡頭視角很廣,可以容納的場景越多的這一點上。而實際來看,場景範圍對於畫面的影響其實可以通過的遠近距離來調整的效果最好,如果真要通過焦距的大小來調整,我們有可能讓畫面得不償失。這裡需要大家記住一個概念,焦距越短,視角越廣,但是空間立體感越前,焦距越長,視角越窄,空間壓縮感越強。
  • 攝影冷知識:魚眼鏡頭在拍攝中的5種創意用途
    在今天的文章中,您將學習魚眼鏡頭的創造性用法,這將使您的照片驚嘆不已。魚眼鏡頭是一種獨特的鏡頭,具有特殊的品質,可與其他鏡頭區分開。閱讀並發現您可以使用這種類型的鏡頭做什麼。動光繪畫是魚眼鏡頭創造性用途的例子之一。什麼是魚眼鏡頭?魚眼鏡頭本質上是一個超廣角鏡。
  • 微單專用魚眼鏡頭 威攝8mm f3.5鏡頭特價
    (中關村在線數碼影像行情報導)魚眼鏡頭是一種焦距極短並且視角接近或等於180°的鏡頭。1它是一種極端的廣角鏡頭,「魚眼鏡頭」是它的俗稱。為使鏡頭達到最大的攝影視角,這種攝影鏡頭的前鏡片呈弧形並向鏡頭前部凸出,與魚的眼睛頗為相似,「魚眼鏡頭」因此而得名。
  • 使用visual studio或msys2(mingw64)與VS Code編譯並使用openCV
    Windows系統下OpenCV及第三方庫文件的使用與下載如果沒有特殊要求,在Windows系統下可以直接使用OpenCV的預編譯版本。在github的opencv項目release中選擇相應release版本即可。然而,由於版權原因,預編譯的opencv並沒有包含諸多第三方工具,因此,如果要使用一些第三方工具,或者要在linux系統下使用openCV的話,還需要自己從源碼進行編譯。
  • 720全景拍攝必須要用魚眼鏡頭嗎?怎麼拍攝?
    720全景拍攝必須要用魚眼鏡頭嗎?怎麼其實魚眼鏡頭在全景拍攝中並不是必須的,我們還可以選擇其他的鏡頭來方便拍攝,例如廣角鏡頭;或者直接可以選擇不用鏡頭都可以。那麼這麼多人推薦魚眼鏡頭的使用是為什麼呢?有什麼優點?1,工作效率,出外拍攝商業片的情況下,要在儘量短期內能拍完一個場景,節省自己和顧客的時間。還能在相比較短的時間裡製作出來。
  • 室內全景拍攝,魚眼鏡頭怎麼拍室內全景?
    室內全景拍攝,魚眼鏡頭怎麼拍室內全景我們一般在拍攝全景照片時很多情況下都會採用魚眼鏡頭,下面這裡就為大家介紹一下魚眼鏡頭對於室內全景拍攝的一些技巧和注意事項4.三百六十度魚眼鏡頭全景拍攝的時候應儘量採用低視角,這是因為相對較為低的觀看視角拍攝一般更為適用於魚眼鏡頭拍攝,當然也能放大魚眼鏡頭拍攝的優點。5.近距離對焦也是三百六十度魚眼鏡頭全景拍攝的一個小的方法,好的魚眼鏡頭的最近對焦間距能做到2.5-5釐米。
  • 5種簡單的創意玩法,走進魚眼鏡頭的奇妙世界!
    魚眼鏡頭(fisheye lens) 的特質,在於它已經遠遠超過了一般廣角鏡頭的程度,甚至能夠讓影像產生大幅的變形效果。
  • 魚眼看世界 奧林巴斯8mm F1.8鏡頭試用
    而今天試用的這款奧林巴斯M.Zuiko Digital ED 8mm F1.8 PRO魚眼鏡頭,就是這樣一款可以帶給你不同視角,更多驚喜的產品。  魚眼鏡頭是一種特殊鏡頭,視角可以達到或超出人眼所能看到的範圍,所以通過魚眼鏡頭所拍攝的畫面,可以達到另一種視覺效果。
  • 測試~python庫介紹(一) opencv
    這個需求如果放在4年前,我的做法是這樣的1、取一款60FPS手機(若粒度精細可使用iPhone的慢動作,最高可達240fps),使用支架固定,打開開發者指針位置;2、取測試機放在鏡頭前,手動點擊app,跳轉完成後清除數據重複操作;3、用KMplayer播放視頻,按F鍵一幀一幀的計算圖像變化,算出啟用加載的總時長。
  • 【新品到貨】尼康魚眼鏡頭 8-15mm到貨啦---勝達攝影
    尼康於2017年5月31日宣布推出的尼康FX格式魚眼變焦鏡頭AF-S 魚眼尼克爾 8-15mm f/3.5-4.5E ED,現已經到達深圳勝達店面
  • 揚長避短用「魚眼」
    對角線魚眼鏡頭。魚眼鏡頭以其寬廣的視角、獨特的畸變,為照片帶來了不同尋常的衝擊力,但是不分場合地使用魚眼鏡頭反而會造成視覺上的麻木,魚眼視角也不適合在組照中反覆出現。比如:國家大劇院或者鳥巢,是符合魚眼鏡頭邊緣變形的特殊建築,能更好誇大這種凸起變形,擴大視覺效果,因其更加接近實際建築的外形,不易讓人感覺到是邊緣的變形,使用成功率較高。反之,用魚眼鏡頭拍攝像水立方遊泳館一樣的方形建築,會被觀者一眼識破是用了魚眼才產生的敗筆。至於天安門和大會堂等標誌建築,如果使用魚眼拍攝,則缺乏莊嚴和肅穆之感。
  • 210°視角 老蛙 CF 4mm f/2.8魚眼鏡頭評測
    魚眼鏡頭是非常特殊的一類鏡頭產品,使用魚眼鏡頭拍攝可以營造出極富視覺衝擊力的畫面效果,帶來非常廣的視角以及誇張的桶形畸變效果。因此雖然實用性不是很強,但是因為非常有意思所以還是受到了不少攝影愛好者的青睞。
  • ShiftCam 為蘋果 iPhone 11 推出 「外接鏡頭殼」,含廣角 / 魚眼 /...
    IT之家1月6日消息 根據9to5Mac的報導,ShiftCam從2017年開始為iPhone生產外接鏡頭殼,現有的型號可以在iPhone 7/8上使用,現在該廠商又為iPhone 11推出了新款產品,最高搭載四款外接鏡頭。
  • 魚眼鏡頭和廣角相機綜合測試儀
    魚眼鏡頭和廣角相機綜合測試儀 魚眼鏡頭和廣角相機應用日益普遍,最新款的手機加入了大廣角和長焦功能,具備ADAS功能的新型汽車也大量採用廣角和長焦攝像頭。隨之而來針對廣角攝像頭的測試變成了工程師急需解決的課題。