#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 ...