QT&Opencv練習(一)

專業毀模二百年發表於2020-12-15

QT&Opencv練習(一)

使用QT實現最小二乘法擬合十組及以下資料的線性方程

mainwindow.cpp 檔案程式碼如下

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<QtDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

using namespace std;
void MainWindow::on_pushButton_clicked()
{
    QString fileName,fileNamePath;
    fileName = QFileDialog::getOpenFileName(this,tr("檔案"),"",tr("*.txt"));

    if(!fileName.isNull())
    {
        QFile file(fileName);
        if(!file.open(QFile::ReadOnly|QFile::Text))
        {
            QMessageBox::warning(this,tr("Error"),tr("read file error:&1").arg(file.errorString()));

            return;
        }
    }

    else{
        qDebug()<<"取消";//以上為讀檔案模組
        }
     QFileInfo OpenFileInfo;
     OpenFileInfo = QFileInfo(fileName);
     fileNamePath = OpenFileInfo.filePath();
     ui->label_2->setText(fileNamePath);
//以上為顯示檔名模組
     QFile file(fileName);
     double a[20],b[20],c[20],d[20];
     if(!file.open(QIODevice::ReadOnly))
         return;
         {
             QTextStream textstream(&file);
             QString line = textstream.readLine();
             QStringList s1;
             s1=line.split(" ");
                 //以空格為標準分割資料並將其輸入值陣列各位中
             ui->x1->setText(s1[0]);
             ui->x2->setText(s1[1]);
             ui->x3->setText(s1[2]);
             ui->x4->setText(s1[3]);
             ui->x5->setText(s1[4]);
             ui->x6->setText(s1[5]);
             ui->x7->setText(s1[6]);
             ui->x8->setText(s1[7]);
             ui->x9->setText(s1[8]);
             ui->x10->setText(s1[9]);
             line = textstream.readLine();
             QStringList s2;
             s2=line.split(" ");
             ui->y1->setText(s2[0]);
             ui->y2->setText(s2[1]);
             ui->y3->setText(s2[2]);
             ui->y4->setText(s2[3]);
             ui->y5->setText(s2[4]);
             ui->y6->setText(s2[5]);
             ui->y7->setText(s2[6]);
             ui->y8->setText(s2[7]);
             ui->y9->setText(s2[8]);
             ui->y10->setText(s2[9]);
             int iInt = 10;
      if(s1[0]==0 and s2[0]==0)
          iInt=0;
      else if(s1[1]==0 and s2[1]==0)
          iInt=1;
      else if(s1[2]==0 and s2[2]==0)
          iInt=2;
      else if(s1[3]==0 and s2[3]==0)
          iInt=3;
      else if(s1[4]==0 and s2[4]==0)
          iInt=4;
      else if(s1[5]==0 and s2[5]==0)
          iInt=5;
      else if(s1[6]==0 and s2[6]==0)
          iInt=6;
      else if(s1[7]==0 and s2[7]==0)
          iInt=7;
      else if(s1[8]==0 and s2[8]==0)
          iInt=8;
      else if(s1[9]==0 and s2[9]==0)
          iInt=9;

      for(int i=0;i<10;i++)
      {
          a[i] = s1[i].toDouble();//輸入進來的資料是string格式,需要用.toDouble函式轉換為double後才能夠賦予double陣列。
          b[i] = s2[i].toDouble();
      }
     double xy=0,x=0,xp=0,y=0;
     for (int i=0;i<iInt;i++)
        {
         double e =a[i]*b[i];
         xy=e+xy;
         double g=a[i];
         x=x+g;
         double j=a[i]*a[i];
         xp=j+xp;
         double l=b[i];
         y=l+y;
        }
     double n = iInt * xy - x * y;
     double o = iInt * xp - x * x;
     double p = xp * y - x * xy;
     double q = p / o;
     double r = n / o;
     ui->f1->setText(QString::number(r,'f',2));
     ui->f2->setText(QString::number(q,'f',2));
     ui->zushu->setText(QString::number(iInt));
     for(int i=0;i<iInt;i++)
     {
         c[i]=r*a[i]+q-b[i];
          d[i]=c[i]/b[i]*100;
     }
     ui->j1->setText(QString::number(c[0],'f',2));
     ui->j2->setText(QString::number(c[1],'f',2));
     ui->j3->setText(QString::number(c[2],'f',2));
     ui->j4->setText(QString::number(c[3],'f',2));
     ui->j5->setText(QString::number(c[4],'f',2));
     ui->j6->setText(QString::number(c[5],'f',2));
     ui->j7->setText(QString::number(c[6],'f',2));
     ui->j8->setText(QString::number(c[7],'f',2));
     ui->j9->setText(QString::number(c[8],'f',2));
     ui->j10->setText(QString::number(c[9],'f',2));
     ui->c1->setText(QString::number(d[0],'f',2)+'%');
     ui->c2->setText(QString::number(d[1],'f',2)+'%');
     ui->c3->setText(QString::number(d[2],'f',2)+'%');
     ui->c4->setText(QString::number(d[3],'f',2)+'%');
     ui->c5->setText(QString::number(d[4],'f',2)+'%');
     ui->c6->setText(QString::number(d[5],'f',2)+'%');
     ui->c7->setText(QString::number(d[6],'f',2)+'%');
     ui->c8->setText(QString::number(d[7],'f',2)+'%');
     ui->c9->setText(QString::number(d[8],'f',2)+'%');
     ui->c10->setText(QString::number(d[9],'f',2)+'%');
}

}

.pro檔案與main.cpp檔案內容不做改動。
該程式可以做到讀取*.txt檔案中的資料並進行擬合計算其線性方程,並可以計算擬合結果的絕對誤差與相對誤差。
在這裡插入圖片描述
使用QT的ui繪製功能所設計的程式介面,可以顯示出檔案所在位置、讀到的檔案組數、各組資料的X、Y值、所擬合的線性方程以及絕對誤差與相對誤差。

在這裡插入圖片描述
匯入十組資料後的計算結果。

相關文章