1. 程式人生 > >opencv 單目相機標定 自帶例子程式的使用

opencv 單目相機標定 自帶例子程式的使用

                                        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-e2445db1a8.css">
                    <div class="htmledit_views">

最近一個專案要進行相機的標定,作為一個菜鳥,瞎搞一下午才搞定,於是寫篇部落格記錄下~

參考資料:(學習筆記)攝像機模型與標定——一次完成標定  http://www.xuebuyuan.com/1586576.html 

OpenCV sample目錄下自帶兩個與相機標定的cpp檔案即:calibration.cpp和calibration_artificial.cpp calibration.cpp 是通過使用者輸入可選引數進行攝像機標定的程式。 calibration_artificial.cpp 是程式模擬模擬攝像機標定的過程,即程式建立棋盤然後自主標定。 通常我們有兩種方式去標定,一個是實時的從攝像機獲取拍攝到的棋盤進行標定,一個是已經獲得了一些棋盤的圖片來標定。

本文詳細介紹第二種,即用已獲得的棋盤圖片的整個過程。

方法一:編譯生成 .exe檔案,然後在commond 視窗輸入引數執行

方法二:通過新增輸入引數的程式碼,然後執行(可以單步除錯)(推薦此方法)

calibration.cpp 和 calibration_artificial.cpp 位置如圖所示。此外,棋盤圖片也在同一目錄下

找到檔案後,開始新建工程吧。不過在用以獲得的影象來進行標定,應先通過OpenCV自帶的imagelist_creator.cpp 產生一個xml或者yaml格式的影象列表,然後在使用下面的程式。

第一步,新建專案demo,新增剛才那個目錄下的imagelist_creator.cpp  編譯執行得到可執行檔案 demo.exe

第二步,執行demo.exe 產生一個xml或者yaml格式的影象列表

static void help(char** av) {   cout << “\nThis creates a yaml or xml list of files from the command line args\n”       “usage:\n./” << av[0] << ” imagelist.yaml *.png\n”       << “Try using different extensions.(e.g. yaml yml xml xml.gz etc…)\n”       << “This will serialize this list of images or whatever with opencv’s FileStorage framework” << endl; }

輸入命令:demo imagelist.yaml  left01.jpg left02.jpg left03.jpg left04.jpg left05.jpg left06.jpg left07.jpg left08.jpg left09.jpg left010.jpg left11.jpg left12.jpg left13.jpg left14.jpg right01.jpg right02.jpg right03.jpg right04.jpg right05.jpg right06.jpg right07.jpg right08.jpg right09.jpg right10.jpg right11.jpg right12.jpg right13.jpg right14.jpg  。回車,生成imagelist.yaml

第三步,進行相機的標定

先把14張棋盤圖片放到debug目錄下,然後移除imagelist_creator.cpp 新增 calibration.cpp ,如圖所示

編譯執行,得到新的demo.exe ,進入cmd ,輸入 demo -w 6 -h 9 imagelist.yaml  回車即可。如圖所示,開始對每張圖片進行角點檢測

最後,得到一個 out_camera_data.yml 檔案

內容如下:

%YAML:1.0 calibration_time: “08/21/15 16:54:26” image_width: 640 image_height: 480 board_width: 6 board_height: 9 square_size: 1. flags: 0 camera_matrix: !!opencv-matrix    rows: 3    cols: 3    dt: d    data: [ 5.3765976500165073e+002, 0., 3.4011155767874686e+002, 0.,        5.3789341813113867e+002, 2.3694081464807104e+002, 0., 0., 1. ] distortion_coefficients: !!opencv-matrix    rows: 5    cols: 1    dt: d    data: [ -2.7762353155161251e-001, 5.3976467600878486e-002,        2.1257384355991209e-003, -3.9487502777272009e-004,        4.8679847473271927e-002 ] avg_reprojection_error: 4.4034956116049290e-001

此時,大功告成 =。= 

//———————————————————————————–我是快樂的分割線———————————————————————————-//

//對於想自己單步除錯的親,補充第二種方法,即通過新增程式碼除錯。

第一步:將圖片及imagelist放到 D:\Workspace\demo\demo目錄下

第二步: 新增程式碼

具體過程如圖所示:

在該目錄下放入imagelist.yaml 和14張圖片

新增程式碼

        argc = 6;argv[0] = “demo.exe”;argv[1] = “-w”;argv[2] = “6”;argv[3] = “-h”;argv[4] = “9”;argv[5] = “imagelist.yaml”;

得到的結果是相同的哈,而且可以除錯哈~(方法二補充於2015.8.23)

        </div>
            </div>