OpenCV 相機標定(演算法)

2021-08-26 23:48:20 字數 4038 閱讀 9310

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