相机标定程序(干扰有错误需改进)



#include<iostream>

#include<iomanip>

using namespace std;

 

void swap(float a[], float b[], int n)

{

float t;

for (int i = 0; i<n; i++)

{

t = a[i];

a[i] = b[i];

b[i] = t;

}

}

 

void chu(float a[], int jint n)

{

float t;

t = a[j];

for (int i = 0; i<n; i++)

a[i] = a[i] / t;

}

 

void jia(float a[], float b[], float mint n)

{

for (int i = 0; i<n; i++)

{

a[i] = a[i] + m*b[i];

}

}

 

 

 

void ni_Matrix(float * * p){

int n, i, j;

float t;

//输入矩阵

cout << "请输入矩阵的阶数" << endl;

cin >> n;

float **p_aij = new float*[2 * n];

for (i = 0; i < 2 * n; i++){

p_aij[i] = new float[2 * n];

if (i < n){

for (j = 0; j < n; j++){

p_aij[i][j] = p[i][j];

}

}

}

//后部归零

for (i = 0; i<2 * n; i++)

{

for (j = n; j<2 * n; j++)p_aij[i][j] = 0;

}

//添加单位阵

for (i = 0; i<n; i++)

for (j = n; j<2 * n; j++)

{

if ((j - n) == i){ p_aij[i][j] = 1; }

 

}

//正向行化简

for (j = 0; j<n; j++)

{

for (i = j; i<n; i++){ if (p_aij[i][j] != 0)break; }

swap(p_aij[j], p_aij[i], 2 * n);

chu(p_aij[j], j, 2 * n);

for (i = j + 1; i<n; i++)

{

jia(p_aij[i], p_aij[j], -p_aij[i][j], 2 * n);

}

}

 

//逆向行化简

 

for (j = n - 1; j >= 0; j--)

{

for (i = j; i >= 0; j--){ if (p_aij[i][j] != 0)break; }

swap(p_aij[j], p_aij[i], 2 * n);

chu(p_aij[j], j, 2 * n);

for (i = j - 1; i >= 0; i--)

{

jia(p_aij[i], p_aij[j], -p_aij[i][j], 2 * n);

}

 

}

 

//输出

 

cout << "AtA的逆矩阵:\n";

for (i = 0; i<n; i++)

{

cout << "(";

for (j = n; j < 2 * n; j++){

p[i][j - n] = p_aij[i][j];

cout << setw(4) << p[i][j-n] << "  ";

}

cout <<")"<< endl;

}

cin.get();

cin.get();

for (int i = 0; i < 2 * n; i++)

delete[]  p_aij[i];

delete[] p_aij;

}

 

 

int main()

