1:標(biāo)定算法
vector_to_hom_mat2d(Px, Py, Qx, Qy, HomMat2D)
這里參考了halcon算子塊的官方文檔,使用的是最小二乘法,求HomMat2D矩陣。 -常用九點標(biāo)定,求兩個坐標(biāo)系的坐標(biāo)轉(zhuǎn)換。。
下面?zhèn)€人實現(xiàn)原理,結(jié)果和上面算子算出來的結(jié)果一致,知識有限,僅供學(xué)習(xí)交流。
1:先來看一張圖,圖中矩陣為2行3列,最后一列為0,0,1;因為用到是齊次矩陣,所以展開就省略了。具體為什么是這樣的矩陣形式,其實是一系列的變換,也就是平面二維仿射變換。
2:然后使用最小二乘法列出項(最小平方法)其次在對每個未知量進(jìn)行求偏導(dǎo),圖中是兩個未知量,就是列出兩個方程組,如果是三個未知量,那就是三個方程組
三個未知量進(jìn)行求導(dǎo),得出來的結(jié)果就是對應(yīng)矩陣?yán)锏奈粗??!?/p>
3:上面方法都是筆記上演示,如果放在程序里怎么做呢?用上面這種怎么求未知量呢?下面會有個人實現(xiàn)的源代碼,這里求方程組使用克拉默法則,列出行列式進(jìn)行求解,放在代碼里,方便求解。
正確的做法就是求各個未知量的系數(shù),比如:
4:核心代碼演示
//保存從界面獲取的坐標(biāo)數(shù)據(jù)
struct _coordList{
QList<QPair<double,double>> pixPoines;//保存像素坐標(biāo)
QList<QPair<double,double>> physicsPoines;//保存物理坐標(biāo)
};
//保存最小二乘法三個未知量(a,b,c)的結(jié)果
struct _squareLaw{
double aa=0;
double bb=0;
double cc=0;
double ab=0;
double ac=0;
double bc=0;
double _a=0;
double _b=0;
double _c=0;
};
//導(dǎo)數(shù)3x4
struct _differentialCoefficient{
QList<double> diff_a;
QList<double> diff_b;
QList<double> diff_c;
};
//矩陣3X3
struct _mat{
double a=0;
double b=0;
double c=0;
double d=0;
double e=0;
double f=0;
double g=0;
double h=0;
double i=0;
};
//標(biāo)定
_mat MainWindow::calibration(_coordList coordL)
{
//保存未知量(a,b,c)的系數(shù)
_squareLaw squareLaw_x;
_squareLaw squareLaw_y;
for(int i=0;i<coordL.pixPoines.count();i++) {
squareLaw_x.aa += pow(coordL.pixPoines.at(i).first,2)*2;
squareLaw_x.bb += pow(coordL.pixPoines.at(i).second,2)*2;
squareLaw_x.cc += 1*2;
squareLaw_x.ab += coordL.pixPoines.at(i).first*coordL.pixPoines.at(i).second*2;
squareLaw_x.ac += coordL.pixPoines.at(i).first*2;
squareLaw_x.bc += coordL.pixPoines.at(i).second*2;
squareLaw_x._a += coordL.pixPoines.at(i).first*coordL.physicsPoines.at(i).first*2;
squareLaw_x._b += coordL.pixPoines.at(i).second*coordL.physicsPoines.at(i).first*2;
squareLaw_x._c += coordL.physicsPoines.at(i).first*2;
}
for(int i=0;i<coordL.pixPoines.count();i++) {
squareLaw_y.aa += pow(coordL.pixPoines.at(i).first,2)*2;
squareLaw_y.bb += pow(coordL.pixPoines.at(i).second,2)*2;
squareLaw_y.cc += 1*2;
squareLaw_y.ab += coordL.pixPoines.at(i).first*coordL.pixPoines.at(i).second*2;
squareLaw_y.ac += coordL.pixPoines.at(i).first*2;
squareLaw_y.bc += coordL.pixPoines.at(i).second*2;
squareLaw_y._a += coordL.pixPoines.at(i).first*coordL.physicsPoines.at(i).second*2;
squareLaw_y._b += coordL.pixPoines.at(i).second*coordL.physicsPoines.at(i).second*2;
squareLaw_y._c += coordL.physicsPoines.at(i).second*2;
}
//求導(dǎo)數(shù) 3元方程組系數(shù)
_differentialCoefficient diff_x;
_differentialCoefficient diff_y;
diff_x.diff_a.append(squareLaw_x.aa);
diff_x.diff_a.append(squareLaw_x.ab);
diff_x.diff_a.append(squareLaw_x.ac);
diff_x.diff_a.append(squareLaw_x._a);
diff_x.diff_b.append(squareLaw_x.ab);
diff_x.diff_b.append(squareLaw_x.bb);
diff_x.diff_b.append(squareLaw_x.bc);
diff_x.diff_b.append(squareLaw_x._b);
diff_x.diff_c.append(squareLaw_x.ac);
diff_x.diff_c.append(squareLaw_x.bc);
diff_x.diff_c.append(squareLaw_x.cc);
diff_x.diff_c.append(squareLaw_x._c);
diff_y.diff_a.append(squareLaw_y.aa);
diff_y.diff_a.append(squareLaw_y.ab);
diff_y.diff_a.append(squareLaw_y.ac);
diff_y.diff_a.append(squareLaw_y._a);
diff_y.diff_b.append(squareLaw_y.ab);
diff_y.diff_b.append(squareLaw_y.bb);
diff_y.diff_b.append(squareLaw_y.bc);
diff_y.diff_b.append(squareLaw_y._b);
diff_y.diff_c.append(squareLaw_y.ac);
diff_y.diff_c.append(squareLaw_y.bc);
diff_y.diff_c.append(squareLaw_y.cc);
diff_y.diff_c.append(squareLaw_y._c);
//解方程 使用克萊默法則解方程
//a11?a22?a33?+a12?a23?a31?+a13?a21?a32? ?a13?a22?a31??a11?a23?a32??a12?a21?a33?
double D_x,Da,Db,Dc, D_y,Dd,De,Df;
D_x = diff_x.diff_a.at(0)*diff_x.diff_b.at(1)*diff_x.diff_c.at(2) + diff_x.diff_a.at(1)*diff_x.diff_b.at(2)*diff_x.diff_c.at(0) +diff_x.diff_a.at(2)*diff_x.diff_b.at(0)*diff_x.diff_c.at(1)
-diff_x.diff_a.at(2)*diff_x.diff_b.at(1)*diff_x.diff_c.at(0) - diff_x.diff_a.at(0)*diff_x.diff_b.at(2)*diff_x.diff_c.at(1) -diff_x.diff_a.at(1)*diff_x.diff_b.at(0)*diff_x.diff_c.at(2);
Da = diff_x.diff_a.at(3)*diff_x.diff_b.at(1)*diff_x.diff_c.at(2) + diff_x.diff_a.at(1)*diff_x.diff_b.at(2)*diff_x.diff_c.at(3) +diff_x.diff_a.at(2)*diff_x.diff_b.at(3)*diff_x.diff_c.at(1)
-diff_x.diff_a.at(2)*diff_x.diff_b.at(1)*diff_x.diff_c.at(3) - diff_x.diff_a.at(3)*diff_x.diff_b.at(2)*diff_x.diff_c.at(1) -diff_x.diff_a.at(1)*diff_x.diff_b.at(3)*diff_x.diff_c.at(2);
Db = diff_x.diff_a.at(0)*diff_x.diff_b.at(3)*diff_x.diff_c.at(2) + diff_x.diff_a.at(3)*diff_x.diff_b.at(2)*diff_x.diff_c.at(0) +diff_x.diff_a.at(2)*diff_x.diff_b.at(0)*diff_x.diff_c.at(3)
-diff_x.diff_a.at(2)*diff_x.diff_b.at(3)*diff_x.diff_c.at(0) - diff_x.diff_a.at(0)*diff_x.diff_b.at(2)*diff_x.diff_c.at(3) -diff_x.diff_a.at(3)*diff_x.diff_b.at(0)*diff_x.diff_c.at(2);
Dc = diff_x.diff_a.at(0)*diff_x.diff_b.at(1)*diff_x.diff_c.at(3) + diff_x.diff_a.at(1)*diff_x.diff_b.at(3)*diff_x.diff_c.at(0) +diff_x.diff_a.at(3)*diff_x.diff_b.at(0)*diff_x.diff_c.at(1)
-diff_x.diff_a.at(3)*diff_x.diff_b.at(1)*diff_x.diff_c.at(0) - diff_x.diff_a.at(0)*diff_x.diff_b.at(3)*diff_x.diff_c.at(1) -diff_x.diff_a.at(1)*diff_x.diff_b.at(0)*diff_x.diff_c.at(3);
D_y = diff_y.diff_a.at(0)*diff_y.diff_b.at(1)*diff_y.diff_c.at(2) + diff_y.diff_a.at(1)*diff_y.diff_b.at(2)*diff_y.diff_c.at(0) +diff_y.diff_a.at(2)*diff_y.diff_b.at(0)*diff_y.diff_c.at(1)
-diff_y.diff_a.at(2)*diff_y.diff_b.at(1)*diff_y.diff_c.at(0) - diff_y.diff_a.at(0)*diff_y.diff_b.at(2)*diff_y.diff_c.at(1) -diff_y.diff_a.at(1)*diff_y.diff_b.at(0)*diff_y.diff_c.at(2);
Dd = diff_y.diff_a.at(3)*diff_y.diff_b.at(1)*diff_y.diff_c.at(2) + diff_y.diff_a.at(1)*diff_y.diff_b.at(2)*diff_y.diff_c.at(3) +diff_y.diff_a.at(2)*diff_y.diff_b.at(3)*diff_y.diff_c.at(1)
-diff_y.diff_a.at(2)*diff_y.diff_b.at(1)*diff_y.diff_c.at(3) - diff_y.diff_a.at(3)*diff_y.diff_b.at(2)*diff_y.diff_c.at(1) -diff_y.diff_a.at(1)*diff_y.diff_b.at(3)*diff_y.diff_c.at(2);
De = diff_y.diff_a.at(0)*diff_y.diff_b.at(3)*diff_y.diff_c.at(2) + diff_y.diff_a.at(3)*diff_y.diff_b.at(2)*diff_y.diff_c.at(0) +diff_y.diff_a.at(2)*diff_y.diff_b.at(0)*diff_y.diff_c.at(3)
-diff_y.diff_a.at(2)*diff_y.diff_b.at(3)*diff_y.diff_c.at(0) - diff_y.diff_a.at(0)*diff_y.diff_b.at(2)*diff_y.diff_c.at(3) -diff_y.diff_a.at(3)*diff_y.diff_b.at(0)*diff_y.diff_c.at(2);
Df = diff_y.diff_a.at(0)*diff_y.diff_b.at(1)*diff_y.diff_c.at(3) + diff_y.diff_a.at(1)*diff_y.diff_b.at(3)*diff_y.diff_c.at(0) +diff_y.diff_a.at(3)*diff_y.diff_b.at(0)*diff_y.diff_c.at(1)
-diff_y.diff_a.at(3)*diff_y.diff_b.at(1)*diff_y.diff_c.at(0) - diff_y.diff_a.at(0)*diff_y.diff_b.at(3)*diff_y.diff_c.at(1) -diff_y.diff_a.at(1)*diff_y.diff_b.at(0)*diff_y.diff_c.at(3);
_mat mat;
mat.a = Da/D_x;
mat.b = Db/D_x;
mat.c = Dc/D_x;
mat.d = Dd/D_y;
mat.e = De/D_y;
mat.f = Df/D_y;
mat.g = 0;
mat.h = 0;
mat.i = 1;
return mat;
}
完整代碼實現(xiàn)xxx.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QTableWidgetItem;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
//保存從界面獲取的坐標(biāo)數(shù)據(jù)
struct _coordList{
QList<QPair<double,double>> pixPoines;//保存像素坐標(biāo)
QList<QPair<double,double>> physicsPoines;//保存物理坐標(biāo)
};
//保存最小二乘法三個未知量(a,b,c)的結(jié)果
struct _squareLaw{
double aa=0;
double bb=0;
double cc=0;
double ab=0;
double ac=0;
double bc=0;
double _a=0;
double _b=0;
double _c=0;
};
//導(dǎo)數(shù)3x4
struct _differentialCoefficient{
QList<double> diff_a;
QList<double> diff_b;
QList<double> diff_c;
};
//矩陣3X3
struct _mat{
double a=0;
double b=0;
double c=0;
double d=0;
double e=0;
double f=0;
double g=0;
double h=0;
double i=0;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
_mat calibration(_coordList);//標(biāo)定
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_tableWidget_itemChanged(QTableWidgetItem *item);
//void on_tableWidget_itemDoubleClicked(QTableWidgetItem *item);
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
QString old_text;
};
#endif // MAINWINDOW_H
xxx.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTableWidgetItem>
#include <QMessageBox>
#include <QTableWidgetItem>
#include <QFileDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//設(shè)置列數(shù)
ui->tableWidget->setColumnCount(4);
//設(shè)置標(biāo)題
//表頭標(biāo)題用QStringList來表示
QStringList headerText;
headerText<<"像素X坐標(biāo)"<<"像素Y坐標(biāo)"<<"物理X坐標(biāo)"<<"物理Y坐標(biāo)";
ui->tableWidget->setHorizontalHeaderLabels(headerText);
old_text = "";
}
MainWindow::~MainWindow()
{
delete ui;
}
//設(shè)置n點標(biāo)定
void MainWindow::on_pushButton_clicked()
{
//獲取標(biāo)定的個數(shù)
quint32 transitionCount = ui->spinBox->value();
int oldRow = ui->tableWidget->rowCount();
//設(shè)置行數(shù)
ui->tableWidget->setRowCount(transitionCount);
int newRow = ui->tableWidget->rowCount();
//生成表格,默認(rèn)值為0
if(newRow>oldRow) {
for(int i = oldRow;i<newRow;i++) {
for (int j=0;j<4;j++) {
ui->tableWidget->setItem(i,j,new QTableWidgetItem("0"));
}
}
}
}
//標(biāo)定
_mat MainWindow::calibration(_coordList coordL)
{
//保存未知量(a,b,c)的系數(shù)
_squareLaw squareLaw_x;
_squareLaw squareLaw_y;
for(int i=0;i<coordL.pixPoines.count();i++) {
squareLaw_x.aa += pow(coordL.pixPoines.at(i).first,2)*2;
squareLaw_x.bb += pow(coordL.pixPoines.at(i).second,2)*2;
squareLaw_x.cc += 1*2;
squareLaw_x.ab += coordL.pixPoines.at(i).first*coordL.pixPoines.at(i).second*2;
squareLaw_x.ac += coordL.pixPoines.at(i).first*2;
squareLaw_x.bc += coordL.pixPoines.at(i).second*2;
squareLaw_x._a += coordL.pixPoines.at(i).first*coordL.physicsPoines.at(i).first*2;
squareLaw_x._b += coordL.pixPoines.at(i).second*coordL.physicsPoines.at(i).first*2;
squareLaw_x._c += coordL.physicsPoines.at(i).first*2;
}
for(int i=0;i<coordL.pixPoines.count();i++) {
squareLaw_y.aa += pow(coordL.pixPoines.at(i).first,2)*2;
squareLaw_y.bb += pow(coordL.pixPoines.at(i).second,2)*2;
squareLaw_y.cc += 1*2;
squareLaw_y.ab += coordL.pixPoines.at(i).first*coordL.pixPoines.at(i).second*2;
squareLaw_y.ac += coordL.pixPoines.at(i).first*2;
squareLaw_y.bc += coordL.pixPoines.at(i).second*2;
squareLaw_y._a += coordL.pixPoines.at(i).first*coordL.physicsPoines.at(i).second*2;
squareLaw_y._b += coordL.pixPoines.at(i).second*coordL.physicsPoines.at(i).second*2;
squareLaw_y._c += coordL.physicsPoines.at(i).second*2;
}
//求導(dǎo)數(shù) 3元方程組系數(shù)
_differentialCoefficient diff_x;
_differentialCoefficient diff_y;
diff_x.diff_a.append(squareLaw_x.aa);
diff_x.diff_a.append(squareLaw_x.ab);
diff_x.diff_a.append(squareLaw_x.ac);
diff_x.diff_a.append(squareLaw_x._a);
diff_x.diff_b.append(squareLaw_x.ab);
diff_x.diff_b.append(squareLaw_x.bb);
diff_x.diff_b.append(squareLaw_x.bc);
diff_x.diff_b.append(squareLaw_x._b);
diff_x.diff_c.append(squareLaw_x.ac);
diff_x.diff_c.append(squareLaw_x.bc);
diff_x.diff_c.append(squareLaw_x.cc);
diff_x.diff_c.append(squareLaw_x._c);
diff_y.diff_a.append(squareLaw_y.aa);
diff_y.diff_a.append(squareLaw_y.ab);
diff_y.diff_a.append(squareLaw_y.ac);
diff_y.diff_a.append(squareLaw_y._a);
diff_y.diff_b.append(squareLaw_y.ab);
diff_y.diff_b.append(squareLaw_y.bb);
diff_y.diff_b.append(squareLaw_y.bc);
diff_y.diff_b.append(squareLaw_y._b);
diff_y.diff_c.append(squareLaw_y.ac);
diff_y.diff_c.append(squareLaw_y.bc);
diff_y.diff_c.append(squareLaw_y.cc);
diff_y.diff_c.append(squareLaw_y._c);
//解方程 使用克萊默法則解方程
//a11?a22?a33?+a12?a23?a31?+a13?a21?a32? ?a13?a22?a31??a11?a23?a32??a12?a21?a33?
double D_x,Da,Db,Dc, D_y,Dd,De,Df;
D_x = diff_x.diff_a.at(0)*diff_x.diff_b.at(1)*diff_x.diff_c.at(2) + diff_x.diff_a.at(1)*diff_x.diff_b.at(2)*diff_x.diff_c.at(0) +diff_x.diff_a.at(2)*diff_x.diff_b.at(0)*diff_x.diff_c.at(1)
-diff_x.diff_a.at(2)*diff_x.diff_b.at(1)*diff_x.diff_c.at(0) - diff_x.diff_a.at(0)*diff_x.diff_b.at(2)*diff_x.diff_c.at(1) -diff_x.diff_a.at(1)*diff_x.diff_b.at(0)*diff_x.diff_c.at(2);
Da = diff_x.diff_a.at(3)*diff_x.diff_b.at(1)*diff_x.diff_c.at(2) + diff_x.diff_a.at(1)*diff_x.diff_b.at(2)*diff_x.diff_c.at(3) +diff_x.diff_a.at(2)*diff_x.diff_b.at(3)*diff_x.diff_c.at(1)
-diff_x.diff_a.at(2)*diff_x.diff_b.at(1)*diff_x.diff_c.at(3) - diff_x.diff_a.at(3)*diff_x.diff_b.at(2)*diff_x.diff_c.at(1) -diff_x.diff_a.at(1)*diff_x.diff_b.at(3)*diff_x.diff_c.at(2);
Db = diff_x.diff_a.at(0)*diff_x.diff_b.at(3)*diff_x.diff_c.at(2) + diff_x.diff_a.at(3)*diff_x.diff_b.at(2)*diff_x.diff_c.at(0) +diff_x.diff_a.at(2)*diff_x.diff_b.at(0)*diff_x.diff_c.at(3)
-diff_x.diff_a.at(2)*diff_x.diff_b.at(3)*diff_x.diff_c.at(0) - diff_x.diff_a.at(0)*diff_x.diff_b.at(2)*diff_x.diff_c.at(3) -diff_x.diff_a.at(3)*diff_x.diff_b.at(0)*diff_x.diff_c.at(2);
Dc = diff_x.diff_a.at(0)*diff_x.diff_b.at(1)*diff_x.diff_c.at(3) + diff_x.diff_a.at(1)*diff_x.diff_b.at(3)*diff_x.diff_c.at(0) +diff_x.diff_a.at(3)*diff_x.diff_b.at(0)*diff_x.diff_c.at(1)
-diff_x.diff_a.at(3)*diff_x.diff_b.at(1)*diff_x.diff_c.at(0) - diff_x.diff_a.at(0)*diff_x.diff_b.at(3)*diff_x.diff_c.at(1) -diff_x.diff_a.at(1)*diff_x.diff_b.at(0)*diff_x.diff_c.at(3);
D_y = diff_y.diff_a.at(0)*diff_y.diff_b.at(1)*diff_y.diff_c.at(2) + diff_y.diff_a.at(1)*diff_y.diff_b.at(2)*diff_y.diff_c.at(0) +diff_y.diff_a.at(2)*diff_y.diff_b.at(0)*diff_y.diff_c.at(1)
-diff_y.diff_a.at(2)*diff_y.diff_b.at(1)*diff_y.diff_c.at(0) - diff_y.diff_a.at(0)*diff_y.diff_b.at(2)*diff_y.diff_c.at(1) -diff_y.diff_a.at(1)*diff_y.diff_b.at(0)*diff_y.diff_c.at(2);
Dd = diff_y.diff_a.at(3)*diff_y.diff_b.at(1)*diff_y.diff_c.at(2) + diff_y.diff_a.at(1)*diff_y.diff_b.at(2)*diff_y.diff_c.at(3) +diff_y.diff_a.at(2)*diff_y.diff_b.at(3)*diff_y.diff_c.at(1)
-diff_y.diff_a.at(2)*diff_y.diff_b.at(1)*diff_y.diff_c.at(3) - diff_y.diff_a.at(3)*diff_y.diff_b.at(2)*diff_y.diff_c.at(1) -diff_y.diff_a.at(1)*diff_y.diff_b.at(3)*diff_y.diff_c.at(2);
De = diff_y.diff_a.at(0)*diff_y.diff_b.at(3)*diff_y.diff_c.at(2) + diff_y.diff_a.at(3)*diff_y.diff_b.at(2)*diff_y.diff_c.at(0) +diff_y.diff_a.at(2)*diff_y.diff_b.at(0)*diff_y.diff_c.at(3)
-diff_y.diff_a.at(2)*diff_y.diff_b.at(3)*diff_y.diff_c.at(0) - diff_y.diff_a.at(0)*diff_y.diff_b.at(2)*diff_y.diff_c.at(3) -diff_y.diff_a.at(3)*diff_y.diff_b.at(0)*diff_y.diff_c.at(2);
Df = diff_y.diff_a.at(0)*diff_y.diff_b.at(1)*diff_y.diff_c.at(3) + diff_y.diff_a.at(1)*diff_y.diff_b.at(3)*diff_y.diff_c.at(0) +diff_y.diff_a.at(3)*diff_y.diff_b.at(0)*diff_y.diff_c.at(1)
-diff_y.diff_a.at(3)*diff_y.diff_b.at(1)*diff_y.diff_c.at(0) - diff_y.diff_a.at(0)*diff_y.diff_b.at(3)*diff_y.diff_c.at(1) -diff_y.diff_a.at(1)*diff_y.diff_b.at(0)*diff_y.diff_c.at(3);
_mat mat;
mat.a = Da/D_x;
mat.b = Db/D_x;
mat.c = Dc/D_x;
mat.d = Dd/D_y;
mat.e = De/D_y;
mat.f = Df/D_y;
mat.g = 0;
mat.h = 0;
mat.i = 1;
return mat;
}
//執(zhí)行標(biāo)定
void MainWindow::on_pushButton_2_clicked()
{
_coordList coordL;
//獲取界面坐標(biāo)數(shù)據(jù)
for(int i=0;i<ui->tableWidget->rowCount();i++) {
QPair<double,double> pairPix;
QPair<double,double> pairPhy;
for(int j=0;j<4;j++) {
switch (j) {
case 0:
pairPix.first = ui->tableWidget->item(i,j)->text().toDouble();
break;
case 1:
pairPix.second = ui->tableWidget->item(i,j)->text().toDouble();
break;
case 2:
pairPhy.first = ui->tableWidget->item(i,j)->text().toDouble();
break;
case 3:
pairPhy.second = ui->tableWidget->item(i,j)->text().toDouble();
break;
default:
break;
}
}
coordL.pixPoines.append(pairPix);
coordL.physicsPoines.append(pairPhy);
}
//執(zhí)行標(biāo)定,獲取結(jié)果
_mat mat = calibration(coordL);
//顯示標(biāo)定結(jié)果
ui->textEdit->append(QString::number(mat.a,'e',15)+" , "+QString::number(mat.b,'e',15)+" , "+QString::number(mat.c,'e',15));
ui->textEdit->append(QString::number(mat.d,'e',15)+" , "+QString::number(mat.e,'e',15)+" , "+QString::number(mat.f,'e',15));
ui->textEdit->append(QString::number(mat.g)+" , "+QString::number(mat.h)+" , "+QString::number(mat.i));
ui->textEdit->append("\r\n");
}
//item沒有字符時,雙擊觸發(fā)
void MainWindow::on_tableWidget_itemChanged(QTableWidgetItem *item)
{
//2、匹配正負(fù)整數(shù)、正負(fù)浮點數(shù)
QString Pattern("(-?[1-9][0-9]+)|(-?[0-9])|(-?[1-9]\\d+\\.\\d+)|(-?[0-9]\\.\\d+)");
QRegExp reg(Pattern);
//3.獲取修改的新的單元格內(nèi)容
QString str=item->text();
if(str.isEmpty()) {
return;
}
//匹配失敗,返回原來的字符
if(!reg.exactMatch(str)){
QMessageBox::information(this,"匹配失敗","請輸入小數(shù)和整數(shù)!");
item->setText("0"); //更換之前的內(nèi)容
}
//1、記錄舊的單元格內(nèi)容
old_text = item->text();
}
//打開文件-》從文件讀取坐標(biāo)
void MainWindow::on_pushButton_3_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,tr("文件對話框!"), "",tr("文件(*.csv *.txt)"));
if(!fileName.isEmpty()) {
QFile file(fileName);
quint32 line=0;
if(file.open(QIODevice::ReadOnly|QIODevice::Text)) {
for (;;) {
QString data = file.readLine();
if(data.isEmpty()) {
QMessageBox::information(this,"完成","數(shù)據(jù)讀取完成!");
return;
}
QStringList sL = data.split(",");
if(sL.count()!=4) {
QMessageBox::information(this,"錯誤","請確定每行數(shù)據(jù)為4個并且以,分割!");
return;
}
for(int i=0;i<sL.count();i++) {
bool isOk;
sL.at(i).toDouble(&isOk);
sL.at(i).toULongLong(&isOk);
if(isOk) {
//設(shè)置行數(shù)
ui->tableWidget->setRowCount(line+1);
ui->tableWidget->setItem(line,i,new QTableWidgetItem(sL.at(i)));
}else {
QMessageBox::information(this,"錯誤","數(shù)據(jù)轉(zhuǎn)換double失敗!");
}
}
line++;
}
}
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-586905.html
2:外部鏈接
最小二乘法
仿射變換
克拉默法則
行列式計算方法
2D坐標(biāo)系下的點的轉(zhuǎn)換矩陣文章來源地址http://www.zghlxwxcb.cn/news/detail-586905.html
到了這里,關(guān)于N點標(biāo)定-坐標(biāo)系變換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!