You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

808 lines
21 KiB

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QDateTime>
#include <QDesktopServices>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
initIns();
initUI();
initConnect();
//#if CLIENT==1
hideui();
//#endif
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initUI()
{
b_stat = true;
ui->pushButton_3->setChecked(true);
imageX = -10;
imageY = -10;
flip0 = false;
flip1 = false;
savevideo = false;
savebin = false;
savesbin = false;
shotimg = false;
shotbin = false;
fps = 0;
fpscount = 0;
path = QApplication::applicationDirPath()+"/";
setWindowTitle(QString::fromLocal8Bit("中芯热成上位机")+ QString(ProjectVersion));
setWindowIcon(QIcon("logo.ico"));
ui->splitter->setCollapsible(1,false);
// QHBoxLayout lout = QHBoxLayout();
ui->toolBar->addWidget(ui->pushButton);
ui->toolBar->addWidget(ui->pushButton_2);
ui->toolBar->addWidget(ui->label_2);
ui->toolBar->addWidget(ui->spinBox);
ui->toolBar->addWidget(ui->label_3);
ui->toolBar->addWidget(ui->spinBox_2);
m1 = new menu1();
m2 = new menu2();
m3 = new menu3();
m4 = new menu4();
m5 = new menu5();
ui->toolbox->addItem(m1,u8"相机设置");
ui->toolbox->addItem(m2,u8"算法设置");
ui->toolbox->addItem(m3,u8"显示设置");
ui->toolbox->addItem(m4,u8"保存设置");
#if CLIENT==2
ui->toolbox->addItem(m5,u8"多点校正");
#endif
type = gray16;
rows = ui->spinBox->value();
cols = ui->spinBox_2->value();
ui->scrollAreaWidgetContents->setMinimumSize(cols+20,rows+20);
ui->label->resize(cols,rows);
ui->tableWidget->horizontalHeader()->hide();
ui->tableWidget->verticalHeader()->hide();
ui->tableWidget->setRowCount(5);
ui->tableWidget->setColumnCount(5);
ui->tableWidget->resizeColumnsToContents();
ui->tableWidget->resizeRowsToContents();
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->label->installEventFilter(this);
lfps = new QLabel;
lpath = new HyperlinkLabel;
lpath->setText(QString::fromLocal8Bit("当前保存路径为")+path);
lpath->setUrl(QUrl(path));
ui->statusbar->addWidget(lfps);
ui->statusbar->addWidget(lpath);
b_con = false;
d_con = 1;
d_con_bright = 0;
}
void MainWindow::initConnect()
{
connect(ucontrol,SIGNAL(signalSendMessage(QString)),this,SLOT(slotlogtext(QString)));
connect(usb,SIGNAL(signalMessage(QString)),this,SLOT(slotlogtext(QString)));
connect(m1,SIGNAL(signalsetGPOL(int)),ucontrol,SLOT(setGPOL(int)));
connect(m1,SIGNAL(signalsetIT(double)),ucontrol,SLOT(setIT(double)));
connect(m1,SIGNAL(signalopenTEC(bool)),ucontrol,SLOT(tec(bool)));
connect(m1,SIGNAL(signalset14bit(bool)),ucontrol,SLOT(bit14(bool)));
connect(m1,&menu1::signalset14bit,[=](bool b){
if(b){
type = gray16;
usb->SetImageInfo(gray16,rows,cols);
}
else{
type = gray8;
usb->SetImageInfo(gray8,rows,cols);
}
});
#if CLIENT == 0 || CLIENT==1
connect(usb,SIGNAL(signalGetImage(cv::Mat)),this,SLOT(slotShowImage(cv::Mat)));
connect(m1,SIGNAL(signalsavelow()),ucontrol,SLOT(savelow()));
connect(m1,SIGNAL(signalsavehigh()),ucontrol,SLOT(savehigh()));
connect(m1,SIGNAL(signalcalck()),ucontrol,SLOT(calck()));
connect(m1,SIGNAL(signalsavek()),ucontrol,SLOT(savek()));
connect(m1,SIGNAL(signalopenk(bool)),ucontrol,SLOT(openk(bool)));
connect(m1,SIGNAL(signalonepoint()),ucontrol,SLOT(onepoint()));
connect(m1,SIGNAL(signalsaveb()),ucontrol,SLOT(saveb()));
connect(m1,SIGNAL(signalopenb(bool)),ucontrol,SLOT(openb(bool)));
connect(m2,SIGNAL(signalsag(bool)),ucontrol,SLOT(setsag(bool)));
connect(m2,SIGNAL(signalsetDDE(int)),ucontrol,SLOT(setDDE(int)));
connect(m2,SIGNAL(signalsetkf(int)),ucontrol,SLOT(setkf(int)));
connect(m2,SIGNAL(signalsethist(int)),ucontrol,SLOT(sethist(int)));
#elif CLIENT==2
// connect(usb,SIGNAL(signalGetImage(cv::Mat)),m_tp,SLOT(slotprocimg(cv::Mat)));
// connect(m_tp,SIGNAL(signalsendimg(cv::Mat)),m_avg,SLOT(slotprocimg(cv::Mat)));
connect(usb,SIGNAL(signalGetImage(cv::Mat)),m_mp,SLOT(runData(cv::Mat)));
connect(m_mp,SIGNAL(signalsendimg(cv::Mat)),m_avg,SLOT(slotprocimg(cv::Mat)));
connect(m_avg,SIGNAL(signalsendimg(cv::Mat)),m_bila,SLOT(slotprocimg(cv::Mat)));
connect(m_bila,SIGNAL(signalsendimg(cv::Mat)),m_sagauss,SLOT(slotprocimg(cv::Mat)));
connect(m_sagauss,SIGNAL(signalsendimg(cv::Mat)),m_dde,SLOT(slotprocimg(cv::Mat)));
connect(m_dde,SIGNAL(signalsendimg(cv::Mat)),m_clhe,SLOT(slotprocimg(cv::Mat)));
connect(m_clhe,SIGNAL(signalsendimg(cv::Mat)),this,SLOT(slotShowImage(cv::Mat)));
connect(m1,&menu1::signalsavelow,[=](){
m_tp->savelow();
});
connect(m1,&menu1::signalsavehigh,[=](){
m_tp->savehigh();
});
connect(m1,&menu1::signalcalck,[=](){
m_tp->calc();
});
connect(m1,&menu1::signalsavek,[=](){
m_tp->savek();
});
connect(m1,&menu1::signalsaveb,[=](){
m_tp->saveb();
});
connect(m1,&menu1::signalonepoint,[=](){
m_tp->onepoint();
});
connect(m1,&menu1::signalopenk,[=](bool b){
if(b){
m_tp->loaddata();
m_tp->on(cv::Size(cols,rows));
}
else{
m_tp->off();
}
});
connect(m2,&menu2::signalsag,[=](bool b){
if(b){
m_sagauss->setpara(3,0);
m_sagauss->on();
}
else{
m_sagauss->off();
}
});
connect(m2,&menu2::signalbila,[=](bool b){
if(b){
m_bila->setparas(5,10000,10);
}
else{
m_bila->off();
}
});
connect(m2,&menu2::signalsetDDE,[=](int value){
m_dde->setpara(value/512.0);
});
connect(m2,&menu2::signalsetkf,[=](int value){
m_avg->setpara(value);
});
connect(m2,&menu2::signalsethist,[=](int value){
m_clhe->setthreshold(value);
});
connect(m5,SIGNAL(signalsave()),m_mp,SLOT(save()));
connect(m5,SIGNAL(signalcalc(QVector<double>)),m_mp,SLOT(calcData(QVector<double>)));
connect(m5,SIGNAL(signalsavedata(QString)),m_mp,SLOT(savedata(QString)));
connect(m_mp,SIGNAL(signalNewFrame(double)),m5,SLOT(slotRefresh(double)));
connect(m5,SIGNAL(signalloaddata(QString)),m_mp,SLOT(loaddata(QString)));
connect(m5,SIGNAL(signaloff()),m_mp,SLOT(off()));
#endif
connect(m2,&menu2::signalsetDE,[=](bool b){
b_con = b;
});
connect(m2,&menu2::signalseterate,[=](double rate){
d_con = rate;
});
connect(m2,&menu2::signalsetbright,[=](int value){
d_con_bright = value;
});
connect(m3,&menu3::signalflip0,[=](bool b){
flip0 = b;
});
connect(m3,&menu3::signalflip1,[=](bool b){
flip1 = b;
});
connect(m3,&menu3::signalturnl,[=](){
turnl = true;
turnf = false;
turnr = false;
});
connect(m3,&menu3::signalturnf,[=](){
turnl = false;
turnf = true;
turnr = false;
});
connect(m3,&menu3::signalturnr,[=](){
turnl = false;
turnf = false;
turnr = true;
});
connect(m3,&menu3::signalcolorgray,[=](){
colortype =0;//gray
});
connect(m3,&menu3::signalcolorsub,[=](){
colortype = 1;//sub
});
connect(m3,&menu3::signalcolorrgb,[=](){
colortype = 2;
});
qDebug()<<__LINE__;
connect(m4,&menu4::signalsetdir,[=](QString dir){
if(dir == ""){
path = QApplication::applicationDirPath()+"/";
}
else{
path = dir+"/";
}
lpath->setText(QString::fromLocal8Bit("当前保存路径为")+path);
lpath->setUrl(QUrl(path));
});
connect(m4,&menu4::signalshotimg,[=](){
shotimg = true;
});
connect(m4,&menu4::signalshotbin,[=](){
shotbin = true;
});
connect(m4,&menu4::signalsavevideo,[=](bool b){
if(b){
if(fps<10)
slotlogtext(QDateTime::currentDateTime().toString()+ QString::fromLocal8Bit(":当前帧率不稳定,请确保帧率稳定后再保存视频"));
QString now = QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss");
std::string filename = path.toStdString()+now.toStdString()+".mp4";
writer = new cv::VideoWriter(filename,cv::VideoWriter::fourcc('M','P','4','V'),fps,cv::Size(cols,rows),false);
QString msg = now +QString::fromLocal8Bit( "开始保存视频");
slotlogtext(msg);
savevideo =true;
}
else{
if(!savevideo)
return;
savevideo = false;
writer->release();
QDateTime t = QDateTime::currentDateTime();
QString msg = t.toString() +QString::fromLocal8Bit( "结束保存视频");
slotlogtext(msg);
}
});
connect(m4,&menu4::signalsavebin,[=](bool b){
if(b){
QString now = QDateTime::currentDateTime().toString("/yyyy-MM-dd-hh-mm-ss");
QString filename = path+now;
if(type == gray8)
filename += "8bit.bin";
else if(type == gray16)
filename += "14bit.bin";
purefile = new QFile(filename);
purefile->open(QIODevice::ReadWrite);
savebin = true;
QString msg = now +QString::fromLocal8Bit( "开始保存数据");
slotlogtext(msg);
}
else{
savebin = false;
purefile->close();
QString now = QDateTime::currentDateTime().toString("/yyyy-MM-dd-hh-mm-ss");
QString msg = now +QString::fromLocal8Bit( "结束保存数据");
slotlogtext(msg);
}
});
connect(m4,&menu4::signalsavesbin,[=](int frames){
if(savesbin)
return;
QString now = QDateTime::currentDateTime().toString("/yyyy-MM-dd-hh-mm-ss");
QString filename = path+now;
if(type == gray8)
filename += "8bit.bin";
else if(type == gray16)
filename += "14bit.bin";
spurefile = new QFile(filename);
spurefile->open(QIODevice::ReadWrite); sbinnum = frames;
savesbin = true;
});
connect(lpath,&QPushButton::clicked,[=](){
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
});
}
void MainWindow::hideui()
{
m1->hideui();
m2->hideui();
}
void MainWindow::on_pushButton_clicked()// 开启传输
{
if(ui->pushButton->isChecked()){
QTimer *t = new QTimer;
connect(t,&QTimer::timeout,[=](){
on_pushButton_2_clicked();
usb->SetImageInfo(type,rows,cols);
usb->setStatu(true);
usb->start();
ui->pushButton->setText(u8"停止传输");
t->stop();
});
t->start(2000);
ui->label->setText(QString::fromLocal8Bit("开启传输中,请等待"));
}
else{
usb->setStatu(false);
usb->stopProcessData();
ui->pushButton->setText(u8"开始传输");
}
}
void MainWindow::on_pushButton_2_clicked()
{
ucontrol->bit14(true);
usb->SetImageInfo(type,rows,cols);
m1->opentec();
ucontrol->tec(true);
#if CLIENT == 0 || CLIENT == 1
ucontrol->setIT(5.0);
ucontrol->setGPOL(800);
ucontrol->openk(true);
ucontrol->openb(true);
#elif CLIENT == 2
ucontrol->openk(false);
ucontrol->openb(false);
#endif
}
void MainWindow::on_pushButton_3_clicked()
{
b_stat = ui->pushButton_3->isChecked();
if(b_stat){
ui->pushButton_3->setText(u8"暂停统计");
}
else{
ui->pushButton_3->setText(u8"开始统计");
}
}
void MainWindow::slotShowImage(cv::Mat img)
{
fpscount +=1;
if(flip0){
cv::flip(img,img,0);
}
if(flip1){
cv::flip(img,img,1);
}
if(savebin){
purefile->write((char*)img.data,img.total()*img.elemSize());
purefile->flush();
}
if(savesbin){
if(sbinnum>0){
spurefile->write((char*)img.data,img.total()*img.elemSize());
spurefile->flush();
}
sbinnum -=1;
if(sbinnum == 0){
spurefile->close();
savesbin = false;
}
}
if(turnl){
}
else if(turnr){
}
if(b_con){
cv::Mat image;
img.convertTo(image,CV_32SC1);
double avg = cv::mean(image).val[0];
cv::Mat dst = cv::Mat(512,640,CV_16UC1);
int s,d;
for(int i = 0;i<image.rows;i++){
for (int j = 0; j< image.cols;j++){
s = image.at<int>(i,j) - avg;
d = s*d_con+avg+d_con_bright*4;
if(d<0)d = 0;
if(d>65535) d = 65535;
dst.at<ushort>(i,j) = d;
}
}
img = dst;
}
if(b_stat ){
if(img.type() == CV_16UC1)
lastimage = img/4;
else
lastimage = img;
if( imageX>=0 && imageX<img.cols && imageY>=0 && imageY< img.rows){
int r = 2;
int lmask[25] = {0};
int ldata[25] = {0};
for (int i = -r;i<=r;i++){
for (int j = -r;j<=r;j++){
int row = i+imageY;
int col = j+imageX;
if(row<0 || row>=lastimage.rows|| col<0 || col>=lastimage.cols){
ui->tableWidget->setItem(i+r,j+r,new QTableWidgetItem());
}
else{
lmask[(i+r)*(2*r+1)+(j+r)] = 1;
if(lastimage.type() == CV_16UC1){
QTableWidgetItem *item = new QTableWidgetItem(QString::number(lastimage.at<ushort>(row,col)));
int gray = lastimage.at<ushort>(row,col)/64/2+64;
item->setBackground(QColor(gray,gray,gray));
ui->tableWidget->setItem(i+r,j+r,item);
ldata[(i+r)*(2*r+1)+(j+r)] = lastimage.at<ushort>(row,col);
}
else{
QTableWidgetItem *item = new QTableWidgetItem(QString::number(lastimage.at<uchar>(row,col)));
int gray = lastimage.at<uchar>(row,col)/2+64;
item->setBackground(QColor(gray,gray,gray));
ui->tableWidget->setItem(i+r,j+r,item);
ldata[(i+r)*(2*r+1)+(j+r)] = lastimage.at<uchar>(row,col);
}
}
}
}
double sum = 0;
double msum = 0;
double sum2 = 0;
for(int i = 0; i< 25;i++){
sum+= lmask[i]*ldata[i];
msum += lmask[i];
sum2 += lmask[i]*ldata[i]*ldata[i];
}
if(msum!=0){
double avg = sum/msum;
double SIGMA = sum2/msum - avg*avg;
double sigma = sqrt(SIGMA);
ui->lineEdit->setText(QString::number(imageX));
ui->lineEdit_2->setText(QString::number(imageY));
ui->lineEdit_3->setText(QString::number(avg,'f',2));
ui->lineEdit_4->setText(QString::number(sigma,'f',2));
}
}
else{
ui->lineEdit->setText("");
ui->lineEdit_2->setText("");
ui->lineEdit_3->setText("");
ui->lineEdit_4->setText("");
}
int lows = 0;
int highs = 0;
double sum = 0;
double sum2 = 0;
double sigma = 0;
if(lastimage.type() == CV_16UC1){
for(int i = 0;i<lastimage.rows;i++){
for(int j = 0; j<lastimage.cols;j++){
int temp;
temp =lastimage.at<ushort>(i,j);
if(temp == 0){
lows+=1;
}
if(temp == 16383){
highs +=1;
}
sum += temp;
sum2+=temp*temp;
}
}
}
else{
for(int i = 0;i<lastimage.rows;i++){
for(int j = 0; j<lastimage.cols;j++){
int temp;
temp =lastimage.at<uchar>(i,j);
sum += temp;
sum2+=temp*temp;
}
}
}
int avg = sum/512/640;
sigma = sqrt( sum2/512/640 -avg*avg);
if(lastimage.type() == CV_16UC1){
ui->lineEdit_5->setText(QString::number(lows));
ui->lineEdit_6->setText(QString::number(highs));
}
else{
ui->lineEdit_5->setText("");
ui->lineEdit_6->setText("");
}
ui->lineEdit_7->setText(QString::number(avg,'f',2));
ui->lineEdit_8->setText(QString::number(sigma,'f',2));
}
if(img.type() == CV_16UC1)
{
img.convertTo(img,CV_8UC1,1.0/257);
}
QImage image(img.data,img.cols,img.rows,img.cols,QImage::Format_Grayscale8);
QPixmap pix = QPixmap::fromImage(image);
if(shotimg){
QString now = QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss");
QString imgfile = path+ now+".png";
cv::imwrite(imgfile.toLocal8Bit().toStdString(),img);
QString t =path+now+".tiff";
cv::imwrite(t.toLocal8Bit().toStdString(),img);
QString filename = path+now+".bin";
QFile file(filename);
file.open(QIODevice::NewOnly);
file.write((char*)img.data,img.total()*img.elemSize());
file.flush();
file.close();
shotimg = false;
}
if(shotbin){
QDateTime t = QDateTime::currentDateTime();
QString filename = path+ t.toString("yyyy-MM-dd-hh-mm-ss");
if(type == gray8)
filename+= "-8bit.bin";
else if(type == gray16)
filename+= "-14bit.bin";
QFile file(filename);
file.open(QIODevice::NewOnly);
file.write((char*)img.data,img.total()*img.elemSize());
file.flush();
file.close();
shotbin = false;
}
if(savevideo){
writer->write(img);
}
if(b_stat &(!b_fullscreen)){
QPainter p(&pix);
QPen pen = p.pen();
QPen npen(QColor(0xad,0x14,0x53));
npen.setWidth(4);
p.setPen(npen);
if(imageX>=0 && imageX<img.cols && imageY>=0 && imageY< img.rows){
p.drawLine(imageX-10,imageY,imageX+10,imageY);
p.drawLine(imageX,imageY-10,imageX,imageY+10);
}
p.setPen(pen);
}
if(b_fullscreen)
ui->label->setPixmap(pix.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
else
ui->label->setPixmap(pix);
}
void MainWindow::slotlogtext(QString msg)
{
ui->textBrowser->append(msg);
}
void MainWindow::slotlogstatus()
{
lfps->setText(QString::fromLocal8Bit("当前帧率为")+QString::number(fps));
}
bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
if(obj == ui->label && e->type() == QEvent::MouseButtonPress){
QMouseEvent* ev = static_cast<QMouseEvent*>(e);
imageX = ev->x();
imageY =ev->y();
return true;
}
if(obj == ui->label && e->type()== QEvent::MouseButtonDblClick){
b_fullscreen = !b_fullscreen;
if(b_fullscreen){
ui->label->setWindowFlag(Qt::Window);
ui->label->showFullScreen();
ui->label->setAlignment(Qt::AlignHCenter);
}
else{
ui->label->setWindowFlags(Qt::SubWindow);
ui->label->showNormal();
ui->label->setAlignment(Qt::AlignLeft|Qt::AlignTop);
}
return true;
}
return false;
}
void MainWindow::keyPressEvent(QKeyEvent *ev)
{
if(ev->key() == Qt::Key_A){
imageX-=1;
}
if(ev->key() == Qt::Key_D){
imageX+=1;
}
if(ev->key() == Qt::Key_W){
imageY-=1;
}
if(ev->key() == Qt::Key_S){
imageY+=1;
}
if((ev->modifiers() == Qt::ControlModifier) && (ev->key()== Qt::Key_A)){
m1->showui();
}
if((ev->modifiers() == Qt::ControlModifier) && (ev->key()== Qt::Key_Q)){
m1->hideui();
}
}
void MainWindow::initIns()
{
qRegisterMetaType<cv::Mat>("cv::Mat");
qRegisterMetaType<QVector<double>>("QVector<double>");
usb = new usbthread();
ucontrol = new usbcontrol();
QTimer* t = new QTimer(this);
connect(t,&QTimer::timeout,[=](){
fps = fpscount;
fpscount = 0;
slotlogstatus();
});
t->start(1000);
#if CLIENT == 2
m_avg = new avgfilter();
m_bila = new bila();
m_dde = new dde();
m_sagauss = new sagauss();
m_tp = new twoPoint();
m_clhe = new clhe();
m_mp = new MultiPoint();
#endif
}
void MainWindow::on_spinBox_valueChanged(int arg1)
{
rows = arg1;
ui->scrollAreaWidgetContents->setMinimumHeight(rows+20);
ui->label->resize(cols,rows);
}
void MainWindow::on_spinBox_2_valueChanged(int arg1)
{
cols = arg1;
ui->scrollAreaWidgetContents->setMinimumWidth(cols+20);
ui->label->resize(cols,rows);
}