{

//创建世界坐标矩阵

cout << "请输入十组世界坐标(x,y,z):\n";

float **p_world = new float *[10];

for (int i = 0; i < 10; i++){

p_world[i] = new float[3];

for (int j = 0; j < 3; j++){

cin >> p_world[i][j];

if (!cin){

cin.clear();

while (cin.get() != '\n')

continue;

cout << "Bad input!!";

break;

}

}

}

 

 

//创建旋转矩阵

cout << "请输入旋转角度(x,y,z):\n";

float ** p_rotation = new float *[3];

float x_angle, y_angle, z_angle;

cout << "x轴:"; cin >> x_angle;

cout << "y轴:"; cin >> y_angle;

cout << "z轴:"; cin >> z_angle;

for (int i = 0; i < 3; i++)

p_rotation[i] = new float[3];

p_rotation[0][0] = cos(x_angle)*cos(z_angle) - sin(x_angle)*sin(y_angle)*sin(z_angle);

p_rotation[0][1] = cos(y_angle)*sin(z_angle) + sin(x_angle)*sin(y_angle)*cos(z_angle);

p_rotation[0][2] = -cos(x_angle)*sin(y_angle);

p_rotation[1][0] = -cos(x_angle)*sin(z_angle);

p_rotation[1][1] = cos(x_angle)*cos(z_angle);

p_rotation[1][2] = sin(x_angle);

p_rotation[2][0] = sin(y_angle)*cos(z_angle) + sin(x_angle)*cos(y_angle)*sin(z_angle);

p_rotation[2][1] = sin(y_angle)*sin(z_angle) - sin(x_angle)*cos(y_angle)*cos(z_angle);

p_rotation[2][2] = cos(x_angle)*cos(y_angle);

 

 

 

//创建平移矩阵

cout << "输入平移向量(x,y,z):\n";

float * p_trans = new float[3];

for (int j = 0; j < 3; j++){

cin >> p_trans[j];

if (!cin){

cin.clear();

while (cin.get() != '\n')

continue;

cout << "Bad input!!";

break;

}

}

 

//创建内参数矩阵

cout << "按顺序输入相机内参数Ku,Kv,Uo,Vo:\n";

float Ku, Kv, Uo, Vo;

cin >> Ku >> Kv >> Uo >> Vo; cout << endl;

float * *p_nei = new float *[3];

for (int i = 0; i < 3; i++){

for (int j = 0; j < 3; j++){

p_nei[i] = new float[3];

p_nei[i][j] = 0;

}

}

p_nei[0][0] = Ku; p_nei[0][2] = Uo; p_nei[1][1] = Kv; p_nei[1][2] = Vo; p_nei[2][2] = 1;

 

 

//打印内参数矩阵

cout << "\n得相机内参数矩阵为:\n";

for (int i = 0; i < 3; i++){

cout << "(";

for (int j = 0; j < 3; j++){

cout << p_nei[i][j] << "  ";

}

cout << ")\n";

}

 

 

//创建外参数矩阵

cout << "\n由旋转和平移矩阵得外参数矩阵:\n";

float ** p_wai = new float*[3];

for (int i = 0; i < 3; i++){

p_wai[i] = new float[4];

for (int j = 0; j < 3; j++){

p_wai[i][j] = p_rotation[i][j];

}

p_wai[i][3] = p_trans[i];

}

 

//打印外参数矩阵

for (int i = 0; i < 3; i++){

cout << "(";

for (int j = 0; j < 4; j++)

cout << p_wai[i][j] << ",";

cout << ")\n";

}

 

 

//由内外参数矩阵得相机的参数矩阵

cout << "\n由内外参数矩阵得相机的参数矩阵:\n";

float ** p_camera = new float *[3];

for (int i = 0; i < 3; i++){

p_camera[i] = new float[4];

cout << "(";

for (int j = 0; j < 4; j++){

p_camera[i][j] = p_nei[i][0] * p_wai[0][j] + p_nei[i][1] * p_wai[1][j] + p_nei[i][2] * p_wai[2][j];

cout << p_camera[i][j] << "   ";

}

cout << ")\n";

}

 

 

//显示世界坐标

cout << "\n世界坐标:\n";

for (int i = 0; i < 10; i++){

cout << "(";

for (int j = 0; j < 3; j++){

cout << p_world[i][j] << ",";

}

cout << ")\n";

}

 

 

//根据世界坐标得相应图像坐标

cout << "\n十组世界坐标对应的图像坐标:\n";

float ** p_image = new float *[10];

int Eu = 0.5, Ev = 0.5;

for (int i = 0; i < 10; i++){

cout << "(";

p_image[i] = new float[2];

float su = (p_world[i][0] * p_camera[0][0] + p_world[i][1] * p_camera[0][1] + p_world[i][2] * p_camera[0][2] + p_camera[0][3]);

float s = (p_world[i][0] * p_camera[2][0] + p_world[i][1] * p_camera[2][1] + p_world[i][2] * p_camera[2][2] + p_camera[2][3]);

float sv = (p_world[i][0] * p_camera[1][0] + p_world[i][1] * p_camera[1][1] + p_world[i][2] * p_camera[1][2] + p_camera[1][3]);

p_image[i][0] = su / s; cout << p_image[i][0] << ",";

p_image[i][1] = sv / s; cout << p_image[i][1] << ")\n";

}

 

//给图像加干扰后得到的图像坐标

float ** p_errorimage = new float *[10];

cout << "\n加干扰后求得的图像坐标:\n";

for (int i = 0; i < 10; i++){

cout << "(";

p_errorimage[i] = new float[2];

p_errorimage[i][0] = p_image[i][0] + 0.02; cout << p_errorimage[i][0] << ",";

p_errorimage[i][1] = p_image[i][1] + 0.01; cout << p_errorimage[i][1] << ")\n";

}

 

//构造A矩阵p_a1+p_a2=p_A

float ** p_a1 = new float *[10];

for (int i = 0; i < 10; i++){

p_a1[i] = new float[11];

for (int j = 0; j < 3; j++)

p_a1[i][j] = p_world[i][j];

p_a1[i][3] = 1;

for (int j = 4; j < 8; j++)

p_a1[i][j] = 0;

for (int j = 8; j < 11; j++)

p_a1[i][j] = -p_errorimage[i][0] * p_world[i][j - 8];

 

}

cout << "\nThe a1 Matrix:\n";

for (int i = 0; i < 10; i++){

cout << "(";

for (int j = 0; j < 11; j++)

cout << p_a1[i][j] << "  ";

cout << ")\n";

}

//end p_a1

 

float ** p_a2 = new float *[10];

for (int i = 0; i < 10; i++){

p_a2[i] = new float[11];

for (int j = 0; j < 4; j++)

p_a2[i][j] = 0;

for (int j = 4; j < 7; j++)

p_a2[i][j] = p_world[i][j - 4];

p_a2[i][7] = 1;

for (int j = 8; j < 11; j++)

p_a2[i][j] = -p_image[i][1] * p_world[i][j - 8];//后需改为errorimage!!!!!!!!!!!

 

}

cout << "\nThe a2 Matrix:\n";

for (int i = 0; i < 10; i++){

cout << "(";

for (int j = 0; j < 11; j++)

cout << p_a2[i][j] << "  ";

cout << ")\n";

}

//end p_a2

 

//构造A

float ** p_A = new float *[20];

for (int i = 0; i < 20; i++){

p_A[i] = new float[11];

if (i % 2 == 0){

for (int j = 0; j < 11; j++)

p_A[i][j] = p_a1[i / 2][j];

}

else if (i % 2 == 1){

for (int j = 0; j < 11; j++)

p_A[i][j] = p_a2[(i - 1) / 2][j];

}

}

//打印A矩阵

cout << "\nThe A Matrix:\n";

for (int i = 0; i < 20; i++){

cout << "(";

for (int j = 0; j < 11; j++)

cout << p_A[i][j] << "    ";

cout << ")\n";

}//end A

 

//构造AT

cout << "\nThe At Matrix:\n";

float **p_At = new float *[11];

for (int i = 0; i < 11; i++){

p_At[i] = new float[20];

cout << "(";

for (int j = 0; j < 20; j++){

p_At[i][j] = p_A[j][i];

cout << p_At[i][j] << "  ";

}

cout << ")\n";

}//end AT

 

//构造ATA

cout << "\nThe ATA Matrix :\n";

float ** p_AtA = new float *[11];

for (int i = 0; i < 11; i++){

cout << "(";

p_AtA[i] = new float[11];

for (int j = 0; j < 11; j++){

p_AtA[i][j] = 0;

for (int k = 0; k < 20; k++)

p_AtA[i][j] += p_At[i][k] * p_A[k][j];

cout << p_AtA[i][j] << "  ";

}

cout << ")\n";

}//end ATA

 

//构造AtA的逆矩阵

//********求任何一个矩阵的逆********

ni_Matrix(p_AtA);

//此时p_AtA矩阵为原矩阵的逆矩阵(成功)!!!!!

 

 

//----------------------------

//构造B20*1矩阵

//----------------------------

float ** p_B = new float*[20];

for (int i = 0; i < 20; i++){

p_B[i]= new float[1];

}

cout << "The B Matrix:\n";

for (int i = 0; i < 20; i++){

if (i % 2 == 0)

p_B[i][0] = p_errorimage[i / 2][0];

else

p_B[i][0] = p_errorimage[(i - 1) / 2][1];

cout << "(" << p_B[i][0] << ")" << endl;

}//end B

 

 

//--------------

//计算X即求参数矩阵C

//---------------

 

 

cout << "The C1 matrix:\n";

float ** p_C1 = new float *[11];

for (int i = 0; i < 11; i++){

cout << i<<"行 (";

p_C1[i] = new float[20];

for (int j = 0; j < 20; j++){

p_C1[i][j] = 0;

for (int k = 0; k < 11; k++)

p_C1[i][j] += p_AtA[i][k] * p_At[k][j];

cout << "  " << p_C1[i][j];

}

cout << ")\n";

}

 

 

cout << "\nThe computed C2 Matrix :\n";

float ** p_C2 = new float *[11];

for (int i = 0; i < 11; i++){

cout<< "(";

p_C2[i] = new float[1];

for (int j = 0; j < 1; j++){

p_C2[i][j] = 0;

for (int k = 0; k < 11; k++)

p_C2[i][j] += p_C1[i][k] * p_B[k][j];

cout <<"    "<< p_C2[i][j];

}

cout<< ")\n" ;

}

 

cout << "\nThe computed C Matrix :\n";

float ** p_C = new float *[3];

for (int i = 0; i < 3; i++){

cout << "(";

p_C[i] = new float[4];

if (i<2)

{

for (int j = 0; j < 4; j++){

p_C[i][j] = p_C2[j][0];

cout <<"  "<<p_C[i][j]; 

}

cout << ")\n";

}

else

{

p_C[i][0] = p_C2[8][0];

p_C[i][1] = p_C2[9][0];

p_C[i][2] = p_C2[10][0];

p_C[i][3]= p_trans[2];

for (int j = 0; j < 4; j++){ cout <<"  "<< p_C[i][j]; }

cout << ")\n";

}

}//end C

 

 

cin.get();

cin.get();

 

//释放二维数组

for (int i = 0; i < 10; i++)

delete[]p_world[i];

delete[]p_world;

 

for (int i = 0; i < 3; i++)

delete[] p_rotation[i];

delete[]p_rotation;

 

for (int i = 0; i < 3; i++)

delete[] p_wai[i];

delete[] p_wai;

 

for (int i = 0; i < 3; i++)

delete[] p_nei[i];

delete[] p_nei;

 

delete[] p_trans;

 

for (int i = 0; i < 3; i++)

delete[] p_camera[i];

delete[] p_camera;

 

for (int i = 0; i < 10; i++)

delete[]p_image[i];

delete[] p_image;

 

for (int i = 0; i < 10; i++)

delete[]p_errorimage[i];

delete[] p_errorimage;

 

for (int i = 0; i < 10; i++)

delete[]p_a1[i];

delete[] p_a1;

 

for (int i = 0; i < 10; i++)

delete[]p_a2[i];

delete[] p_a2;

 

for (int i = 0; i < 20; i++)

delete[]p_A[i];

delete[] p_A;

 

for (int i = 0; i < 11; i++)

delete[]p_At[i];

delete[] p_At;

 

for (int i = 0; i < 11; i++)

delete[]p_AtA[i];

delete[] p_AtA;

 

for (int i = 0; i < 20; i++)

delete[]p_B[i];

delete[] p_B;

 

for (int i = 0; i < 11; i++)

delete[]p_C2[i];

delete[] p_C2;

 

for (int i = 0; i < 11; i++)

delete[]p_C1[i];

delete[] p_C1;

 

for (int i = 0; i < 3; i++)

delete[]p_C[i];

delete[] p_C;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值