国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

N點標(biāo)定-坐標(biāo)系變換

這篇具有很好參考價值的文章主要介紹了N點標(biāo)定-坐標(biāo)系變換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。



1:標(biāo)定算法

vector_to_hom_mat2d(Px, Py, Qx, Qy, HomMat2D)
n點標(biāo)定,視覺,算法,矩陣
這里參考了halcon算子塊的官方文檔,使用的是最小二乘法,求HomMat2D矩陣。 -常用九點標(biāo)定,求兩個坐標(biāo)系的坐標(biāo)轉(zhuǎn)換。。
下面?zhèn)€人實現(xiàn)原理,結(jié)果和上面算子算出來的結(jié)果一致,知識有限,僅供學(xué)習(xí)交流。
1:先來看一張圖,圖中矩陣為2行3列,最后一列為0,0,1;因為用到是齊次矩陣,所以展開就省略了。具體為什么是這樣的矩陣形式,其實是一系列的變換,也就是平面二維仿射變換。

n點標(biāo)定,視覺,算法,矩陣

2:然后使用最小二乘法列出項(最小平方法)n點標(biāo)定,視覺,算法,矩陣其次在對每個未知量進(jìn)行求偏導(dǎo),圖中是兩個未知量,就是列出兩個方程組,如果是三個未知量,那就是三個方程組
n點標(biāo)定,視覺,算法,矩陣
三個未知量進(jìn)行求導(dǎo),得出來的結(jié)果就是對應(yīng)矩陣?yán)锏奈粗??!?/p>

3:上面方法都是筆記上演示,如果放在程序里怎么做呢?用上面這種怎么求未知量呢?下面會有個人實現(xiàn)的源代碼,這里求方程組使用克拉默法則,列出行列式進(jìn)行求解,放在代碼里,方便求解。

正確的做法就是求各個未知量的系數(shù),比如:

n點標(biāo)定,視覺,算法,矩陣
n點標(biāo)定,視覺,算法,矩陣
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++;
            }


        }

    }

}

