#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace cv;
using
namespace
std;
int main()
/* 提取角點 */
if (0==findchessboardcorners(imageinput, board_size, image_points_buf))
else
}int cornernum = board_size.width * board_size.height; // 每張上總的角點數
//-------------以下是攝像機標定------------------
/*棋盤三維資訊*/
size square_size = size(10, 10); /* 實際測量得到的標定板上每個棋盤格的大小 */
vector
> object_points; /* 儲存標定板上角點的三維座標 */
/*內外引數*/
mat cameramatrix = mat(3, 3, cv_32fc1, scalar::all(0)); /* 攝像機內引數矩陣 */
vector
point_counts; // 每幅影象中角點的數量
mat distcoeffs=mat(1, 5, cv_32fc1,scalar::all(0)); /* 攝像機的5個畸變係數:k1,k2,p1,p2,k3 */
vector
tvecsmat; /* 每幅影象的旋轉向量 */
vector
rvecsmat; /* 每幅影象的平移向量 */
/* 初始化標定板上角點的三維座標 */
int i, j, t;
for (t=0; tvector
temppointset;
for (i=0; ifor (j=0; j/* 假設標定板放在世界座標系中z=0的平面上 */
realpoint.x = i * square_size.width;
realpoint.y = j * square_size.height;
realpoint.z = 0;
temppointset.push_back(realpoint);}}
object_points.push_back(temppointset);
}/* 初始化每幅影象中的角點數量,假定每幅影象中都可以看到完整的標定板 */
for (i=0; i/* 開始標定 */
// object_points 世界座標系中的角點的三維座標
// image_points_seq 每乙個內角點對應的影象座標點
// image_size 影象的畫素尺寸大小
// cameramatrix 輸出,內參矩陣
// distcoeffs 輸出,畸變係數
// rvecsmat 輸出,旋轉向量
// tvecsmat 輸出,位移向量
// 0 標定時所採用的演算法
calibratecamera(object_points, image_points_seq, image_size, cameramatrix, distcoeffs, rvecsmat, tvecsmat, 0);
//------------------------標定完成------------------------------------
// -------------------對標定結果進行評價------------------------------
double total_err = 0.0; /* 所有影象的平均誤差的總和 */
double err = 0.0; /* 每幅影象的平均誤差 */
vector
image_points2; /* 儲存重新計算得到的投影點 */
fout<<"每幅影象的標定誤差:\n";
for (i=0;ivector
temppointset = object_points[i];
/* 通過得到的攝像機內外引數,對空間的三維點進行重新投影計算,得到新的投影點 */
projectpoints(temppointset, rvecsmat[i], tvecsmat[i], cameramatrix, distcoeffs, image_points2);
/* 計算新的投影點和舊的投影點之間的誤差*/
vector
tempimagepoint = image_points_seq[i];
mat tempimagepointmat = mat(1, tempimagepoint.size(), cv_32fc2);
mat image_points2mat = mat(1, image_points2.size(), cv_32fc2);
for (int j = 0 ; j < tempimagepoint.size(); j++)
err = norm(image_points2mat, tempimagepointmat, norm_l2);
total_err += err/= point_counts[i];
fout << "第"
<< i+1
<< "幅影象的平均誤差:"
<< err<< "畫素"
<< endl;
}fout << "總體平均誤差:"
<< total_err/image_count << "畫素"
//-----------------------儲存定標結果-------------------------------------------
mat rotation_matrix = mat(3,3,cv_32fc1, scalar::all(0)); /* 儲存每幅影象的旋轉矩陣 */
fout << "相機內引數矩陣:"
<< endl;
fout << cameramatrix << endl << endl;
fout << "畸變係數:\n";
fout << distcoeffs << endl << endl << endl;
for (int i=0; i"第"
<< i+1
<< "幅影象的旋轉向量:"
<< endl;
fout << tvecsmat[i] << endl;
/* 將旋轉向量轉換為相對應的旋轉矩陣 */
rodrigues(tvecsmat[i], rotation_matrix);
fout << "第"
<< i+1
<< "幅影象的旋轉矩陣:"
<< endl;
fout << rotation_matrix << endl;
fout << "第"
<< i+1
<< "幅影象的平移向量:"
<< endl;
fout << rvecsmat[i] << endl << endl;
}fout//----------------------顯示定標結果--------------------------------
mat mapx = mat(image_size, cv_32fc1);
mat mapy = mat(image_size, cv_32fc1);
mat r = mat::eye(3, 3, cv_32f);
string imagefilename;
std::stringstream strstm;
for (int i = 0 ; i != image_count ; i++)
fin.close();
fout.close();
return
0;}
OpenCV相機標定
include include include include 標頭檔案 include using namespace cv 包含cv命名空間 using namespace std 棋盤標靶中每塊的寬和高 int g height 100 int g width 100 int g innerh...
相機標定 OpenCV
使用opencv標定的好處 會自動生成乙個.xml檔案,方便使用。即換不同相機時候只用換這個檔案,而不需要改變 作業系統 ubuntu16.04 opencv版本 3.4.6 攝像頭 電腦自帶攝像頭 標定步驟 1 找到標定例程 進入opencv安裝目錄,找到samples cpp tutorial ...
opencv相機標定 2 單目相機標定流程
常用的標定函式和流程,網上一大堆,這裡就不想詳細寫了 這裡說一下標定後常見的問題和我自己的一些做法。畸變校正後,邊緣處出現一些黑色畫素區域,其實也算是正常的,去畸變後補充的畫素 比例係數 newcameramatrix.at double 0 0 newcameramatrix.at double ...