OpenCV攝像頭標定(待修改)
OpenCV攝像頭標定
轉自 https://www.jianshu.com/p/9a4d9f9dfedc
本文介紹使用OpenCV自帶的標定例程對單目攝像頭標定的過程。
作業系統:Linux
OpenCV版本:3.2.0
攝像頭:640×480畫素,90度廣角鏡頭
一、標定步驟
1、找到標定例程
進入OpenCV安裝目錄,找到samples/cpp/tutorial_code/calib3d/camera_calibration目錄,把它拷貝到一個合適的位置。(因為可能需要修改一些程式碼,因此不建議直接在原目錄下使用。)
2、修改標定配置引數
找到camera_calibration/in_VID5.xml檔案,這是標定程式使用的配置檔案,需要設定裡面的幾個引數。
棋盤格的寬度和高度。
96
需要特別注意的是,這裡的寬度和高度是指內部交叉點的個數,而不是方形格的個數。如下圖所示的棋盤格,內部交叉點的寬度是9,高度是6。請務必填寫正確,否則無法標定。
每格的寬度
每格的寬度應設定為實際的毫米數,該引數的實際用途尚待考證。目前看來,即使設定的不準確也無大礙。
20
選擇輸入方式
例程提供了三種輸入方式。不過,如果待標定的攝像頭已經接入電腦,建議使用input camera方式。該方式只需要設定視訊輸入裝置號,對於膝上型電腦來說,通常0表示筆記本自帶攝像頭,1表示外接攝像頭。
To use an input camera -> give the ID of the camera, like "1"
To use an input video -> give the path of the input video, like "/tmp/x.avi"
To use an image list -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
-->"1"
3、編譯
新建camera_calibration/CMakeLists.txt檔案,寫入如下內容。
project(Camera_Calibration)set(CMAKE_CXX_STANDARD11)find_package(OpenCV3.0QUIET)if(NOT OpenCV_FOUND)find_package(OpenCV2.4.3QUIET)if(NOT OpenCV_FOUND)message(FATAL_ERROR"OpenCV > 2.4.3 not found.")endif()endif()include_directories(${OpenCV_INCLUDE_DIR})add_executable(Camera_Calibration camera_calibration.cpp)target_link_libraries(Camera_Calibration${OpenCV_LIBS})
編譯
wjg@wjg-PC:camera_calibration/build$ cmake ..
wjg@wjg-PC:camera_calibration/build$ make
4、執行
執行時需要傳入配置檔案:
wjg@wjg-PC:camera_calibration/build$ Camera_Calibration ../in_VID5.xml
程式啟動後會出現當前攝像頭拍攝到的畫面,右下角有操作提示。按下鍵盤'q'鍵開始標定。請務必使攝像頭從不同方向拍攝棋盤格,以保證程式準確計算影象畸變。共拍攝25張照片後自動結束標定,標定結果寫入camera_calibration/out_camera_data.xml。此時,為了檢視標定效果,可以按下鍵盤'u'鍵,畫面將切換到去畸變後的影象,如果畸變完全消除,則標定成功,否則應該重新標定。
這裡有一些注意事項:
可以直接在另一臺電腦螢幕上顯示棋盤格,而不必列印出來。螢幕上顯示的棋盤格更平整,不會引入額外的誤差。
要在上下左右各個角度拍攝棋盤格,以減少各個圖片間的相關性,有利於求解相機引數和畸變係數。
現在,就可以使用標定好的相機內參和畸變係數啦!
二、相機去畸變
有了標定好的引數,如何把輸入圖片的畸變去除呢?其實很簡單,只需要呼叫OpenCV提供的一個函式就可以了:
cv::undistort(temp, frame, mK, mDistCoef);
其中,temp為原圖片,frame為去畸變後的圖片,mK為相機內引數矩陣,mDistCoef為畸變矩陣。後兩個矩陣都可以在camera_calibration/out_camera_data.xml中找到。
三、理論知識——相機模型
光會用還不夠,我們應該至少了解為什麼需要標定,標定有什麼用。
簡單來說,標定是為了能夠從空間點的畫素座標對映到世界座標,這是3D立體視覺必須經過的過程。這一過程需要三步,第一步從畸變的畫素座標對映到去畸變的畫素座標,需要用到畸變矩陣mDistCoef;第二步從去畸變的畫素座標對映到相機座標,需要用到相機內引數矩陣mK;第三步從相機座標對映到世界座標,需要用到相機外引數矩陣,也就是相機位姿變換矩陣。下圖展示了第二步和第三步的過程。
關於更詳細的理論知識,推薦閱讀文末列出的參考資料。
四、參考資料
相關文章
- OPENCV3.0 單目攝像頭標定(使用官方自帶的標定圖片)OpenCV
- 《OpenCV設定和獲取攝像頭引數》OpenCV
- android opencv 前置攝像頭AndroidOpenCV
- Python opencv USB攝像頭 讀寫PythonOpenCV
- 關於基於OPENCV攝像機標定的一點感受OpenCV
- 【Android】【opencv】實現攝像頭拍照和錄影AndroidOpenCV
- 筆記本攝像頭怎麼開啟 筆記本設定攝像頭教程筆記
- win10 怎麼檢測攝像頭_win10怎麼設定攝像頭Win10
- openCV開啟高畫質攝像頭卡頓的問題OpenCV
- 攝像頭操作指南
- opencv VideoCapture 不能採集uvc攝像頭的MJPEG 資料OpenCVIDEAPT
- Python基於opencv呼叫攝像頭獲取個人圖片PythonOpenCV
- Ubuntu下編譯安裝OpenCV 2.4.7並讀取攝像頭Ubuntu編譯OpenCV
- ToDesk勾上攝像頭會看到我嗎?如何關閉攝像頭
- python版opencv:如何用筆記本攝像頭拍照儲存PythonOpenCV筆記
- OpenCV開發筆記(七十七):相機標定(二):透過棋盤標定計算相機內參矩陣矯正畸變攝像頭影像OpenCV筆記矩陣
- 安卓呼叫攝像頭拍照安卓
- Android呼叫攝像頭Android
- .NET 攝像頭採集
- Win10攝像頭如何開啟_WIN10攝像頭在哪裡Win10
- 搭建一個攝像頭應用程式 應用程式內部攝像頭
- 攝像頭不能用怎麼辦 攝像頭不能用解決辦法
- 一次實踐:給自己的手機攝像頭進行相機標定
- flash呼叫攝像頭彈出設定框監聽
- 3、Opencv播放視訊、儲存、暫停視訊,開啟攝像頭OpenCV
- 電腦釘釘攝像頭許可權在哪設定 電腦釘釘視訊會議攝像頭黑屏
- 攝像頭黑屏怎麼辦 各種攝像頭不能用的解決方法
- 某CCTV攝像頭漏洞分析
- Android呼叫攝像頭拍照Android
- android 開啟攝像頭Android
- jQuery webcam plugin呼叫攝像頭jQueryWebPlugin
- 人工智慧"眼睛"——攝像頭人工智慧
- WebRTC開啟本地攝像頭Web
- 修正Android攝像頭APIAndroidAPI
- Android 呼叫攝像頭拍照Android
- Android如何呼叫攝像頭Android
- Win10怎麼開啟攝像頭 win10開啟攝像頭的方法Win10
- Android提供的攝像頭拍照Android