n點標(biāo)定,視覺,算法,矩陣

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • MATLAB 相機(jī)標(biāo)定中標(biāo)定板角點像素坐標(biāo)系到世界坐標(biāo)系的轉(zhuǎn)換

    MATLAB 相機(jī)標(biāo)定中標(biāo)定板角點像素坐標(biāo)系到世界坐標(biāo)系的轉(zhuǎn)換

    matlab 做相機(jī)標(biāo)定后,想將第一張(任意一張都行)標(biāo)定板角點所對應(yīng)的像素坐標(biāo)轉(zhuǎn)換到世界坐標(biāo)系下,標(biāo)定板角點的像素坐標(biāo)真值與世界坐標(biāo)真值都非常容易獲得,但是我通過內(nèi)外參矩陣將像素坐標(biāo)轉(zhuǎn)換到世界坐標(biāo)有很大的誤差,如下 像素坐標(biāo)到世界坐標(biāo)之間的轉(zhuǎn)換可參考

    2024年02月10日
    瀏覽(22)
  • 雙相機(jī)坐標(biāo)系標(biāo)定

    雙相機(jī)坐標(biāo)系標(biāo)定

    在工業(yè)應(yīng)用中,常常會遇到雙相機(jī)定位的項目,下面就介紹雙相機(jī)如何標(biāo)定才能做到精準(zhǔn)定位。 1,產(chǎn)品 ?如上圖所示,玻璃上對角有兩個mark點,由于mark點的間距太遠(yuǎn)只能用兩個相機(jī)去拍。 2,相機(jī)布局 ?兩個相機(jī)分別拍產(chǎn)品的對角。 3,標(biāo)定流程 ? 1,根據(jù)n點標(biāo)的規(guī)則獲取

    2024年02月12日
    瀏覽(27)
  • 激光雷達(dá)標(biāo)定(坐標(biāo)系轉(zhuǎn)換)

    激光雷達(dá)標(biāo)定(坐標(biāo)系轉(zhuǎn)換)

    由于激光雷達(dá)獲取的點云數(shù)據(jù)的坐標(biāo)是相對于激光雷達(dá)坐標(biāo)系的,為了使車最終得到的點云數(shù)據(jù)坐標(biāo)是在車坐標(biāo)系下的,我們需要對點云中每一個點的坐標(biāo)進(jìn)行坐標(biāo)轉(zhuǎn)換。 首先是需要對坐標(biāo)系進(jìn)行旋轉(zhuǎn)變換,先以二維平面的單位向量坐標(biāo)轉(zhuǎn)換為例,假設(shè)兩坐標(biāo)系中的旋轉(zhuǎn)矩陣

    2023年04月16日
    瀏覽(23)
  • 相機(jī)標(biāo)定 >> 坐標(biāo)系轉(zhuǎn)換@內(nèi)參、外參

    相機(jī)標(biāo)定 >> 坐標(biāo)系轉(zhuǎn)換@內(nèi)參、外參

    為了更好的理解標(biāo)定,首先應(yīng)熟悉各個坐標(biāo)系。(坐標(biāo)系圖均取自百度百科) 該坐標(biāo)系是以圖像左上角為原點建立以像素為單位的二維坐標(biāo)系u-v。(相對坐標(biāo)系) 圖像坐標(biāo)系是以 O1 (是圖像的主點,也即光軸與像平面的交點,一般就是像素坐標(biāo)系的中點)為原點的二維坐標(biāo)

    2024年02月12日
    瀏覽(23)
  • 【導(dǎo)彈四種坐標(biāo)系及坐標(biāo)系之間的變換】

    【導(dǎo)彈四種坐標(biāo)系及坐標(biāo)系之間的變換】

    本文參考錢杏芳等編著的《導(dǎo)彈飛行力學(xué)》 坐標(biāo)系是為描述導(dǎo)彈位置和運動規(guī)律而選取的參考基準(zhǔn)。為了準(zhǔn)確,簡潔和清晰的描述導(dǎo)彈的運動方程,我們需要選取合適的坐標(biāo)系并熟練掌握坐標(biāo)系之間的轉(zhuǎn)換。本文介紹了地面坐標(biāo)系、彈體坐標(biāo)系、彈道坐標(biāo)系和速度坐標(biāo)系四種

    2023年04月09日
    瀏覽(41)
  • 激光雷達(dá)坐標(biāo)系和相機(jī)坐標(biāo)系相互變換(易懂不詳細(xì))

    激光雷達(dá)坐標(biāo)系和相機(jī)坐標(biāo)系相互變換(易懂不詳細(xì))

    碼字不易,路過的朋友動動小手點點贊吧 傳感器融合少不了的就是聯(lián)合標(biāo)定,最近大火的激光雷達(dá)和相機(jī)傳感器融合算法,讓很多工程師學(xué)者投入精力學(xué)習(xí),本文簡單介紹一下激光雷達(dá)和相機(jī)傳感器坐標(biāo)系轉(zhuǎn)換的原理。 ????????傳感器安裝位置不同,而且每個傳感器都有

    2024年02月11日
    瀏覽(21)
  • 坐標(biāo)系之間的變換

    坐標(biāo)系之間的變換

    本文來自 《Fundamentals of Computer Graphic》 7.5 Coordinate Transform 在圖 7.19 中,右上圖是保持坐標(biāo)系不變,移動點的位置;右下圖是保持點的位置不變,移動坐標(biāo)系。在這兩種移動方法之后,點在坐標(biāo)系上的坐標(biāo)都是 ( 1 , 1 ) (1,1) ( 1 , 1 ) 。 改變坐標(biāo)系的想法與編程中的類型轉(zhuǎn)換類似

    2024年02月08日
    瀏覽(22)
  • 怎樣通過Python和齊次坐標(biāo)變換方法實現(xiàn)坐標(biāo)系之間的轉(zhuǎn)換?

    齊次坐標(biāo)變換是一種用于實現(xiàn)坐標(biāo)系之間變換的數(shù)學(xué)技術(shù)。它通常用于計算機(jī)圖形學(xué)、計算機(jī)視覺和機(jī)器人技術(shù)。在齊次坐標(biāo)系中,3D點/頂點由4D向量(x,y,z,w)表示,其中w是比例因子。齊次表示允許有效的矩陣運算并簡化變換過程。坐標(biāo)系之間的變換可以通過使用齊次變

    2024年02月05日
    瀏覽(16)
  • 齊次坐標(biāo)變換的理解以及在無人機(jī)相機(jī)定位坐標(biāo)系轉(zhuǎn)換中的應(yīng)用

    齊次坐標(biāo)變換的理解以及在無人機(jī)相機(jī)定位坐標(biāo)系轉(zhuǎn)換中的應(yīng)用

    4*4矩陣的右邊三個數(shù)表示平移,如果原來的向量u的w=0,那么就是u+(ai+bj+ck) 對應(yīng)xyz三個軸的循環(huán)變換,注意負(fù)號的位置 用描述空間一點的變換方法來描述物體在空間的位置和方向。 先變換的矩陣乘在右邊。 A p = B p + A p B o {}^{A}p={}^{B}p+{}^{A}p_{B_{o}} A p = B p + A p B o ? ? 從

    2024年04月15日
    瀏覽(23)
  • 機(jī)器人TF坐標(biāo)系變換與一些可視化工具的應(yīng)用

    機(jī)器人TF坐標(biāo)系變換與一些可視化工具的應(yīng)用

    TF坐標(biāo) 在ROS中是一個非常重要的概念,因為機(jī)器人在做日常操作任務(wù)的時候,對于其所在 位置 和 朝向 是需要時刻知道的,而機(jī)器人是由很多 節(jié)點 組成的協(xié)同任務(wù),對于每個部件,我們需要知道它的 位姿(位置和朝向) ,這使得坐標(biāo)系就成為了一個很重要的問題。 TF的功能就

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包