OpenCV相機標定

2021-07-30 07:49:32 字數 2839 閱讀 1531

#include #include #include #include //標頭檔案

#include using namespace cv; //包含cv命名空間

using namespace std;

//棋盤標靶中每塊的寬和高

int g_height = 100;

int g_width = 100;

int g_innerheigh = 6;

int g_innerwidth = 9;

size g_imgsize;//影像的大小

//建立乙個棋盤標靶影像,顯示在螢幕中,使用相機對標靶影像進行照射,建立10幅以上

bool createcalibimg()

string tile("標靶影像");

//每隔乙個方塊,繪製乙個方形的影響塊

for (int i = 0; i < 7;++i) }

namedwindow(tile, window_autosize);//無縮放顯示,以免影像每個方格的大小

imshow(tile, img);

waitkey(0);

return true;

}//功能:計算每個影像的影像座標和物體座標

//@param filename 影像的名字

//@param imgcoor 影像中每個角點座標

//@param objcoor 影像中每個角點的物理座標

//這個函式要使用/mdd 模式,不然的可能會出現 _pfirstblock == phead的錯誤

bool calcimgandobjcoor(vectorfilename, vector> &imgcoor, vector> &objcoor)

vectorcorner;

vectorobjcorner;

corner.clear();//每次都進行清除操作,不然的話,可能會累加操作

objcorner.clear();

bool result = findchessboardcorners(img, size(g_innerwidth, g_innerheigh), corner, calib_cb_adaptive_thresh | calib_cb_normalize_image);

if (!result)

//精確計算角點的座標

cornersubpix(img, corner, size(11, 11), size(-1, -1), termcriteria(termcriteria::eps | termcriteria::max_iter, 30, 0.01));

//繪製計算的角點,可以在測試的時候進行使用

//drawchessboardcorners(img, size(g_innerwidth, g_innerheigh), corner, result);

imgcoor.push_back(corner);

//計算角點的物理座標

//計算每個畫素的畫素大小,以mm為單位,需要用到windows提供的getdevicecaps得到解析度的大小,msdn中引數說明

//horzres width, in pixels, of the screen; or for printers, the width, in pixels, of the printable area of the page.

//vertres height, in raster lines, of the screen; or for printers, the height, in pixels, of the printable area of the page.

//getdevicecaps(horzres)本來打算使用這個函式計算螢幕的物理尺寸的,但是由於這個函式在win7中得到結果是不正確,在網上尋找了一些辦法

//有的通過登錄檔中得到物理尺寸,但是,我發現在我的電腦中,這個登錄檔的數值是不存在,苦於沒有找到合適的辦法,只能找到「魯大師」了,其給出了

//螢幕的物理尺寸 30cm 17cm ,但是不知道精度如何。

hdc dc = getdc(null);

double xradio= 17.0/getdevicecaps(dc,vertres);

double yradio= 30.0/ getdevicecaps(dc, horzres);

for (int row = 0; row < g_innerheigh;++row)

}objcoor.push_back(objcorner);

} return true;

}int main()

vector> imgcoor;

vector> objcoor;

calcimgandobjcoor(filename, imgcoor, objcoor);

mat cameramatrix;//相機的內引數 3*3矩陣

mat discoeffs;//相機的畸變引數

vectorrotationmatrix;//旋轉矩陣

vectortransmatrix;//平移變換矩陣

calibratecamera(objcoor, imgcoor, g_imgsize, cameramatrix, discoeffs, rotationmatrix, transmatrix);

cout << "相機引數" << '\n' << cameramatrix << endl;

cout << "畸變引數" << '\n' << discoeffs << endl;

for (int i = 0; i < rotationmatrix.size();++i)

waitkey(0);

return 0;

}

相機標定 OpenCV

使用opencv標定的好處 會自動生成乙個.xml檔案,方便使用。即換不同相機時候只用換這個檔案,而不需要改變 作業系統 ubuntu16.04 opencv版本 3.4.6 攝像頭 電腦自帶攝像頭 標定步驟 1 找到標定例程 進入opencv安裝目錄,找到samples cpp tutorial ...

OpenCV 相機標定(演算法)

include include include include include include include include include using namespace cv using namespace std int main 提取角點 if 0 findchessboardcorner...

opencv相機標定 2 單目相機標定流程

常用的標定函式和流程,網上一大堆,這裡就不想詳細寫了 這裡說一下標定後常見的問題和我自己的一些做法。畸變校正後,邊緣處出現一些黑色畫素區域,其實也算是正常的,去畸變後補充的畫素 比例係數 newcameramatrix.at double 0 0 newcameramatrix.at double ...